MATLAB中如何在同一张图绘制不同长度的多组向量
解决方案:不同长度数值解与解析解的同图绘制问题
核心问题在于数值解的向量长度对应不同的网格点数,而解析解是连续函数——只需让解析解的取值点与数值解的网格点完全对齐,就能实现同图对比。以下是具体实现步骤和代码示例:
关键思路
- 为每个
n(50/2500)生成对应网格的x坐标向量,确保其长度与数值解usol完全一致 - 在该x网格点上计算解析解的取值,得到同长度的解析解向量
- 用
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
相关产品推荐
相关产品推荐

