矩阵雅克比迭代算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
雅克比迭代
实验目的:
1.学习和掌握线性代数方程组的jacobi 迭代法。
2.运用jacobi 迭代法进行计算。
方法原理:
设方程组Ax=b 的系数矩阵A 非奇异而且),...,2,1(0n i a ii =≠,将A 分裂为 A=D+L+U,可以使计算简便。其中),,...,,(2211nn a a a diag D =
⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=
0...
............0...00 (002)
1
21n n a a a L ,⎥⎥⎥⎥⎦
⎤
⎢⎢⎢⎢⎣⎡=0...
...............00...02112n
n a a a U A=D+L+U ,其中),,...,,(2211nn a a a diag D =
⎥⎥⎥⎥⎦⎤⎢⎢⎢
⎢⎣⎡=0...
............0...00 (002)
1
21
n n a a a L ,⎥⎥⎥⎥⎦
⎤
⎢⎢⎢⎢⎣⎡=0...
...............00...02112n
n a a a U 将方程组
n ,...,2,1i ,b x a i n
1j j ij ==∑
=乘以
ii
a 1,得到等价的方程组
⎪⎪⎪
⎭
⎫ ⎝
⎛-
=∑
≠=n
i
j 1
j j ij i ii i x a b a 1x ,i=1,2,…n ,简记为x Bx f
=+。
其中 11()B I D A D L U --=-=-+, 1f D b -=. 我们称
x Bx f ϕ=+为迭代函数。任取初始向量(0)
x x
=,按照
(1)
(
)
k k x
Bx f
+=+形成迭代格式,称这种迭代方法为Jacobi 迭代法。
算法描述:
Step1:给定一组x ,即初值。 Step2:用for 循环计算:
x[k+1]=(b[i]-∑∑+=-=-
n
1
i j 1
i 1
j ]j [x ]j ][i [a ]j [x ]j ][i [a )/a[i][i].
Step3:当fabs(x[k+1]-x[k]) 程序代码: 头文件: #include typedef double Datatype; class Matrix { private: Datatype **ar; int M; int N; public: Matrix(int a=0,int b=0); Matrix(Matrix &A); ~Matrix(); void print(); void Init(); void Jacobi(Matrix b,Matrix x,Matrix &xx); bool compare(Matrix X); void change(Matrix xx); }; CPP文件: #include #include #include #include"Jacobi.h" #define E 0.0000001 #include Matrix::Matrix(int a,int b)///////////////////构造函数 { M=a; N=b; ar=(Datatype **)malloc(sizeof(Datatype *)*M); for(int i=0;i { ar[i]=(Datatype *)malloc(sizeof(Datatype)*N); for(int j=0;j { ar[i][j]=0; } } } Matrix::~Matrix()////////////////////////////析构函数 { for(int i=0;i { free(ar[i]); } free(ar); } Matrix::Matrix(Matrix &A) { M=A.M; N=A.N; Datatype **p=(Datatype **)malloc(sizeof(Datatype *)*M); for(int i=0;i { p[i]=(Datatype *)malloc(sizeof(Datatype)*N); for(int j=0;j { p[i][j]=A.ar[i][j]; } } ar=p; } void Matrix::print()////////////////////////打印函数 { for(int i=0;i { for(int j=0;j { cout< } cout< } } void Matrix::Init()/////////////////////////初始化函数 { for(int i=0;i { cout<<"请输入第"< for(int j=0;j {