You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动