矩阵doolittle分解算法

  • 格式:doc
  • 大小:83.50 KB
  • 文档页数:6

解线性方程组的Doolittle分解
目的意义:
1.学习和掌握线性代数方程组的Doolittle分解法。
2.运用Doolittle分解法进行计算。

方法原理:
n阶线性方程组的系数矩阵A非奇异且有分解式A=LR,其中L为单位下三角矩阵,R为上
三角矩阵,即L=(lij),当ij时,rij=0,矩阵A的这种分解方法
为Doolittle的分解。




nnnnnnnnnnnnrrrrrrlllaaaaaaaaa22211211212121
22221
11211

1
1

1

比较等号两边的第i行和第j列的元素,可知nkkjikijrla1,因为
0,11,ijjjiniirrll
,所以nkkjikijrla1=ijkjikikrrl11,i<=j,从而

.,1,,11niijrlar
ikkjikijij

当niij,2,1时,

iijiikikkjjkkjjkijrlrlrla111,从而nijrrlaliiikkijkjiji
,,1,/)(
11

,于是就得

到了计算LR分解的一般计算公式。
算法描述:

Setp1:利用for循环求出11kkikikppipralr,11()/kikikippkkkplalrr。
Step2:11iiiikkkybly,得出1()/niiikkiikixyrxr
程序代码:
头文件:
#include
typedef double Datatype;
class Matrix
{
private:
Datatype **ar;
int M;
int N;
public:
Matrix(int a=0,int b=0);
~Matrix();
void print();
void Init();
void Doolittle(Matrix &L,Matrix &R);
friend void Init_LR(Matrix &L,Matrix &R);
void get_Y(Matrix &b,Matrix &L);
void get_X(Matrix &Y,Matrix &R);
};
CPP文件:
#include
#include
#include
#include"Doolittle.h"

void Init_LR(Matrix &L,Matrix &R)
{
for(int i=0;i{
for(int j=0;j{
if(i<=j)
{
if(i!=j)
{
L.ar[i][j]=0;
}
else
{
L.ar[i][j]=1;
}
}
else
{
R.ar[i][j]=0;
}
}
}
}
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);
}
}

Matrix::~Matrix()////////////////////////////析构函数
{
for(int i=0;i{
free(ar[i]);
}
free(ar);
}

void Matrix::print()////////////////////////打印函数
{
for(int i=0;i{
for(int j=0;j{
cout<}
cout<}
}

void Matrix::Init()/////////////////////////初始化函数
{
for(int i=0;i{
cout<<"input the data of "<for(int j=0;j{
cin>>ar[i][j];
}
}
}
void Matrix::Doolittle(Matrix &L,Matrix &R)//////////////LR分解函数
{
for(int i=0;i{
for(int j=i;j{
Datatype sum=0;
for(int k=0;k{
sum+=L.ar[i][k]*R.ar[k][j];
}
R.ar[i][j]=ar[i][j]-sum;
}
for(j=i+1;j{
Datatype sum=0;
for(int k=0;k{
sum+=L.ar[j][k]*R.ar[k][i];
}
L.ar[j][i]=(ar[j][i]-sum)/R.ar[i][i];
}
}
}

void Matrix::get_Y(Matrix &b,Matrix &L)//计算得到Y
{
for(int i=0;i{
Datatype sum=0;
for(int j=0;j{
sum+=L.ar[i][j]*ar[j][0];
}
ar[i][0]=b.ar[i][0]-sum;
}
}

void Matrix::get_X(Matrix &Y,Matrix &R)//计算得到X
{
for(int i=M-1;i>=0;--i)
{
Datatype sum=0;
for(int j=M-1;j>i;--j)
{
sum+=R.ar[i][j]*ar[j][0];
}
ar[i][0]=(Y.ar[i][0]-sum)/R.ar[i][i];
}
}
主程序:
#include"Doolittle.h"
void main()
{
int row;
cout<<"input row"<cin>>row;
Matrix A(row,row),L(row,row),R(row,row),Y(row,1),B(row,1),X(row,1);
cout<<"请输入矩阵A"<A.Init();
cout<<"请输入矩阵b"<B.Init();
Init_LR(L,R);
A.Doolittle(L,R);
cout<<"*******分解矩阵A得L为********"<L.print();
cout<<"*******分解矩阵A得R为********"<R.print();
Y.get_Y(B,L);
cout<<"*******求得Y为********"<Y.print();
X.get_X(Y,R);
cout<<"*******求得X为********"<X.print();
}

测试数据:

123
123
123

24326225xxxxxxxxx







测试结果:
参考文献:
[1]刑志栋,矩阵数值分析, 陕西: 陕西科学技术出版社, 2005。
[2]谭浩强,C语言程序设计,北京:清华大学出版社,2005。
[3]翁惠玉,c语言程序设计思想与方法,北京:人民邮电出版社,2008