You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解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

关键修正点说明

  1. 移除了冗余的double eps;和syms ys1 ys2,让代码更简洁
  2. 把plot(ys2, 'b')替换成fplot(ySol2, 'b'),直接使用dsolve返回的符号函数进行绘图,这才是MATLAB处理符号表达式绘图的正确方式
  3. 增加了线条宽度、坐标轴标签、图例和网格,让可视化结果更清晰

验证说明

你的ODE解析解是y(x) = sin(x) + exp(-x),扰动解是y(x) = sin(x) + (1+eps)*exp(-x),修正后的代码会正确输出所有解并绘制出对应的曲线,不会再出现索引错误。

内容的提问来源于stack exchange,提问作者Lexi Stark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:28:18