数值与符号计算 LU和QR分解实验报告.docVIP

  • 198
  • 0
  • 约3.77千字
  • 约 8页
  • 2016-05-01 发布于江西
  • 举报
数值与符号计算 LU和QR分解实验报告.doc

数值与符号计算 实验(丑) 线性代数方程组求解 姓名: 学号: 学院: 实验题目 用C/C++语言实现如下函数: 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 hshld(double const*qr, double const*d, double*b, int n); 求线性代数方程组的解 实验要求 撰写详细的实验报告 不必修改函数界面 用高斯列选主元消去法和矩阵QR分解两种方法求解下面3个方程组,比较这两种方法的误差。 实验算法结果 矩阵的Lu分解算法代码如下: 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(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 部分下三角L a[n*j + i]=a[n*j+i]/a[n*i+i]; for(j=i+1; jn; j++)//计算上三角U for(k=i+1; kn; k++) a[n*j + k]=a[n*j+k]- a[n*j+i]*a[n*i+k]; } //计算下三角 L for(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; } return false ; } 高斯求解线性方程组代码如下: bool guass(double const* lu, int const* p, double* b, int n)//求线性代数方程组的解 { int i,j; double temp; //按qivot对b行变换,与LU匹配 for(i=0; in-1; i++) //貌似错误在这里哦 { temp = b[p[i]]; b[p[i]] = b[i]; b[i]=temp; } //Ly=b,将y的内容放入b for(i=0; in; i++) for(j=0; ji; j++) b[i]=b[i]-lu[n*i+j]*b[j]; //Uy=x,将x的内容放入b for(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]; } return false; } 矩阵的QR分解算法代码如下: void qr(double*

文档评论(0)

1亿VIP精品文档

相关文档