MATLAB Jacobi迭代法 求解线性方程组

本文详细介绍了雅克比迭代法的概念及其在求解线性方程组中的应用。通过公式推导展示了迭代过程,并提供了一个MATLAB代码示例,解释了如何编程实现Jacobi迭代法。在示例中,成功求解了一个3x3线性方程组,并达到了预设的精度要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录



前言

                                       雅克比(Jacobi)迭代法求解线性方程组


Jacobi迭代法是什么? 

简单的讲其实就是我们平时求解的方法(最常用的方法)

以下是Jacobi的迭代过程:

 

 


二、对应的编程思想以及公式推导


1.Jacobi迭代法 公式推导

线性方程组为:                         Ax=b

将A分裂:                          A=D+L+U         

从而得到迭代公式为:     x=-D^{-1}\left( L+U \right) x+D^{-1}b

由于D为对角元素,从而有:          D^{-1}=\frac{1}{D}

即编程语言可以写为:       x=-\left( L+U \right) *x/D+b/D

推到过程为:

                                            Ax=b \\\ \\ A=D+L+U \\\ D=\left( \begin{matrix} a_{11}& & & \\ & a_{22}& & \\ & & \ddots& \\ & & & a_{nn}\\ \end{matrix} \right) \ \\\L=\left( \begin{matrix} 0& & & \\ a_{21}& 0& & \\ \vdots& & \ddots& \\ a_{n1}& \cdots& a_{nn-1}& 0\\ \end{matrix} \right) \ \\\ U=\left( \begin{matrix} 0& a_{12}& \cdots& a_{1n}\\ & 0& & a_{2n}\\ & & \ddots& \vdots\\ & & & 0\\ \end{matrix} \right) \\\ Ax=\left( D+L+U \right) x=b \\\ Dx=-\left( L+U \right) x+b \\\ x=-D^{-1}\left( L+U \right) x+D^{-1}b


2.Jacobi迭代法求解线性方程组 例子

 

 

 

3.Jacobi迭代法 编程实现

完整程序代码为:

function [x,error,iter]=GJJacobi_solve(A,b,epsilon,max_iter)
% x , error , iter 为输出变量     A ,b epsilon,max_iter为输入变量
n=length(b);
x=zeros(n,1);
% 首先编写第一步代码目的  x =-(L+U)*x/D+b/D
%第二部明确符号的意义 D表示对角线的元素 L表示下三角的元素 U表示上三角的元素 b表示列向量的长度
%确定误差error = norm(x-y)

%输入矩阵A 以及 列向量b


%表示L  U  D
L=tril(A); %tril(A)表示取矩阵A的下三角元素,  包含了对角线元素
U=triu(A); %triu(A) 表示取矩阵A的上三角元素,  包含了对角线元素
D=diag(diag(A)); %表示取矩阵A的主对角元素



%想办法使得L,U对角线元素都为0
                             % L(logical(eye(size(L))))=0; %由于维度不对,从而只是等号右边为零不对
                             %  U(logical(eye(size(U))))=0;
%改正
                              %B =  zeros(1,n);              %[0,0,0]
L(logical(eye(size(L))))=0;   %[8;11;12]
U(logical(eye(size(U))))=0;

                             

%需要看看是否输出的是对角线元素为0
disp(L)
disp(U)







% 先写一个循环(发现运用一个变量时需要先初始化error=1)
% 设置最小误差为10e-6
error = 1 ;%初始化误差变量
iter = 0;  %初始化迭代步数变量
while error>epsilon && iter<max_iter % 给出循环条件,以及函数输入变量epsilon,max_iter
    for i =1:max_iter
        y=x;%迭代前的矩阵,用来计算迭代误差
        x=-D\(L+U)*x+D\b ;  %从这里知道需要把L,U,D,b表示出来 x=-(L+U)*x/D+b/D 这个维度错误
        error=norm(x-y);  %知道迭代前的数据y,以及迭代后的数据x,设定误差为(x-y)的范数
        
        if error>epsilon %给出判断误差是否减小
            iter =iter+1;
            break
        end     %if 需要 end 结束
    end         %for 需要 end 结束
end             %while 需要 end 结束

测试代码为:

 A=[8 -3 2
    4 11 -1
    6 3 12];
b=[20;33;36];
epsilon=10e-6;
max_iter=15;
[x,error,iter]=GJJacobi_solve(A,b,epsilon,max_iter);
disp('程序计算的精确解为:');
disp(x);
disp('最大迭代次数下的误差:');
disp(error);
disp('最小迭代次数:');
disp(iter+1);

运行结果为:

     0     0     0
     4     0     0
     6     3     0

     0    -3     2
     0     0    -1
     0     0     0

程序计算的精确解为:
    3.0000
    2.0000
    1.0000

最大迭代次数下的误差:
   4.1060e-12

最小迭代次数:
    14



总结

以上就是今天要讲的内容,本文仅仅简单介绍了雅克比迭代求解线性方程组

Matlab是一种强大的数学软件,其中包含了一种名为Jacobi迭代法的数值求解线性方程组的方法。这种方法适用于大型稀疏矩阵,特别是当LU分等直接方法不适合时。以下是使用Jacobi迭代的基本步骤: 1. **定义系统**:给定一个线性方程组 Ax = b,其中A是一个n x n的矩阵,x和b是列向量。 2. **初始猜测**:选择一个初始估计值x0,通常可以设置为零向量或随机值。 3. **迭代过程**:对于每个元素i,应用以下公式计算新的迭代值xi+1: - xi+1_i = (b_i - Aii * xi) / Aii 其他元素保持不变,即 xi+1_j = xi_j (j ≠ i) 4. **停止条件**:直到满足一定的收敛准则,比如迭代次数达到预定的最大值、绝对误差小于某个阈值或相对误差减小到一定比例,或者两连续迭代结果之间的差异足够小。 5. **返回结果**:最终得到的x_n就是迭代的近似值。 在Matlab中,你可以使用`jacobi(A, b)`函数或者自定义循环来实现这个过程,例如: ```matlab [x, info] = jacobi(A, b); ``` `info`变量会提供一些关于迭代过程的信息。如果你想要自定义迭代,可以用for循环进行: ```matlab tol = 1e-6; % 设置一个收敛阈值 maxiter = 1000; % 设置最大迭代次数 x = zeros(size(b)); % 初始化 for iter = 1:maxiter x_new = zeros(size(x)); for i = 1:n x_new(i) = (b(i) - A(i,i)*x(i)) / A(i,i); % 更新当前元素 end if norm(x_new - x) < tol * norm(x) break; % 如果满足收敛条件,则退出 end x = x_new; end ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值