📄 乔雷斯基.cpp
字号:
/*******************************************************************************
*该程序根据系数矩阵为对称正定矩阵的特点将矩阵压缩存储在一维空间中,在有效实现用
*侨勒斯基求解线性方程组的同时大大节省了运行空间,提高了效率。
基本思想:1:分解系数矩阵A=LDL'(其中L'表示L的转置矩阵),求出L
2:Ax=b =>Ly=b,DL'x=y;分别求出y,进而求出x
*******************************************************************************/
#include "iostream.h"
void main()
{
int i,j,n,k,m;
double *A,*L,*D,*x,*y,*b;
double s;
cout<<"请输入方程组中方程个数n:"<<endl;
cin>>n;
m=n*(n+1)/2;
//定义矩阵------------------------------------------------------------------;
A=new double[m+1];
L=new double[m+1];
D=new double[n+1];
x=new double[n+1];
y=new double[n+1];
b=new double[n+1];
//---------------------------------------------------------------------------;
cout<<"请输入压缩存储的对称矩阵的下三角元素A[i]:"<<endl;
for(i=1;i<=m;i++)
cin>>A[i];
cout<<"pLease enter b[i]:";
for(i=1;i<=n;i++)
cin>>b[i];
D[1]=A[1];
for(i=2;i<=n;i++)
{
for(j=1;j<i;j++)
{
s=0;
for(k=1;k<j;k++)
s+=D[k]*L[i*(i-1)/2+k]*L[j*(j-1)/2+k];
s=A[i*(i-1)/2+j]-s;
s=s/D[j];
L[i*(i-1)/2+j]=s;
}
s=0;
for(k=1;k<i;k++)
s-=D[k]*L[i*(i-1)/2+k]*L[i*(i-1)/2+k];
s+=A[i*(i+1)/2];
D[i]=s;
}
y[1]=b[1];
for(i=2;i<=n;i++)
{
s=0;
for(k=1;k<i;k++)
s-=y[k]*L[i*(i-1)/2+k];
s+=b[i];
y[i]=s;
}
//逆向分别求出x值-------------------------------------------------
x[n]=y[n]/D[n];
for(i=n-1;i>=1;i--)
{
s=0;
for(k=i+1;k<=n;k++)
s-=x[k]*L[k*(k-1)/2+i];
s+=y[i]/D[i];
x[i]=s;
}
cout<<"所给方程组的解为:"<<endl;
for(i=1;i<=n;i++)
cout<<"x"<<i<<"="<<x[i]<<endl;
//释放空间========================================================;
delete []A;
delete []L;
delete []D;
delete []x;
delete []y;
delete []b;
//=================================================================;
cout<<endl;
}
//*结束*---------------------------------------------------------------;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -