Jacobi迭代法的思想及C语言编程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
k++;
continue;
}
}
}
void main()
{
double A[N][N]={{8,-3,2},{4,11,-1},{6,3,12}},x[N]={0},b[N]={20,33,36};
Jacobi(A,x,b,1e-6);
} 程序运行结果:
迭代 17 次达到所需精度 10-6
下面是 Jacobi 迭代的 C 语言编程实例,程序功能是求解线性方程组 Ax=b,要求迭代精度小于 10-6。其中
⎡8 −3 2 ⎤ ⎡ x1⎤ ⎡20⎤
A = ⎢⎢4
11
−1⎥⎥
,
x
=
⎢ ⎢
x
⎥ 2⎥
,
b
=
⎢⎢33⎥⎥
⎢⎣6 3 12⎥⎦ ⎢⎣ x3⎥⎦ ⎢⎣36⎥⎦
#include<stdio.h>
Jacobi 迭代法
(1)Jacobi 迭代法的思想
Jacobi 迭代法的具体算法如下:
对方程组 Ax=b,其中 A 为非奇异矩阵。设 aii ≠ 0(i = 1, 2,", n) ,并将 A 写为三部分:
⎡a11 ⎢
A
=
⎢ ⎢
⎢
⎣
a22
%
⎡0
⎤ ⎥
⎢ ⎢
−a21
⎥−⎢ #
⎥
ann
⎥ ⎦
⎢ ⎢
−an
k=1;
//k 为迭代次数
while(1)
{
for(i=0;i<=N-1;i++)
{
sum=0;
for(j=0;j<=N-1;j++)
{
if(j!=i)
sum+=A[i][j]*x2[j];
}
x[i]=(b[i]-sum)/A[i][i]; //以 x2 为基础进行迭代求出 x
}
//输出每一次迭代的结果 printf("第%d 次迭代:\n",k);
#include<math.h>
#include<iostream.h>
#define N 3
double Compare(double a[N],double b[N])
{
double c=0;
int i;
for(i=0;i<=N-1;i++)
c+=fabs(a[i]-b[i]);
return c;
即 x = D−1(L + U )x + D−1b
所以解 Ax=b 的基本迭代公式为
∑ ⎧
⎪⎪ ⎨ ⎪ ⎪⎩
x(0) = x(k +1)
i
(
x(0) 1
= (bi
,",
x(0) n
),
n
−
aij
x
(k j
j =1
j≠i
)
)
/
aii (i
= 1, 2,", n)(k
=
0,1,").
(2)Jacobi 迭代法的 C 语言编程
}
void Jacobi(double A[N][N],double x[N],double b[N],double precesion)
{
int i,j,k;
double x2[N],sum;
for(i=0;i<=N-1;i++)
x2[i]=x[i];
//将初始迭代向量 x=[0,0,0,0]赋给 x2
{
printf("达到迭代精度的方程组的解为:\n");
printf("x= ");
for(i=0;i<=N-1;i++)
printf("%lf ",x[i]);
printf("\n");
break;
}
else
{
for(i=0;i<=N-1;i++)
x2[i]=x[i];
//将第 k 次迭代计算得到的向量 x 赋给 x2
printf("x2= ");
for(i=0;i<=N-1;i++)
printf("%lf ",x2[i]);
printf("\n");
printf("x= ");
for(i=0;i<=N-1;i++)
printf("%lf ",x[i]);
printf("\n");
//判断是否达到迭代精度
if(Compare(x2,x)<=precesion)
−1,1
⎢⎣ −an1
0 #
−an−1,2 −an2
% " "
0 −an,n−1
⎤ ⎡0 ⎥⎢ ⎥⎢ ⎥−⎢ ⎥⎢ ⎥⎢ 0⎥⎦ ⎢⎣
−a12 0
" " %
−a1,n−1 a2,n−1
#
0
−a1n ⎤
−a2n
⎥ ⎥
#⎥
−an−1,n
⎥ ⎥
பைடு நூலகம்
0 ⎥⎦
= D − L−U
于是 Ax = b ⇔ (D − L −U )x = b