对矩阵x进行QR分解和LU分解,QR分解和LU分解是什么意思呢
LU分解是矩阵的三角分解,产生一个上三角矩阵和一个下三角矩阵。
QR分解是矩阵的正交分解。
C语言如何解这四元一次方程啊?
void main(){ double p1,p2,p3,p4; if( p1+p2+p3+p4==1 p1==0.8*p1+0.5*p3
p2==0.2*p1+0.5*p3
p3==0.5*p2+0.2*p4
p4==0.5*p2+0.8*p4 )printf(“%d %d %d %d \n”,p1,p2,p3,p4);}
怎样用LU分解法解线性方程组
Ax=B,改写成Ly=B,Ux=y的方程组。就相当于将A=LU分解成了两个矩阵。称为矩阵A的三角分解,或LU分解。如果L为单位下三角阵,则叫Doolittle分解,若U为单位上三角阵,则叫Crout分解。只要A的各顺序主子式不为零,则A可唯一分解成一个单位下三角阵L与一个上三角阵U的乘积。
•设Ax=b,A=LU,则Ax=LUx=b
于是令Ux=y,则Ly=b
这样原来方程能化为两个简单方程组
在线性代数中, LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积)。LU分解主要应用在数值分析中,用来解线性方程、求反矩阵或计算行列式。
扩展资料:
相关算法:
LU分解在本质上是高斯消元法的一种表达形式。实质上是将A通过初等行变换变成一个上三角矩阵,其变换矩阵就是一个单位下三角矩阵。
这正是所谓的杜尔里特算法:从下至上地对矩阵A做初等行变换,将对角线左下方的元素变成零,然后再证明这些行变换的效果等同于左乘一系列单位下三角矩阵,这一系列单位下三角矩阵的乘积的逆就是L矩阵,它也是一个单位下三角矩阵。这类算法的复杂度一般在(三分之二的n三次方) 左右。
参考资料:百度百科-lu分解
求C语言课程设计:用高斯列主元消元法解线性方程组
这里向你推荐一下克鲁特算法(其实就是对高斯列主元消元法进行优化,使之更适合于计算机编程),首先将矩阵A进行LU分解(将系数矩阵分解成一个上三角矩阵和一个下三角矩阵),分解的过程中用到了隐式的主元寻找法,同时利用克鲁特算法可以将两个n*n矩阵压缩到一个n*n矩阵中,大大节省了存储空间提高了计算速度。
方程可化为L*U*x=B,令U*x=y —L*y=B
然后利用回代先求y,再利用y求x
因为该方法在求解过程中不涉及增广矩阵所以矩阵B几乎不参与什么运算,所以它的计算速度应该能够达到高斯列主元消元法的三倍,但原理与其基本一致。
而且我在程序中使用了动态数组方便你今后进行扩展。
以下程序按照《矩阵论第二版》和《C语言数值计算法方法大全》编写,LU分解部分程序主要参考了《C语言数值计算法方法大全》第二章的程序
如果你需要详细的理论讲解我可以将这两本书和源程序发给你,上面的论述相当详细足够你答辩用的了,我的邮箱hu_hu605@163.com
计算结果:
A矩阵:
2 2 5
3 4 7
1 3 3
B矩阵:
5
6
5
解矩阵:
x 1=-7
x 2=0.333333
x 3=3.66667
Press any key to continue
#include cmath
#include iostream
#include iomanip
#include cstdlib
#include functional
#include vector
#include algorithm
using namespace std;
#define TINY 1.0e-20 //A small number.
#define N 3
void ludcmp(vectorvectorfloat a, int n, vectorint indx, float d);//对矩阵进行LU分解
void lubksb(vectorvectorfloat a, int n, vectorint indx, vectorfloat b);//对矩阵进行前向和后向回代
void root(vectorvectorfloat x,vectorfloat col);//解方程结果保存在y中
void iniv(vectorvectorfloat x,vectorfloat line,int n);//对二维动态数组进行初始化
void main()
{
int i,j,n=N;//输入矩阵的维数
float A[N][N]={{2,2,5},{3,4,7},{1,3,3}};//左边A矩阵
float B[N]={5,6,5};//右边B矩阵
vectorvectorfloat x;//建立动态二维数组存放A,保证你的程序进行扩展时只改A,B,N
vectorfloat line;
vectorfloat y(n);//建立动态数组存放B
iniv(x,line,n);
y.clear();
for(i=0;in;i++)//将A赋给x,B赋给y
{
y.push_back(B[i]);
for(j=0;jn;j++)
{
x[i].push_back(A[i][j]);
}
}
cout”A矩阵:”endl;
for(i=0;in;i++)
{
for(j=0;jn;j++)
{
coutsetw(2)setiosflags(ios::left)setw(2)x[i][j]” “;
}
coutendl;
}
cout”B矩阵:”endl;
for(i=0;in;i++)
{
coutsetw(2)setiosflags(ios::left)setw(2)y[i]endl;
}
root(x,y);//求根
cout”解矩阵:”endl;
for(i=0;in;i++)
{
coutsetw(2)setiosflags(ios::left)”x”i+1″=”y[i]endl;
}
coutendl;
}
void root(vectorvectorfloat x,vectorfloat col)
{
int n=x.size(),i=0,j=0;
vectorint index(n);//用于记录寻找主元素过程中对矩阵的初等变换
index.clear();
float m=1.0;//记录变换方式,此程序中无用
ludcmp(x,n,index,m);//进行LU分解
lubksb(x,n,index,col);//根据分解结果进行回带
}
//以下程序按照《矩阵论第二版》和《C语言数值计算法方法大全》编写,LU分解部分程序主要参考了《C语言数值计算法方法大全》第二章的程序
//如果你需要详细的理论讲解我可以将这两本书和源程序发给你,我的邮箱hu_hu605@163.com
void ludcmp(vectorvectorfloat a, int n, vectorint indx, float d)
{
int i,imax,j,k;
float big=0,dum=0,sum=0,temp=0;
vectorfloat vv(n);
vv.clear();
d=1.0;
for (i=0;in;i++)
{
big=0.0;
for (j=0;jn;j++)
if ((temp=fabs(a[i][j])) big)
big=temp;
vv[i]=1.0/big;
}
for (j=0;jn;j++)
{
for (i=0;ij;i++)
{
sum=a[i][j];
for (k=0;ki;k++)
sum -= a[i][k]*a[k][j];
a[i][j]=sum;
}
big=0.0;
for (i=j;in;i++)
{
sum=a[i][j];
for (k=0;kj;k++)
sum -= a[i][k]*a[k][j];
a[i][j]=sum;
if ( (dum=vv[i]*fabs(sum)) = big)
{
big=dum;
imax=i;
}
}
if (j != imax)
{
for (k=0;kn;k++)
{
dum=a[imax][k];
a[imax][k]=a[j][k];
a[j][k]=dum;
}
d = -(d);
vv[imax]=vv[j];
}
indx[j]=imax;
if (a[j][j] == 0.0)
a[j][j]=TINY;
if (j != n)
{
dum=1.0/(a[j][j]);
for (i=j+1;in;i++)
a[i][j] *= dum;
}
}
}
void lubksb(vectorvectorfloat a, int n, vectorint indx, vectorfloat b)
{
int i,ii=0,ip,j;
float sum;
for(i=0;in;i++)//按LU分解时寻找主元所进行的初等变换进行反边变换。
{
ip=indx[i];
sum=b[ip];
b[ip]=b[i];
b[i]=sum;
}
sum=0;
for (i=1;in;i++)
{
sum=0;
for(j=0;ji;j++)
{
sum+=a[i][j]*b[j];
}
b[i]=b[i]-sum;
}
b[n-1]=b[n-1]/a[n-1][n-1];
for (i=n-2;i=0;i–)
{
sum=0;
for(j=i+1;jn;j++)
{
sum+=a[i][j]*b[j];
}
b[i]=(b[i]-sum)/a[i][i];
}
}
void iniv(vectorvectorfloat x,vectorfloat line,int n)
{
int i,j;
for(i=0;in;i++)
{
x.push_back(line);
for(j=0;jn;j++)
{
x[i].clear();
}
}
}