logo资料库

北航数值分析大作业第一题.pdf

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
数值分析第一题实验报告 一 算法设计 1. 题中给出的矩阵 A 进行压缩存储,将 A[i][j]映射为 B[i-j+s][j],其中 s 为上半带宽,这 样减少内存的占用。而在存储矩阵 A 时只存储 A 的对角线元素将 b,c 都设置为全局变量,进 一步减少存储量。 2. 由题意λ1<λ2<……<λ501, λ1 与λ501 中必有一个是按模最大的,因此可以通过幂法 求出记为λm,如果λm>0,则求出为λ501,利用原点平移 B=A-λmI,则次数λ1-λm 为按模 最大特征值可以再次使用幂法求出,记为λt,则λ1=λt+λm。如果λm<0 类似。λs 是按模 最小的,因此可以通过反幂法求出。 3. 反幂法中使用 doolittle 分解法,分解成 LU,便于每次求解 u=Ay 只需进行两次迭代过程 就可以求出 u,y,减少计算量。顺便可以求出 A 的行列式,|A|=|LU|=|L|*|U|,而|L|=1, |U|=U 的对角线元素的乘积。因此在进行 doolittle 分解时可以求出 A 的行列式。 4. 计算 A 与μk=λ1+k(λ501-λ1)/40,(k=1,2,…,39)最接近的特征值通过将 A 每次进行原 点平移 B=A-μkI,则通过反幂法求出 B 的按模最小特征值加上μk 即得到所求 λik。 5. A 的(谱范数)条件数 cond(A)2,因为 cond(A)2=||A||*||A-1||,所以只需求出 A 的按模 最大特征值和 A-1按模最大特征值。而 A-1按模最大特征值即为 A 按模最小的特征值,所 以 cond(A)2=λm*λs。 二 源程序 #include #include #include #define N 501 #define eps 1e-10 double b=0.16,c=-0.064; int Max(int value1,int value2) { return((value1>value2)?value1:value2); } int Min(int value1,int value2) { return ((value1
temp+=x[i]*y[i]; return temp; } void unit(double x[N],double (&y)[N]){ //将向量单位化,采用二范数 int i; double model=0; for(i=0;i
det*=B[s][i];} return ; } void diedai(double B[5][501],double u[501],double y[501]){//迭代求解 Au=y int i,t,s=2,r=2; double c[501]; for(i=0;i=0;i--){ u[i]=c[i]; for(t=i+1;t<=Min(i+s,500);t++) u[i]=u[i]-B[i-t+s][t]*u[t]; u[i]=u[i]/B[s][i]; } return ; } void matrix(double A[N],double x[N],double *y){// 计算矩阵和向量的乘积 int i; double b=0.16,c=-0.064; y[0]=(A[0]*x[0])+(b*x[1])+(c*x[2]); y[1]=b*x[0]+A[1]*x[1]+b*x[2]+c*x[3]; for(i=2;ieps){//达到精度要求结束运算 b1=b2; unit(u,y); matrix(A,y,u); b2=multiply(u,y); } return b2; } double inversepowermothed(double A[N]) //反幂法求解 A 的特征值 3
{ double b1=1,b2=0,det; int i; double u[N],y[N],B[5][N]; doolittle(A,B,det); for(i=0;ieps){ b2=b1; unit(u,y); diedai(B,u,y); b1=multiply(u,y); } return 1/b1; } int main() { int i,j; double A[501],B[5][501]; double lamda1,lamda501,lamdas,p,q,det,cond; for(j=0;j0){ //判断第一次求的特征值 p,若 p 则它为最大特征 lamda501=p; lamda1=q; } else{ lamda501=q; lamda1=p; } doolittle(A,B,det); lamdas= inversepowermothed (A); cond=fabs(p/lamdas); printf("λ1=%.12e\n",lamda1); printf("λ501=%.12e\n",lamda501); printf("λs=%.12e\n\n",lamdas); printf("\t 要求接近的值 \t\t\t 实际求得的特征值\n"); for(i=0;i<39;i++){//反幂法求得与给定值接近的特征值 4
p=lamda1+(i)*(lamda501-lamda1)/40; for(j=0;j
μ24: 2.064165983107e+000 λi24: 2.060330427561e+000 μ25: 2.574707160812e+000 λi25: 2.558075576223e+000 μ26: 3.085248338516e+000 λi26: 3.080240508465e+000 μ27: 3.595789516221e+000 λi27: 3.613620874136e+000 μ28: 4.106330693926e+000 λi28: 4.091378506834e+000 μ29: 4.616871871631e+000 λi29: 4.603035354280e+000 μ30: 5.127413049336e+000 λi30: 5.132924284378e+000 μ31: 5.637954227041e+000 λi31: 5.594906275501e+000 μ32: 6.148495404746e+000 λi32: 6.080933498348e+000 μ33: 6.659036582451e+000 λi33: 6.680354121496e+000 μ34: 7.169577760156e+000 λi34: 7.293878467852e+000 μ35: 7.680118937861e+000 λi35: 7.717111851857e+000 μ36: 8.190660115566e+000 λi36: 8.225220016407e+000 μ37: 8.701201293271e+000 λi37: 8.648665837870e+000 μ38: 9.211742470976e+000 λi38: 9.254200347303e+000 μ39: 9.722283648681e+000 λi39: 9.724634099672e+000 行列式 detA=2.772786141752e+118 条件数 cond(A)=1.925204271046e+003 四 问题讨论 * 初始迭代向量的选取对计算结果的影响,并说明原因 根据幂法算法,设 X1,X2,…,Xn 为 A 的 n 个线性无关特征向量,|λ1|>|λ2|>…>|λn|为其 对应特征值。初始迭代向量μ0=α1*X1+α2*X2+…+αn*Xn。如果初始迭代的向量选取使得μ 0 在特征向量 X1 上的分量α1=0,则因为计算误差,理论上迭代次数足够大后仍可以得到λ 1 的特征向量。但是实际计算中无法使迭代次数充分大,实际中对λ1 的求解具有精度限制, 所以如果初始向量选取不当使得α1=0则很大可能得不到实际的结果。 6
分享到:
收藏