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

MATLAB中如何在同一张图绘制不同长度的多组向量

解决方案:不同长度数值解与解析解的同图绘制问题

核心问题在于数值解的向量长度对应不同的网格点数,而解析解是连续函数——只需让解析解的取值点与数值解的网格点完全对齐,就能实现同图对比。以下是具体实现步骤和代码示例:


关键思路

  1. 为每个n(50/2500)生成对应网格的x坐标向量,确保其长度与数值解usol完全一致
  2. 在该x网格点上计算解析解的取值,得到同长度的解析解向量
  3. 用plot函数将数值解与解析解同图绘制,通过样式区分不同方法

具体代码实现

情况1:数值解包含边界点(向量长度n对应0到1的n个均匀网格点)

% 处理n=50的情况
n = 50;
x = linspace(0, 1, n); % 生成0到1之间的n个均匀网格点
usol_direct = main(n); % 直接法求解得到的向量(长度n)
usol_jacobi = jacobi_solver(A_50, b_50); % Jacobi迭代法求解得到的向量(长度n)
y_analytic = -0.5*(x-1).*x; % 计算解析解在x网格点上的取值(长度n)

% 绘图
figure('Position', [100, 100, 800, 500]);
plot(x, usol_direct, 'r-', 'LineWidth', 1.5, 'DisplayName', '直接法(n=50)');
hold on;
plot(x, usol_jacobi, 'b--', 'LineWidth', 1.5, 'DisplayName', 'Jacobi迭代法(n=50)');
plot(x, y_analytic, 'k:', 'LineWidth', 2, 'DisplayName', '解析解');
legend('Location', 'best');
xlabel('x');
ylabel('y');
title('数值解与解析解对比(n=50)');
hold off;

% 处理n=2500的情况(代码逻辑一致)
n = 2500;
x = linspace(0, 1, n);
usol_direct = main(n);
usol_jacobi = jacobi_solver(A_2500, b_2500);
y_analytic = -0.5*(x-1).*x;

figure('Position', [100, 100, 800, 500]);
plot(x, usol_direct, 'r-', 'LineWidth', 1.5, 'DisplayName', '直接法(n=2500)');
hold on;
plot(x, usol_jacobi, 'b--', 'LineWidth', 1.5, 'DisplayName', 'Jacobi迭代法(n=2500)');
plot(x, y_analytic, 'k:', 'LineWidth', 2, 'DisplayName', '解析解');
legend('Location', 'best');
xlabel('x');
ylabel('y');
title('数值解与解析解对比(n=2500)');
hold off;

情况2:数值解仅包含内部点(向量长度n对应边界0/1之外的内部点)

如果你的数值解是差分法的内部点结果(不含边界),需要先补充边界值(通常为0),再生成对应网格:

n = 50; % 内部点数量
x_full = linspace(0, 1, n+2); % 总网格点包含边界,长度n+2
usol_direct_full = [0; usol_direct; 0]; % 补充边界0,长度n+2
usol_jacobi_full = [0; usol_jacobi; 0]; % 补充边界0,长度n+2
y_analytic = -0.5*(x_full-1).*x_full; % 解析解长度n+2

% 后续绘图逻辑与情况1一致
plot(x_full, usol_direct_full, ...);

进阶:将两种n的结果放在同一张图对比

如果需要在同一画布展示n=50和n=2500的差异,可使用子图:

figure('Position', [100, 100, 1200, 500]);
% 子图1:n=50
subplot(1, 2, 1);
x50 = linspace(0, 1, 50);
usol_direct50 = main(50);
usol_jacobi50 = jacobi_solver(A_50, b_50);
y_analytic50 = -0.5*(x50-1).*x50;
plot(x50, usol_direct50, 'r-', x50, usol_jacobi50, 'b--', x50, y_analytic50, 'k:');
legend('直接法(n=50)','Jacobi迭代法(n=50)','解析解');
title('n=50时的解对比');
xlabel('x'); ylabel('y');

% 子图2:n=2500
subplot(1, 2, 2);
x2500 = linspace(0, 1, 2500);
usol_direct2500 = main(2500);
usol_jacobi2500 = jacobi_solver(A_2500, b_2500);
y_analytic2500 = -0.5*(x2500-1).*x2500;
plot(x2500, usol_direct2500, 'r-', x2500, usol_jacobi2500, 'b--', x2500, y_analytic2500, 'k:');
legend('直接法(n=2500)','Jacobi迭代法(n=2500)','解析解');
title('n=2500时的解对比');
xlabel('x'); ylabel('y');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:45:44