使用MATLAB的fplot合并参数化函数图时出现错误的问题
解决MATLAB fplot合并绘图报错的问题
咱们来一步步拆解你遇到的这个问题,先搞清楚错误根源,再给你几个可行的解决方案。
为什么会报错?
你单独调用fplot时没问题,但合并调用fplot(x_1(...), x_2(...))就报错,核心原因是你误解了fplot双输入参数的用法:
当fplot接收两个函数句柄时,它会把这两个函数当作参数方程来处理——第一个函数是x关于参数的表达式,第二个是y关于同一个参数的表达式,最终画出的是一条参数曲线,而不是两条独立的函数曲线。
另外你调用时的写法也有隐患:x_1([0.01 0.05 0.08],t,1)里的t其实是fplot自动传入的变量,但这种“部分填充参数”的写法在参数方程模式下会导致MATLAB无法正确解析变量,所以才抛出了Error updating ParameterizedFunctionLine的错误。
正确的合并绘图方法
如果你想在同一张图里同时画出x_1的三条曲线和x_2的三条曲线,有两种常用的方法:
方法1:用hold on依次绘制(最直观)
先画完一组曲线,打开绘图保持,再画另一组:
% 先定义好你的匿名函数 x_1 = @(A,t,C_prey)C_prey*exp(t*A); x_2 = @(B,t,C_prey,C_predator)C_prey*exp(t*(-B*C_predator)); % 绘制x_1的三条曲线 fplot(@(t)x_1(0.01, t, 1), [0, 0.1]) hold on % 开启绘图保持,让后续曲线叠加在同一张图上 fplot(@(t)x_1(0.05, t, 1), [0, 0.1]) fplot(@(t)x_1(0.08, t, 1), [0, 0.1]) % 绘制x_2的三条曲线 fplot(@(t)x_2(0.01, t, 1, 1), [0, 0.1]) fplot(@(t)x_2(0.05, t, 1, 1), [0, 0.1]) fplot(@(t)x_2(0.08, t, 1, 1), [0, 0.1]) hold off % 关闭绘图保持 legend('x_1(A=0.01)','x_1(A=0.05)','x_1(A=0.08)','x_2(B=0.01)','x_2(B=0.05)','x_2(B=0.08)')
方法2:打包函数句柄数组一次性绘制(MATLAB R2019b+适用)
如果你的MATLAB版本比较新,可以把所有要画的函数句柄放进数组里,一次性传给fplot:
x_1 = @(A,t,C_prey)C_prey*exp(t*A); x_2 = @(B,t,C_prey,C_predator)C_prey*exp(t*(-B*C_predator)); % 固定常数参数 C_prey = 1; C_predator = 1; % 创建包含所有曲线的函数句柄数组 plot_funcs = [ @(t)x_1(0.01, t, C_prey), @(t)x_1(0.05, t, C_prey), @(t)x_1(0.08, t, C_prey), @(t)x_2(0.01, t, C_prey, C_predator), @(t)x_2(0.05, t, C_prey, C_predator), @(t)x_2(0.08, t, C_prey, C_predator) ]; % 一次性绘制所有曲线 fplot(plot_funcs, [0, 0.1]) legend('x_1(A=0.01)','x_1(A=0.05)','x_1(A=0.08)','x_2(B=0.01)','x_2(B=0.05)','x_2(B=0.08)')
补充:如果你确实想画参数曲线
如果你其实是想绘制以t为参数的参数曲线(即每个t对应一个(x,y)点,x是x_1的结果,y是x_2的结果),那需要把两个函数都改成只接受t的句柄:
x_1 = @(A,t,C_prey)C_prey*exp(t*A); x_2 = @(B,t,C_prey,C_predator)C_prey*exp(t*(-B*C_predator)); % 固定所有非t的参数,生成只接受t的函数句柄 x_param_func = @(t)x_1(0.01, t, 1); y_param_func = @(t)x_2(0.01, t, 1, 1); % 绘制参数曲线 fplot(x_param_func, y_param_func, [0, 0.1])
这种方式画出的是一条曲线,而不是多条函数曲线,适合你需要展示两个函数随t变化的对应关系时使用。
内容的提问来源于stack exchange,提问作者Physkid




