开始输入数据 A,b矩阵A的转置Householder变换转置矩阵相乘输出上三角阵R=H3*H2*H1*A输入正交阵Q=-(H3*H2*H1)T解上三角阵输出结果结束 六、实验结果 1、LU分解法
2、QR分解法
七、实验总结
为了求解线性方程组,我们通常需要一定的解法。其中一种解法就是通过矩阵的三角分解来实现的,属于求解线性方程组的直接法。在不考虑舍入误差下,直接法可以用有限的运算得到精确解,因此主要适用于求解中小型稠密的线性方程组。 1、三角分解法
三角分解法是将A矩阵分解成一个上三角形矩阵U和一个下三角形矩阵L,这样的分解法又称为LU分解法。它的用途主要在简化一个大矩阵的行列式值的计算过程,求反矩阵和求解联立方程组。不过要注意这种分解法所得到的上下三角形矩阵并非唯一,还可找到数个不同 的一对上下三角形矩阵,此两三角形矩阵相乘也会得到原矩阵。 2、 QR分解法
QR分解法是将矩阵分解成一个正规正交矩阵Q与上三角形矩阵R,所以称为QR分解法。
在编写这两个程序过程中,起初遇到不少麻烦!虽然课上老师反复重复着:“算法不难的,It's so easy!”但是当自己实际操作时,感觉并不是那么容易。毕竟是要把实际的数学问题转化为计算机能够识别的编程算法,所以在编写程序之前我们仔细认真的把所求解的问题逐一进行详细的分析,最终转化为程序段。每当遇到问题时,大家或许有些郁闷,但
最终还是静下心来反复仔细的琢磨,一一排除了错误,最终完成了本次实验。
回头一想原来编个程序其实也没有想象的那么复杂,只要思路清晰,逐步分析,就可以慢慢搞定了。
通过这次实验,让我们认知到团队的作用力度是不容忽视的,以后不管干任何时都要注重团队合作,遇到不懂得不明白的大家一起讨论,越讨论越清晰,愈接近最优答案。这样不管干什么都能事半功倍。庆幸自己有这么个团队,也明白大家一起劳动的果实最珍贵。
附 源代码: LR分解法:
#include
void input_A(); //输入矩阵A void input_b(); //输入矩阵b void output_x(float x[4]); //输出方程组的根
void main() { int i,k,r; float
A[4][4]={{4,2,1,5},{8,7,2,10},{4,8,3,6},{12,6,11,20}},b[4]={-2,-7,-7,-3},x[4],u[4][4],l[4][4],y[4]; //给定的方程组
// input_A(); // input_b(); //显示矩阵A、b printf(\矩阵A[4][4]:\\n\ for(i=0;i<4;i++) { for(k=0;k<4;k++) printf(\ printf(\ } for(i=0;i<4;i++) u[0][i]=A[0][i]; for(i=0;i<4;i++) { l[i][0]=A[i][0]/u[0][0]; l[i][i]=1; }
for(r=1;r<4;r++) //计算矩阵L和U { for(i=r;i<4;i++) { float t=0; for(k=0;k
//输入矩阵A void input_A() {
float A[4][4]; int i,j; printf(\ for(i=0;i<4;i++) for(j=0;j<4;j++) scanf(\}
//输入矩阵b void input_b() { float b[4]; int i; printf(\ for(i=0;i<4;i++) scanf(\}
//输出方程的根x
void output_x(float x[4]) { int i; printf(\方程组的根为:\\n\ for(i=0;i<4;i++) printf(\ printf(\}
QR分解法:
#include
void matrix_time(double A[][N],double B[][N],double C[][N],int n); //两个矩阵相乘,结果存在矩阵C[][N]
void matrix_vec(double A[][N],double B[N],double C[N],int n); //矩阵和向量相乘,结果存在向量C[N]
double vec_value(double A[],int n); //求向量的模 void vec_time(double a[],double H[][N],int n); //两个向量相乘得一个矩阵; void householder(double *a,double H[][N],int n, int m); //求解Householder矩阵函数 void matrix_turn(double A[][N],int n); //求矩阵装置