按文档里的要求写出一段matlab代码,绘制出来一个图
时间: 2024-12-13 07:20:37 浏览: 5
好的,根据文档中的要求,我将编写一个 MATLAB 代码来实现 Jacobi 迭代法和 Gauss-Seidel 迭代法求解线性方程组,并绘制出迭代过程中误差的变化曲线图。假设我们要解的线性方程组为:
\[ \begin{cases}
4x_1 + x_2 = 5 \\
x_1 + 4x_2 = 6
\end{cases} \]
初始向量 \( x^{(0)} = [0, 0]^T \),迭代终止条件为 \( \|x^{(k+1)} - x^{(k)}\| < 10^{-6} \)。
以下是 MATLAB 代码:
```matlab
% 定义系数矩阵 A 和常数向量 b
A = [4 1; 1 4];
b = [5; 6];
% 初始向量
x0 = [0; 0];
% 迭代终止条件
tolerance = 1e-6;
% Jacobi 迭代法
function [x_jacobi, errors_jacobi] = jacobi(A, b, x0, tol)
n = length(b);
x = x0;
x_new = zeros(n, 1);
errors_jacobi = [];
while true
for i = 1:n
sum = 0;
for j = 1:n
if j ~= i
sum = sum + A(i, j) * x(j);
end
end
x_new(i) = (b(i) - sum) / A(i, i);
end
error = norm(x_new - x);
errors_jacobi = [errors_jacobi, error];
if error < tol
break;
end
x = x_new;
end
x_jacobi = x;
end
% Gauss-Seidel 迭代法
function [x_gauss_seidel, errors_gauss_seidel] = gauss_seidel(A, b, x0, tol)
n = length(b);
x = x0;
errors_gauss_seidel = [];
while true
x_new = x;
for i = 1:n
sum1 = 0;
sum2 = 0;
for j = 1:i-1
sum1 = sum1 + A(i, j) * x_new(j);
end
for j = i+1:n
sum2 = sum2 + A(i, j) * x(j);
end
x_new(i) = (b(i) - sum1 - sum2) / A(i, i);
end
error = norm(x_new - x);
errors_gauss_seidel = [errors_gauss_seidel, error];
if error < tol
break;
end
x = x_new;
end
x_gauss_seidel = x;
end
% 调用函数并获取结果
[x_jacobi, errors_jacobi] = jacobi(A, b, x0, tolerance);
[x_gauss_seidel, errors_gauss_seidel] = gauss_seidel(A, b, x0, tolerance);
% 绘制误差变化曲线
figure;
plot(errors_jacobi, 'b-', 'LineWidth', 2);
hold on;
plot(errors_gauss_seidel, 'r--', 'LineWidth', 2);
xlabel('Iteration');
ylabel('Error');
legend('Jacobi', 'Gauss-Seidel');
title('Convergence of Iterative Methods');
grid on;
```
这段代码实现了以下功能:
1. 定义了线性方程组的系数矩阵 \( A \) 和常数向量 \( b \)。
2. 实现了 Jacobi 迭代法和 Gauss-Seidel 迭代法。
3. 调用了这两个函数并获取了每一步的误差。
4. 绘制了 Jacobi 迭代法和 Gauss-Seidel 迭代法的误差变化曲线图。
运行这段代码后,你将看到一张显示两种迭代方法收敛速度的图表。希望这对你有所帮助!
阅读全文