如何在MATLAB中绘制常微分方程组解分量的导数曲线
问题原因
你遇到的报错是因为f1、f2都是定义在coupled函数内部的局部变量,MATLAB主工作区没有这些变量的定义,直接调用自然会提示变量未识别。你可以通过以下两种常用方法解决问题:
方法1:在主脚本手动计算导数
你可以直接在绘图前根据公式定义f1和f2,再计算需要的导数分量,代码如下:
% 接你之前的求解代码之后运行 % 定义和coupled函数内部规则一致的f1、f2,用点运算适配向量计算 f1 = 1./(t+1); f2 = 1./(t+2); % 计算两个目标导数分量 dwdt1 = z(:,2) - f1.*z(:,1); dwdt3 = z(:,4) - f2.*z(:,3); % 开启hold on叠加绘图 hold on plot(t, dwdt1, 'r--', t, dwdt3, 'b--') % 更新图例 legend('x(t)','y(t)','dx/dt','dy/dt')
方法2:直接调用coupled函数批量计算导数
如果不想手动重写公式避免出错,可以直接调用你已经写好的coupled函数,批量拿到所有时间点的导数向量:
% 接你之前的求解代码之后运行 % 批量计算所有时间点对应的导数 dwdt = arrayfun(@(ti, zi) coupled(ti, zi), t, num2cell(z,2), 'UniformOutput', false); dwdt = cell2mat(dwdt'); % 提取需要的两个分量 dwdt1 = dwdt(:,1); dwdt3 = dwdt(:,3); % 叠加绘图 hold on plot(t, dwdt1, 'r--', t, dwdt3, 'b--') legend('x(t)','y(t)','dx/dt','dy/dt')
这种方法的优势是后续如果你修改了coupled内部的导数公式,不需要同步修改主脚本的计算逻辑,不会出现两边公式不一致的问题。
内容的提问来源于stack exchange,提问作者Cris
相关产品推荐
相关产品推荐

