文档详情

北航研究生数值分析编程大作业1.doc

发布:2018-10-11约7.12千字共13页下载文档
文本预览下载声明
PAGE 1 数值分析大作业 算法设计方案 矩阵初始化 矩阵的下半带宽r=2,上半带宽s=2,设置矩阵,在矩阵C中检索矩阵A中的带内元素的方法是:。这样所需要的存储单元数大大减少,从而极大提高了运算效率。 利用幂法求出 幂法迭代格式: 当时,迭代终止。 首先对于矩阵A利用幂法迭代求出一个,然后求出矩阵B,其中(为单位矩阵),对矩阵B进行幂法迭代,求出,之后令,比较,大者为,小者为。 利用反幂法求出 反幂法迭代格式: 当时,迭代终止,。 每迭代一次都要求解一次线性方程组,求解过程为: 作分解 对于执行 求解(数组b先是存放原方程组右端向量,后来存放中间向量y) 使用反幂法,直接可以求得矩阵按模最小的特征值。 求与数最接近的特征值,对矩阵实行反幂法,即可求出对应的。 求出A的条件数和行列式 根据,其中分子分母分别对应按模最大和最小的特征值。 的计算:由于,其中为下三角矩阵,且对角线元素为1,故,所以有,又为上三角矩阵,故为对其对角线上各元素的乘积,最后可得。 程序源代码 (1)定义所需要的函数: #include stdio.h #include conio.h #include math.h #define N 501 #define R 2 #define S 2 int min(int a,int b); // 求最小值 int max(int a,int b,int c); // 求最大值 double Fan_two(double x[N]);//计算二范数 void FenjieLU(double (*C)[N]);//解线性方程组的LU分解过程 void Solve(double (*C)[N], double *b,double *x);//解线性方程组的求解过程 double PowerMethod(double C[][N],double u[N],double y[N],double bta,double D);//幂法 double InversePowerMethod(double C[][N],double u[N],double y[N],double bta,double D);//反幂法 }; (2)程序的主函数,Main.cpp代码如下: void main() { double C[R+S+1][N]; double u[N]; double y[N]; double miu[39]; double C1[R+S+1][N]; double bta = 1.0; double Namda1,Namda501,NamdaS; double Namda[39]; double CondA2; double detA = 1.0; double D = 1.0e-12; int i, j, k; FILE * fp; fp = fopen(Namda.txt,w); //对数组进行初始化// int i, j; for (i = 0; i N; i++) { u[i] = 1; } for (i = 0;i R + S + 1;i++) { for (j = 0;j N;j++) { if (i==0||i==4) { C[i][j]=-0.064; } else if (i==1||i==3) { C[i][j]=0.16; } else if (i==2) { C[i][j]=(1.64-0.024*(j+1))*sin(0.2*(j+1)) -0.64*exp(0.1/(j+1)); } } } //幂法求Namda1// Namda1 = PowerMethod(C, u, y, bta, D); printf(\n================================================\n); printf(Namda1 = %12.11e, Namda1); printf(\n================================================\n); //幂法求Namda501// bta = 1.0; for (i = 0; i R + S + 1; i++) { for (j = 0; j N; j++) { if (i == 2) C1[i][j] = C[i][j] -Namda1; else C1[i][j] =
显示全部
相似文档