矩阵雅克比迭代算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

{

相关文档
最新文档