线性代数方程组求解_高等教育-微积分.pdf
-.-.word.zl.线性代数方程组求解 一、实验要求 编程求解方程组:方程组 1:方程组 2:方程组 3:要求:用 C/C+语言实现如下函数:1.bool lu(double*a,int*pivot,int n);-.-.word.zl.实现矩阵的 LU 分解。pivot 为输出参数,pivot0,n)中存放主元的位置排列。函数成功时返回 false,否那么返回 true。2.bool guass(double const*lu,int const*p,double*b,int n);求线代数方程组的解 设矩阵 Lunxn 为某个矩阵 anxn 的 LU 分解,在内存中按行优先次序存放。p0,n)为 LU 分解的主元排列。b 为方程组 Ax=b 的右端向量。此函数计算方程组Ax=b 的解,并将结果存放在数组 b0,n)中。函数成功时返回 false,否那么返回true。3.void qr(double*a,double*d,int n);矩阵的 QR 分解 假设数组 anxn 在内存中按行优先次序存放。此函数使用 HouseHolder 变换将其就地进展 QR 分解。d 为输出参数,d 0,n)中存放 QR 分解的上三角对角线元素。4.bool hshld(double const*qr,double const*d,double*b,int n);求线代数方程组的解 设矩阵 qrnxn 为某个矩阵 anxn 的 QR 分解,在内存中按行优先次序存放。d 0,n)为 QR 分解的上三角对角线元素。b 为方程组 Ax=b 的右端向量。函数计算方程组 Ax=b 的解,并将结果存放在数组 b0,n)中。函数成功时返回 false,否那么返回 true。二、问题分析 求解线性方程组 Ax=b,其实质就是把它的系数矩阵 A 通过各种变换成一个下三角或上三角矩阵,从而简化方程组的求解。因此,在求解线性方程组的过输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.程中,把系数矩阵 A 变换成上三角或下三角矩阵显得尤为重要,然而矩阵 A 的变换通常有两种分解方法:LU 分解法和 QR 分解法。1、LU 分解法:将 A 分解为一个下三角矩阵 L 和一个上三角矩阵 U,即:A=LU,其中 L=100 10 0 12 121 n nl ll,U=nnnnuu uu u u 0 00 002 221 12 11 2、QR 分解法:将 A 分解为一个正交矩阵 Q 和一个上三角矩阵 R,即:A=QR 三、实验原理 解 Ax=b 的问题就等价于要求解两个三角形方程组:Ly=b,求 y;Ux=y,求 x.设 A 为非奇异矩阵,且有分解式 A=LU,L 为单位下三角阵,U 为上三角阵。L,U 的元素可以有 n 步直接计算定出。用直接三角分解法解 Ax=b要求 A 的所有顺序主子式都不为零的计算公式:),2,1(n i a uli li,11/u a lil il,i=2,3,,n.计算 U 的第 r 行,L 的第 r 列元素(i=2,3,n):11rkki rk ri riu l a u,i=r,r+1,n;rrrkkr ik ir iru u l a l/)(11,i=r+1,n,且 r n.求解 Ly=b,Ux=y 的计算公式;输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.:,3,2,111 1n i y l b yb yikk ik i i.1,2,1,/)(,/1 n n i u x u y xu y xiini kk ik i inn n n 四、实验步骤 1将矩阵 A 保存进计算机中,再定义 2 个空矩阵 L,U 以便保存求出的三角矩阵的值。利用公式,将矩阵 A 分解为 LU,L 为单位下三角阵,U 为上三角阵。2可知计算方法有三层循环。先通过公式计算出 U 矩阵的第一行元素liu 和 L 矩阵的第一列元素ill。再根据公式和,和上次的出的值,求出矩阵其余的元素,每次都要三次循环,求下一个元素需要上一个结果。3先由公式,Ly=b:,3,2,111 1n i y l b yb yikk ik i i 求出 y,因为 L 为下三角矩阵,所以由第一行开场求 y.4再由公式,Ux=y.1,2,1,/)(,/1 n n i u x u y xu y xiini kk ik i inn n n 求出 x,因为 U 为上三角矩阵,所以由最后一行开场求 x.五、程序流程图 1、LU 分解法 输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.开始输入系数矩阵A,常数项 b及 ndet 1K=1,n-1,1调选列主元子程序i=k+1,n,1aik aik/akk(即求乘数mik)j=k+1,n,1aik aij-aik*akjjbi bi aik*bkidet akkdetkbn bn/am(即求出 xn)i=n-1,1,-1s 0j=i+1,n,1s s+aij*bjjbi(bi-s)/aij输出 b及 det结束idet amndet回代过程消元过程 输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.由主程序转来d akk,p ki=k+1,n,1|aik|d|d aik,p iid=0P=kj=k,n,1t apj,apj akj,akj tjt bp,bp bk,bk tdet det返回主程序返回主程序输出失败标志,|A|=0det 0结束选列主元=输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.2、QR 分解法 输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.开始输入数据 A,b矩阵 A的转置Householder 变换转置矩阵相乘输出上三角阵R=H3*H2*H1*A输入正交阵 Q=-(H3*H2*H1)T解上三角阵输出结果结束 输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.六、实验结果 1、LU 分解法 方程组 1:方程组 2:输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.方程组 3:2、QR 分解法 输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.方程组 1:方程组 2:方程组 3:输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.七、实验总结 为了求解线性方程组,我们通常需要一定的解法。其中一种解法就是通过矩阵的三角分解来实现的,属于求解线性方程组的直接法。在不考虑舍入误差下,直接法可以用有限的运算得到准确解,因此主要适用于求解中小型稠密的线性方程组。1、三角分解法 三角分解法是将 A 矩阵分解成一个上三角形矩阵 U 和一个下三角形矩阵 L,这样的分解法又称为 LU 分解法。它的用途主要在简化一个大矩阵的行列式值的计算过程,求反矩阵和求解联立方程组。不过要注意这种分解法所得到的上下三角形矩阵并非唯一,还可找到数个不同 的一对上下三角形矩阵,此两三角形矩阵相乘也会得到原矩阵。输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.2、QR 分解法 QR 分解法是将矩阵分解成一个正规正交矩阵 Q 与上三角形矩阵 R,所以称为QR 分解法。在编写这两个程序过程中,起初遇到不少麻烦!虽然课上教师反复重复着:“算法不难的,Its so easy!但是当自己实际操作时,感觉并不是那么容易。毕竟是要把实际的数学问题转化为计算机能够识别的编程算法,所以在编写程序之前我们仔细认真的把所求解的问题逐一进展详细的分析,最终转化为程序段。每当遇到问题时,大家或许有些郁闷,但最终还是静下心来反复仔细的琢磨,一一排除了错误,最终完成了本次实验。回头一想原来编个程序其实也没有想象的那么复杂,只要思路清晰,逐步分析,就可以慢慢搞定了。输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.附 源代码:#include#include#include#include#include using namespace std;bool lu(double*a,int*pivot,int n);/矩阵 LU 分解 bool guass(double const*lu,int const*p,double*b,int n);/求线性代数方程组的解 void qr(double*a,double*d,int n);/矩阵的 QR 分解 bool householder(double const*qr,double const*d,double*b,int n);int main()int n=0;int temp=0;bool flag=false;double expct=0;/误差期望值 double devsq=0;/误差的方差 int*P=NULL;double*D=NULL;double A=1,1/2.0,1/3.0,1/4.0,1/5.0,1/6.0,1/2.0,1/3.0,1/4.0,1/5.0,1/6.0,1/7.0,输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.1/3.0,1/4.0,1/5.0,1/6.0,1/7.0,1/8.0,1/4.0,1/5.0,1/6.0,1/7.0,1/8.0,1/9.0,1/5.0,1/6.0,1/7.0,1/8.0,1/9.0,1/10.0,1/6.0,1/7.0,1/8.0,1/9.0,1/10.0,1/11.0;double B=1+1/2.0+1/3.0+1/4.0+1/5.0+1/6.0,1/2.0+1/3.0+1/4.0+1/5.0+1/6.0+1/7.0,1/3.0+1/4.0+1/5.0+1/6.0+1/7.0+1/8.0,1/4.0+1/5.0+1/6.0+1/7.0+1/8.0+1/9.0,1/5.0+1/6.0+1/7.0+1/8.0+1/9.0+1/10.0,1/6.0+1/7.0+1/8.0+1/9.0+1/10.0+1/11.0;n=6;P=(int*)malloc(sizeof(int)*n);D=(double*)malloc(sizeof(double)*n);for(int i=0;in;i+)Pi=Di=0;coutflag;输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.if(!flag)cout 矩阵 LU 分解:n;lu(A,P,n);/矩阵 LU 分解 for(int i=0;in;i+)for(int j=0;jn;j+)printf(%ft,Ai);coutendl;cout 矩阵 LU 分解的主元位置:n;for(int i=0;in;i+)coutPit;coutnGuass 求线性代数方程组求解:n;guass(A,P,B,n);/求线性代数方程组的解 for(int i=0;in;i+)if(i=3)coutendl;printf(%.16ft,Bi);coutnGuass 解法的误差为:n;输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.for(int i=0;in;i+)if(i=3)coutendl;printf(%.16ft,Bi-1);expct=expct+Bi-1;printf(n 误差期望值为%.16ftn,expct/6);coutendl;else cout 矩阵 QR 分解:n;qr(A,D,n);/矩阵 qr 分解 for(int i=0;in;i+)for(int j=0;jn;j+)printf(%dt,Ai);coutendl;coutQR 分解的上三角矩阵对角线元素:n;输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.for(int i=0;in;i+)printf(%ft,Di);coutnHouseholder 线性代数方程组求解:n;householder(A,D,B,n);/求线性代数方程组的解 for(int i=0;in;i+)if(i=3)coutendl;printf(%.16ft,Bi);coutnHouseholder 解法的误差为:n;for(int i=0;in;i+)if(i=3)coutendl;printf(%.16ft,Bi-1);expct=expct+Bi-1;printf(n 误差期望值为%.16ftn,expct/6);coutendl;return 0;输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.bool lu(double*a,int*pivot,int n)/矩阵 LU 分解 int i,j,k;double max,temp;max=0;temp=0;for(i=0;in-1;i+)/依次对第 i 列进展处理/选出 i 列的主元,记录主元位置 max=fabs(an*i+i);pivoti=i;for(j=i+1;jmax)max=fabs(an*j+i);pivoti=j;/对第 i 列进展行变换,使得主元在对角线上 if(pivoti!=i)输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.for(j=i;jn;j+)/ij 与 pivotij 换 只用对上三角进展处理 temp=an*i+j;an*i+j=an*pivoti+j;an*pivoti+j=temp;for(j=i+1;jn;j+)/Pi 局部下三角 L an*j+i=an*j+i/an*i+i;for(j=i+1;jn;j+)/计算上三角 U for(k=i+1;kn;k+)an*j+k=an*j+k-an*j+i*an*i+k;/计算下三角 L for(i=0;in-2;i+)/i 行 k 列 for(k=i+1;kn-1;k+)temp=an*pivotk+i;an*pivotk+i=ak*n+i;ak*n+i=temp;输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.return false;bool guass(double const*lu,int const*p,double*b,int n)/求线性代数方程组的解 int i,j,k;double temp;/按 qivot 对 b 行变换,与 LU 匹配 for(i=0;in-1;i+)/貌似错误在这里哦 temp=bpi;bpi=bi;bi=temp;/Ly=b,将 y 的内容放入 b for(i=0;in;i+)for(j=0;j=0;i-)for(j=n-1;ji;j-)bi=bi-lun*i+j*bj;输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.bi=bi/lun*i+i;return false;void qr(double*a,double*d,int n)/矩阵的 QR 分解 int i,j,l,k;double tem,m;double*temp;temp=(double*)malloc(sizeof(double)*n);for(i=0;in-1;i+)/依次对第 i 列进展处理/获得 tem 值 m=0;for(j=i;j0)m=-sqrt(m);else m=sqrt(m);/获得 temp 放入矩阵,并存主元 d tem=0;输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.di=m;an*i+i=an*i+i-m;for(j=i;j=n-1;j+)tem=tem+an*j+i*an*j+i;tem=sqrt(tem);for(j=i;j=n-1;j+)an*j+i=an*j+i/tem;/调整矩阵 for(k=i+1;kn;k+)for(j=i;jn;j+)tem=0;for(l=i;ln;l+)tem=tem+an*j+i*an*l+i*an*l+k;tempj=aj*n+k-2*tem;for(j=i;jn;j+)aj*n+k=tempj;dn-1=a(n-1)*n+n-1;输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.bool householder(double const*qr,double const*d,double*b,int n)/求线性代数方程组的解 int i,j,l;double rem;double*temp;temp=(double*)malloc(sizeof(double)*n);for(i=0;in-1;i+)for(j=i;jn;j+)rem=0;for(l=i;ln;l+)rem=rem+qrl*n+i*qrj*n+i*bl;tempj=bj-2*rem;for(j=i;j-1;j-)for(l=n-1;l!=j;-l)输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三-.-.word.zl.bj=bj-bl*qrj*n+l;bj=bj/dj;return false;输出参数中存放主元的位置排列函数成功时返回否那么返回求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的主元排列为方程组的右端向量此函数计算方程组的解并将结果存放在数组中函数成功时返 放分解的上三角对角线元素求线代数方程组的解设矩阵为某个矩阵的分解在内存中按行优先次序存放为分解的上三角对角线元素为方程组的右端向量函数计算方程组的解并将结果存放在数组中函数成功时返回否那么返回二问题分析 在求解线性方程组的过程中把系数矩阵变换成上三角或下三角矩阵显得尤为重要然而矩阵的变换通常有两种分解方法分解法和分解法分解法将分解为一个下三角矩阵和一个上三角矩阵即其中分解法将分解为一个正交矩阵和一个上三