当前位置:文档之家› 雅可比迭代法

雅可比迭代法


(1)
a22
, L =- ann
0 a21 a31 an1 0 a32 an 2 0 an ,n 1
0
0 U =-
a12 0
a13 a23
x 0 初始向量, k 1 B0 x k f , x
其中 B0 称为雅可比方法迭代矩阵。
二、算法框图
开始
输入 x0:;
开始迭代for(k=0; k<m; ++k)
false
for(i=0; i<n; ++i)
true
for(j=0; j<n; ++j)
true
2013-2014(1)专业课程实践论文
题目:雅可比迭代法
一、算法理论
设有方程组 aij x j bi (i 1,2..., n),
j 1 n
记作 Ax b,
A 为非奇异阵且 aij 0(i 1,2,..., n), 将 A 分裂为 A D L U ,其中
a11 D=
(2)
简记作 其中
x B0 x f ,
B0 I D 1 A D 1 L U , f D 1b.
对方程组(2)应用迭代法,得到解式(1)的雅可比迭代公式
x 0 x 0 , x 0 ,... x 0 t 初始向量, 1 2 n n 1 k 1 k bi aij x j , xi aii i 1 j i
if(j!=i)
false true tempห้องสมุดไป่ตู้= temp + a[i][j]*frovalue[j]; false
x[i] = ( b[i] - temp ) / a[i][i];
结束
三、算法程序
#include "stdlib.h" #include "stdio.h" #include "conio.h" #include "string.h" #include "math.h" #define N 100 void Table(int n,float a[N][N],float b[N]) { int i,j; float c[N][N]; printf("Please input the matrix A by row!\n"); for(i=0;i<n;i++) { printf("Row %d:",i+1); for(j=0;j<n;j++) scanf("%f",&a[i][j]); } printf("Please input the vector b:"); for(i=0;i<n;i++) scanf("%f",&b[i]); for(i=0;i<n;i++) for(j=0;j<n;j++) { if(i==j) { c[i][j]=0; continue; } c[i][j]=-a[i][j]/a[i][i]; } printf("\nThe matrix A and vector b:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%10.5f",a[i][j]); printf("%10.5f",b[i]); printf("\n");
0
a1n a2 n an 1,n 0
将式(1)第 i(i 1,2....n) 个方程用 aii 去除再移项,得到等价方程组
1 xi aii n bi aij x j i 1,2,..., n , j 1 j i
} printf("\nThe Jacobi iterative scheme:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%10.5f",c[i][j]); printf("%10.5f",b[i]/a[i][i]); printf("\n"); } } void init_vec(int n,float x[N]) { int i; printf("Please input the initial iteration vector x:"); for(i=0;i<n;i++) scanf("%f",&x[i]); printf("\nThe initial iteration vector x:\n"); for(i=0;i<n;i++) printf("%10.5f",x[i]); printf("\n"); } void jacobi(int n,float a[N][N],float b[N],float x[N]) { int i,j,k; float tmp,x2[N]; for(k=0;;k++) { for(i=0;i<n;i++) x2[i]=x[i]; for(i=0;i<n;i++) { tmp=0.0; for(j=0;j<n;j++) { if(j==i) continue; tmp+=a[i][j]*x2[j]; } x[i]=(b[i]-tmp)/a[i][i];


(3)
其中 x k x1k , x2k ,... xnk , 为第 k 次迭代向量。设 x k 已经算出,由式(3)可
T
k 1 计算下一次迭代向量 x k 0,1,2,...; i 1,2,..., n ,
显然迭代公式(3)的矩阵形式为
} for(i=0,j=0;i<n;i++) if(fabs(x2[i]-x[i])<0.00001) j++; if(j==n) { printf("\nThis Jacobi iterative scheme is convergent!\n"); printf("Number of iterations: %d",k+1); break; } if(k==499) { printf("\nThis Jacobi iterative scheme may be not convergent!"); break; } } printf("\nThe results:\n"); for(i=0;i<n;i++) printf("%12.7f",x[i]); } int main() { int n; float x[N],a[N][N],b[N]; printf("Input n:"); scanf("%d",&n); Table(n,a,b); init_vec(n,x); jacobi(n,a,b,x); getch(); return 0; }
相关主题