数值与符号计算实验(丑)线性代数方程组求解姓名:学号:学院:一、实验题目用C/C++语言实现如下函数:1、boollu(double*a,int*pivot,intn);矩阵的LU分解2、boolguass(doubleconst*lu,intconst*p,double*b,intn);求线性代数方程组的解3、voidqr(double*a,double*d,intn);矩阵的QR分解4、boolhshld(doubleconst*qr,doubleconst*d,double*b,intn);求线性代数方程组的解二、实验要求i.撰写详细的实验报告ii.不必修改函数界面iii.用高斯列选主元消去法和矩阵QR分解两种方法求解下面3个方程组,比较这两种方法的误差。三、实验算法结果1、矩阵的Lu分解算法代码如下:boollu(double*a,int*pivot,intn)//矩阵LU分解{inti,j,k;doublemax,temp;max=0;temp=0;for(i=0;in-1;i++)//依次对第i列进行处理{//选出i列的主元,记录主元位置max=fabs(a[n*i+i]);pivot[i]=i;for(j=i+1;jn;j++)//j表示第j行{if(fabs(a[n*j+i])max){max=fabs(a[n*j+i]);pivot[i]=j;}}//对第i列进行行变换,使得主元在对角线上if(pivot[i]!=i){for(j=i;jn;j++)//ij与pivot[i]j换只用对上三角进行处理{temp=a[n*i+j];a[n*i+j]=a[n*pivot[i]+j];a[n*pivot[i]+j]=temp;}}for(j=i+1;jn;j++)//Pi部分下三角La[n*j+i]=a[n*j+i]/a[n*i+i];for(j=i+1;jn;j++)//计算上三角Ufor(k=i+1;kn;k++)a[n*j+k]=a[n*j+k]-a[n*j+i]*a[n*i+k];}//计算下三角Lfor(i=0;in-2;i++)//i行k列for(k=i+1;kn-1;k++){temp=a[n*pivot[k]+i];a[n*pivot[k]+i]=a[k*n+i];a[k*n+i]=temp;}returnfalse;}2、高斯求解线性方程组代码如下:boolguass(doubleconst*lu,intconst*p,double*b,intn)//求线性代数方程组的解{inti,j;doubletemp;//按qivot对b行变换,与LU匹配for(i=0;in-1;i++)//貌似错误在这里哦{temp=b[p[i]];b[p[i]]=b[i];b[i]=temp;}//Ly=b,将y的内容放入bfor(i=0;in;i++)for(j=0;ji;j++)b[i]=b[i]-lu[n*i+j]*b[j];//Uy=x,将x的内容放入bfor(i=n-1;i=0;i--){for(j=n-1;ji;j--)b[i]=b[i]-lu[n*i+j]*b[j];b[i]=b[i]/lu[n*i+i];}returnfalse;}3、矩阵的QR分解算法代码如下:voidqr(double*a,double*d,intn)//矩阵的QR分解{inti,j,l,k;doubletem,m;double*temp;temp=(double*)malloc(sizeof(double)*n);for(i=0;in-1;i++)//依次对第i列进行处理{//获得tem值m=0;for(j=i;jn;j++)//j表示第j行m=m+a[n*j+i]*a[n*j+i];if(a[n*i+i]0)m=-sqrt(m);elsem=sqrt(m);//获得temp放入矩阵,并存主元dtem=0;d[i]=m;a[n*i+i]=a[n*i+i]-m;for(j=i;j=n-1;j++)tem=tem+a[n*j+i]*a[n*j+i];tem=sqrt(tem);for(j=i;j=n-1;j++)a[n*j+i]=a[n*j+i]/tem;//调整矩阵for(k=i+1;kn;k++){for(j=i;jn;j++){tem=0;for(l=i;ln;l++)tem=tem+a[n*j+i]*a[n*l+i]*a[n*l+k];temp[j]=a[j*n+k]-2*tem;}for(j=i;jn;j++)a[j*n+k]=temp[j];}}d[n-1]=a[(n-1)*n+n-1];}4、QR求解线性方程组的代码如下:boolhouseholder(doubleconst*qr,doubleconst*d,double*b,intn)//求线性代数方程组的解{inti,j,l;doublerem;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+qr[l*n+i]*qr[j*n+i]*b[l];temp[j]=b[j]-2*rem;}for(j=i;jn;j++)b[j]=temp[j];}for(j=n-1;j-1;j--){for(l=n-1;l!=j;--l)b[j]=b[j]-b[l]*qr[j*n+l];b[j]=b[j]/d[j];}returnfalse;}四、运行结果1、题目1的LU分解运行结果截图:QR分解结果截图:2、题目2的LU分解结果截图:QR分解结果截图:3、题目3的LU分解结果截图:QR分解结果截图:五、结果分析从以上运算的结果来看,列选主元高斯消去法LU分解和QR分解基本上都能较准确解出上述3道题目的结果。但是从矩阵分解后的结果来看,矩阵分解成LU中,L和U各自的元素都很小,而QR分解中Q和R元素都很大。并且对于第二道题目的解题结果来看,LU分解更加准确。综上所述,LU分解算法相对于QR分解算法,算法更优