求解ODE绘图报错:索引超出矩阵维度问题求助
解决MATLAB中ODE扰动解绘图的“索引超出矩阵维度”错误
我帮你排查了代码里的问题,核心错误出在绘图环节,另外还有一些冗余定义可以优化:
错误原因分析
- 你在循环里用
plot(ys2, 'b')来绘制扰动解,但ys2是字符串形式的符号表达式,plot函数只能处理数值数组,它会把字符串当成数组索引去解析,这就直接触发了“索引超出矩阵维度”的报错。 - 代码里的
double eps;和syms ys1 ys2属于冗余定义,完全没必要保留,不会影响计算但会增加代码混乱。
修正后的完整代码
clear all; close all; clc; syms y(x) % 求解解析解 ode = diff(y) + y - sin(x) - cos(x) == 0; cond1 = y(0) == 1; ySol1(x) = dsolve(ode, cond1); ys1 = char(ySol1(x)); fprintf('The analytical solution is %s\n', ys1); % 绘图 figure fplot(ySol1, 'r', 'LineWidth', 1.5); % 直接用符号函数绘图,无需转char hold on % 循环求解并绘制扰动解 for eps = -1:0.1:1 cond2 = y(0) == 1 + eps; ySol2(x) = dsolve(ode, cond2); ys2 = char(ySol2(x)); fprintf('The perturbed solution is %s\n', ys2); fplot(ySol2, 'b', 'LineWidth', 0.8); % 同样直接用符号函数绘图 end % 添加图的修饰(可选,提升可读性) xlabel('x'); ylabel('y(x)'); title('Analytical and Perturbed ODE Solutions'); legend('Analytical Solution', 'Perturbed Solutions', 'Location', 'best'); grid on; hold off
关键修正点说明
- 移除了冗余的
double eps;和syms ys1 ys2,让代码更简洁 - 把
plot(ys2, 'b')替换成fplot(ySol2, 'b'),直接使用dsolve返回的符号函数进行绘图,这才是MATLAB处理符号表达式绘图的正确方式 - 增加了线条宽度、坐标轴标签、图例和网格,让可视化结果更清晰
验证说明
你的ODE解析解是y(x) = sin(x) + exp(-x),扰动解是y(x) = sin(x) + (1+eps)*exp(-x),修正后的代码会正确输出所有解并绘制出对应的曲线,不会再出现索引错误。
内容的提问来源于stack exchange,提问作者Lexi Stark
相关产品推荐
相关产品推荐

