线性方程组——Jacobi迭代和G_S迭代

1)方程组Ax=b


用简单迭代法(Jacobi迭代法)和G-S迭代法分别解方程组。精确到小数点后5位,最大迭代次数N=100,说明是否收敛

Jacobi迭代代码如下

Jacobi.m
function [x, k, index]=Jacobi(A, b, ep, it_max)
%求解线性方程组的Jacobi迭代法,其中
%  A ---方程组的系数矩阵
%  b ---方程组的右端项
%  ep ---精度要求。省缺为1e-5
%  it_max ---最大迭代次数,省缺为100
%  x ---方程组的解
%  k ---迭代次数
%  index --- index=1表示迭代收敛到指定要求;
%              index=0表示迭代失败
if nargin <4 it_max=100; end
if nargin <3 ep=1e-5; end
n=length(A); k=0;
x=zeros(n,1); y=zeros(n,1); index=1;
while 1
   for i=1:n       
       y(i)=b(i);
       for j=1:n
           if j~=i
               y(i)=y(i)-A(i,j)*x(j);
           end
       end
       if abs(A(i,i))<1e-10 | k==it_max
           index=0; return;
       end
       y(i)=y(i)/A(i,i);
   end
   if norm(y-x,inf)<ep
       break;
   end
   x=y; k=k+1;
end
G_S迭代代码如下

G_S.m
function [v,sN,vChain]=G_S(A,b,x0,errorBound,maxSp)
%Gauss-Seidel迭代法求解线性方程组
%A-系数矩阵 b-右端向量 x0-初始迭代点 errorBound-近似精度 maxSp-最大迭代次数
%v-近似解 sN-迭代次数 vChain-迭代过程的所有值
step=0;
error=inf;
s=size(A);
D=zeros(s(1));
vChain=zeros(15,3);%最多能记录15次迭代次数
k=1;
fx0=x0;
for i=1:s(1)
   D(i,i)=A(i,i);
end;
L=-tril(A,-1);
U=-triu(A,1);
while error>=errorBound & step<maxSp
x0=inv(D)*(L+U)*x0+inv(D)*b;
vChain(k,:)=x0';
k=k+1;
   error=norm(x0-fx0);
   fx0=x0;
   step=step+1;
end
v=x0;
sN=step;

主函数

clc,clear
A = [1 2 -2
    1 1 1
    2 2 1];
b = [1
    3
    5];
[x k index] = Jacobi(A,b)
x0 = [0
    0
    0];
errorBound = 1e-5;
maxSp = 100;
[aa bb cc] = G_S(A,b,x0,errorBound,maxSp)



(2)方程组Ax=b


这只不过就是把上个问题中的主函数里面的矩阵和向量换成本题向量罢了



  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用Jacobi代算法解六元线性方程组的C语言代码,该算法需要提供初始解、系数矩阵和右端向量。 ```c #include <stdio.h> #include <math.h> #define N 6 // 方程组的元数 #define MAX_ITER 1000 // 最大代次数 #define EPS 1e-5 // 代精度 void jacobi(double A[N][N], double b[N], double x[N]) { int i, j, k; double sum; double x_new[N]; // 存储新的解 for (k = 0; k < MAX_ITER; k++) { // Jacobi代 for (i = 0; i < N; i++) { sum = 0.0; for (j = 0; j < N; j++) { if (i != j) { sum += A[i][j] * x[j]; } } x_new[i] = (b[i] - sum) / A[i][i]; } // 判断是否达到代精度 sum = 0.0; for (i = 0; i < N; i++) { sum += pow(x_new[i] - x[i], 2.0); } if (sqrt(sum) < EPS) { break; } // 更新解 for (i = 0; i < N; i++) { x[i] = x_new[i]; } } } int main() { double A[N][N] = { {5.0, -2.0, 0.0, 0.0, 0.0, 0.0}, {-2.0, 5.0, -2.0, 0.0, 0.0, 0.0}, {0.0, -2.0, 5.0, -2.0, 0.0, 0.0}, {0.0, 0.0, -2.0, 5.0, -2.0, 0.0}, {0.0, 0.0, 0.0, -2.0, 5.0, -2.0}, {0.0, 0.0, 0.0, 0.0, -2.0, 3.0}}; double b[N] = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0}; double x[N] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; int i; jacobi(A, b, x); printf("Solution:\n"); for (i = 0; i < N; i++) { printf("x[%d] = %f\n", i, x[i]); } return 0; } ``` 在代码中,我们定义了一个jacobi函数来实现Jacobi代,其中A是系数矩阵,b是右端向量,x是初始解。在函数中,我们通过循环实现代过程,其中每次代都根据当前解计算新的解。在每次代结束后,我们判断是否达到了代精度,如果达到了,则直接退出代并输出结果。 在主函数中,我们定义了一个六元线性方程组的系数矩阵A和右端向量b,以及一个初始解x。然后,我们调用jacobi函数来求解方程组,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值