数值代数上机报告
Doolittle分解报告1一、 目的意义: 把矩阵A分解成一个下三角阵与一个上三角阵的乘积,即 A=LR,其中L为下三角阵,R为上三角阵,这样原线性方程组就可以化为的求解问题,方便求解。二、 算法:1) 输入系数矩阵 A;2) 利用公式和交错进行,计算得出矩阵L和R;3) 回带到中得出原线性方程组的解。三、 源程序:#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#define N 100main()int i,j,k,s,n;printf("请输入系数矩阵A的阶数:n= ");scanf("%d",&n);float aNN=0,LNN=0,RNN=0,sigma1,sigma2,bN,yN,xN;/*为L主对角线元素赋1*/for(i=0;i<n;i+)Lii=1;printf("请输入系数矩阵A:n"); /*输入系数矩阵A*/for(i=0;i<n;i+)for(j=0;j<n;j+)scanf("%f",&aij);for(k=0;k<n;k+)for(j=k;j<n;j+) /*计算矩阵R*/sigma1=0;for(s=0;s<=k-1;s+)sigma1+=Lks*Rsj;Rkj=akj-sigma1;for(i=k;i<n;i+) /*计算矩阵L*/sigma2=0;for(s=0;s<=k-1;s+)sigma2+=Lis*Rsk;Lik=(aik-sigma2)/Rkk;printf("n A矩阵为:n");/*输出矩阵L、R*/for(i=0;i<n;i+)for(j=0;j<n;j+)printf("%5.1f ",aij);printf("n");printf("n L矩阵为:n");for(i=0;i<n;i+)for(j=0;j<n;j+)printf("%5.1f ",Lij);printf("n");printf("n R矩阵为:n");for(i=0;i<n;i+)for(j=0;j<n;j+)printf("%5.1f ",Rij);printf("n");printf("请输入b矩阵n",i+1);for(i=0;i<n;i+)scanf("%f",&bi);for(i=0;i<n;i+)/*回代法求解方程组Ly=b*/sigma1=0;for(k=0;k<=i-1;k+)sigma1+=Lik*yk;yi=bi-sigma1;for(i=n-1;i>=0;i-)sigma2=0;for(k=i+1;k<n;k+)sigma2+=Rik*xk;xi=(yi-sigma2)/Rii;printf("解得x为:n");for(i=0;i<n;i+)printf("%5.1f ",xi);printf("n");四、 计算结果与分析:分析:运行结果与预想的结果相近,误差对结果的影响不是很大,比较理想五、 参考文献:1刑志栋. 矩阵数值分析. 陕西: 陕西科学技术出版社, 20052谭浩强. C语言程序设计. 北京:清华大学出版社,2005报告2cholesky分解一、 目的意义: 对称正定矩阵是实践中经常遇到的一种特殊矩阵类型矩阵,由于矩阵本身的流量好兴致,使得cholesky分解在存储和运算量上较一般消去法节省一半左右,且解的精度高,cholesky分解方法是目前计算机求解该类问题最有效的方法之一。二、 算法:1) 输入系数矩阵 A;2) 利用公式 交错进行,计算得出矩阵L和D;3) 回带到中得出原线性方程组的解三、 源程序:#include <stdio.h>#include <stdlib.h>#include <math.h>#define EPS 1.0e-8#define N 20double aNN, bN, xN;int n;int zhuyuan(int row); /* 选主元*/void hangjiaohuan(int row1, int row2); /* 行交换*/void xiaoyuan(int row); /*消元*/void huidai(); /* 回代*/void main()printf("请输入方程的维数n: n = "); scanf("%d", &n); getchar(); printf("输入%d行%d列系数矩阵A:n", n, n); for (int i=0; i<n; i+)for (int j=0; j<n; j+)scanf("%lf", &aij);getchar();printf("n输入线性方程组右端项b%d:n", n); for (i=0; i<n; i+)scanf("%lf", &bi);getchar(); for (i=0; i<n-1; i+) double rowmark = zhuyuan(i);if (rowmark = -1) printf("多解!"); system("pause"); return;if (rowmark != i) hangjiaohuan(i, rowmark);xiaoyuan(i);huidai(); printf("n线性方程组的解为:n "); for (i=0; i<n; i+) printf("x%d=%lf ", i+1, xi); printf("n"); printf("n"); system("pause");int zhuyuan(int row)double elem = arowrow; int rowmark = row; for (int i=row+1; i<n; i+) if (elem<airow) elem = airow; rowmark = i;if(fabs(elem) <= EPS) return -1;return rowmark;void hangjiaohuan(int row1, int row2)double tmp; tmp = brow1; brow1 = brow2; brow2 = tmp; for (int j=0; j<n; j+) tmp = arow1j; arow1j = arow2j; arow2j = tmp;void xiaoyuan(int row)for (int i=row+1; i<n; i+)int j=row; double tmp = aij/arowrow; bi -= tmp*brow; for (aij+ = 0; j<n; j+) aij -= tmp*arowj;void huidai()xn-1 = bn-1/an-1n-1; for (int i=n-2; i>=0; i-)double sum = 0.0; for (int j=i+1; j<n; j+) sum -= aij*xj;xi = (bi+sum)/aii;四、 计算结果与分析:分析:运行结果与预想的结果相近,误差对结果的影响不是很大,比较理想五、 参考文献:1刑志栋. 矩阵数值分析. 陕西: 陕西科学技术出版社, 20052谭浩强. C语言程序设计. 北京:清华大学出版社,2005Jacobi迭代法报告3一、 目的意义:通过有限次的算术运算得到线性方程组的近似值二、 算法:1) 输入系数矩阵 A;2) 输入迭代的初始向量;3) 利用公式 ,计算得出原线性方程组的近似解。三、 源程序:#include<stdio.h>#include<conio.h>#include<malloc.h>#include<math.h>#define EPS 1e-6#define MAX 100#define N 100float *Jacobi(float aNN,int n)float *x,*y,s; double epsilon; int i,j,k=0; x=(float *)malloc(n*sizeof(float); y=(float *)malloc(n*sizeof(float); printf("请输入迭代的初始向量:n"); for(i=0;i<n;i+) scanf("%f",&xi); while(1) epsilon=0; k+; for(i=0;i<n;i+) s=0; for(j=0;j<n;j+) if(j=i) continue; s+=aij*xj; yi=(ain-s)/aii; epsilon +=