如何根据x的不同取值代入对应方程绘制分段函数图像
分段函数绘制实现方案
常见出错原因
- 表达式存在笔误:原表达式包含全角减号、漏写乘号、重复幂次项问题,先做修正:第一个区间重复的
-5.6*(x^3)与-16.2*(x^3)合并为-21.8*x^3,重复的3.6*x^2与6.2*x^2合并为9.8*x^2;第二个区间1.2(x^2)补全乘号为1.2*x^2,所有全角符号替换为半角符号。 - 逻辑判断误用:直接对整个x向量做if判断时,MATLAB仅当向量内所有元素都满足判断条件才会进入分支,不会自动逐元素判断,导致结果不符合预期。
方案1:逻辑索引实现(推荐,无需循环)
该方法是MATLAB中处理分段函数的标准写法,代码简洁运行效率高:
dx = 0.1; x = 0:dx:30; f = zeros(size(x)); % 提前初始化函数值数组 % 匹配x<5的区间赋值 idx1 = x < 5; f(idx1) = 0.1.*x(idx1).^4 -21.8.*x(idx1).^3 +9.8.*x(idx1).^2 +11.5.*x(idx1) -9.8; % 匹配5<=x<20的区间赋值 idx2 = x >=5 & x <20; f(idx2) = 0.4.*x(idx2).^3 +1.2.*x(idx2).^2 +9.7.*x(idx2) -89.6; % 匹配x>=20的区间赋值 idx3 = x >=20; f(idx3) = 0.8.*x(idx3).^2 +8.9.*x(idx3) -8.2; % 绘制图像 plot(x,f,'LineWidth',1.5) xlabel('x') ylabel('f(x)') title('分段函数图像') grid on
方案2:for循环实现(对应你原有实现思路)
如果要使用if-elseif的循环写法,需要逐个取出x的元素做判断:
dx = 0.1; x = 0:dx:30; f = zeros(size(x)); % 提前初始化数组避免动态扩容,提升运行效率 for i = 1:length(x) xi = x(i); if xi < 5 f(i) = 0.1*xi^4 -21.8*xi^3 +9.8*xi^2 +11.5*xi -9.8; elseif xi >=5 && xi <20 f(i) = 0.4*xi^3 +1.2*xi^2 +9.7*xi -89.6; else f(i) = 0.8*xi^2 +8.9*xi -8.2; end end % 绘制图像 plot(x,f,'LineWidth',1.5) xlabel('x') ylabel('f(x)') title('分段函数图像') grid on
注意事项
- 对数组做逐元素运算时要使用点运算符
.^.*,避免触发矩阵运算规则报错。 - 所有运算符号都要使用半角输入,全角符号会被识别为非法字符。
内容的提问来源于stack exchange,提问作者helpplz1232
相关产品推荐
相关产品推荐

