基本思想:
对线性方程组AX=b的系数矩阵A可逆且主对角元素均不为0,令D=diag(a11,a22,a33,…ann),并将A分解成A=(A-D)+D,从而方程组可写为DX=(D-A)X+b,令X=B1X+f1,其中B1=I-AD-1,f1=bD-1,以B1为迭代矩阵的迭代法公式:X(k+1)=B1X(k)+f1,称为雅克比迭代法。
eg:
#include "stdafx.h"
#include<stdio.h>
#include<math.h>
int main()
{
/*x0[..]和x1[..]分别表示第k次和第k+1次迭代结果,且初始x[0]=0*/
double e,m,q,A[12][12],x0[12],x1[12];
int n,i,j,k;
printf("请输入方程组的阶数(小于等于10):\n");
scanf("%d",&n);
//存入增广矩阵
for(i=1;i<=n;i++)
{
printf("请输入增广矩的第%d行:\n",i);//逐行输入增广矩阵
for(j=1;j<=n+1;j++)
scanf("%lf",&A[i][j]);
x0[i]=0.0; //对x0[i]赋初值
}
//误差限输入
printf("请输入误差限e:\n");
scanf("%lf",&e);
/*按照迭代公式x1[i]=(A[i][n+1]-A[i][j]*x0[j)/A[i][i](1<=i<=n,j!=i,k=0,1,2,3...)计算求解*/
for(i=1;i<=n;i++)
{
m=0.0;
for(j=1;j<=i-1;j++)
m=m+A[i][j]*x0[j];
for(j=i+1;j<=n;j++)
m=m+A[i][j]*x0[j];
x1[i]=(A[i][n+1]-m)/A[i][i];
}
q=0.0;//q为x1[..]与x0[..]间的误差
for(i=1;i<=n;i++)
q=q+fabs(x1[i]-x0[i]); //控制精度
/*当不满足精度要求则执行迭代过程*/
while(q>e)
{
//更新第k次
for(i=1;i<=n;i++)
x0[i]=x1[i];
/*按照迭代公式x1[i]=(A[i][n+1]-A[i][j]*x0[j)/A[i][i](1<=i<=n,j!=i,k=0,1,2,3...)计算求解*/
for(i=1;i<=n;i++)
{
m=0.0;
for(j=1;j<=i-1;j++)//每一次加都是缺少主元素,我只能用两个循环来实现跳跃
m=m+A[i][j]*x0[j];
for(j=i+1;j<=n;j++)
m=m+A[i][j]*x0[j];
x1[i]=(A[i][n+1]-m)/A[i][i];
}
q=0.0;
for(i=1;i<=n;i++)
q=q+fabs(x1[i]-x0[i]);
}//while
printf("线性方程组的解为:\n");
for(i=1;i<=n;i++)
printf("x[%d]=%.4lf\n",i,x1[i]);
return 0;
}