北航硕士研究生数值分析大作业一.docx
《北航硕士研究生数值分析大作业一.docx》由会员分享,可在线阅读,更多相关《北航硕士研究生数值分析大作业一.docx(16页珍藏版)》请在冰豆网上搜索。
北航硕士研究生数值分析大作业一
数值分析
—计算实习作业一
学院:
17系
专业:
精密仪器及机械
姓名:
张大军
学号:
DY1417114
2014-11-11
数值分析计算实现第一题报告
1、算法方案
算法方案如图1所示。
(此算法设计实现完全由本人独立完成)
2、全部源程序
全部源程序如下所示
#include
intmain()
{
doublea[501];
doublevv[5][501];
doubled=0;
doubler[3];
doubleuu;
inti,k;
doublemifayunsuan(double*a,doubleweiyi);
doublefanmifayunsuan(double*a,doubleweiyi);
voidyasuo(double*A,double(*C)[501]);
voidLUfenjie(double(*C)[501]);
//赋值语句
for(i=1;i<=501;i++)
a[i-1]=(1.64-0.024*i)*sin(0.2*i)-0.64*exp(0.1/i);
}
//程序一:
使用幂方法求绝对值最大的特征值
r[0]=mifayunsuan(a,d);
//程序二:
使用幂方法求求平移λ[0]后绝对值最大的λ,得到原矩阵中与最大特征值相距最远的特征值
d=r[0];
r[1]=mifayunsuan(a,d);
//比较λ与λ-λ[0]的大小,由已知得
if(r[0]>r[1])
r[0]=r[1];
r[1]=d;
//程序三:
使用反幂法求λ
r[2]=fanmifayunsuan(a,0);
cout<:right);cout<<"λ["<<1<<"]="<:scientific)<cout<<"λ["<<501<<"]="<:scientific)<cout<<"λ[s]="<:scientific)<//程序四:求A的与数u最接近的特征值for(k=1;k<40;k++){uu=r[0]+k*(r[1]-r[0])/40;cout<<"最接近u["<<:scientific)<}//程序五:谱范数的条件数是绝对值最大的特征值除以绝对值最小的特征值的绝对值cout<<"cond(A)2="<//程序六:A的行列式的值就是A分解成LU之U的对角线的乘积yasuo(a,vv);LUfenjie(vv);uu=1;for(i=0;i<501;i++){uu=uu*vv[2][i];}cout<<"Det(A)="<return1;}doublemifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1}for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(v2+weiyi);}doublefanmifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[501];doubleC[5][501];voidyasuo(double*A,double(*C)[501]);voidLUfenjie(double(*C)[501]);voidqiuU(double(*C)[501],double*y,double*u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(1/v2+weiyi);}voidyasuo(double*A,double(*C)[501]){doubleb=0.16;doublec=-0.064;inti;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}voidLUfenjie(double(*C)[501]){intk,t,j;intr=2,s=2;doublesum;intminn(int,int);intmaxx(int,int);for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
:
right);
cout<<"λ["<<1<<"]="<:scientific)<cout<<"λ["<<501<<"]="<:scientific)<cout<<"λ[s]="<:scientific)<//程序四:求A的与数u最接近的特征值for(k=1;k<40;k++){uu=r[0]+k*(r[1]-r[0])/40;cout<<"最接近u["<<:scientific)<}//程序五:谱范数的条件数是绝对值最大的特征值除以绝对值最小的特征值的绝对值cout<<"cond(A)2="<//程序六:A的行列式的值就是A分解成LU之U的对角线的乘积yasuo(a,vv);LUfenjie(vv);uu=1;for(i=0;i<501;i++){uu=uu*vv[2][i];}cout<<"Det(A)="<return1;}doublemifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1}for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(v2+weiyi);}doublefanmifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[501];doubleC[5][501];voidyasuo(double*A,double(*C)[501]);voidLUfenjie(double(*C)[501]);voidqiuU(double(*C)[501],double*y,double*u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(1/v2+weiyi);}voidyasuo(double*A,double(*C)[501]){doubleb=0.16;doublec=-0.064;inti;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}voidLUfenjie(double(*C)[501]){intk,t,j;intr=2,s=2;doublesum;intminn(int,int);intmaxx(int,int);for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
scientific)<cout<<"λ["<<501<<"]="<:scientific)<cout<<"λ[s]="<:scientific)<//程序四:求A的与数u最接近的特征值for(k=1;k<40;k++){uu=r[0]+k*(r[1]-r[0])/40;cout<<"最接近u["<<:scientific)<}//程序五:谱范数的条件数是绝对值最大的特征值除以绝对值最小的特征值的绝对值cout<<"cond(A)2="<//程序六:A的行列式的值就是A分解成LU之U的对角线的乘积yasuo(a,vv);LUfenjie(vv);uu=1;for(i=0;i<501;i++){uu=uu*vv[2][i];}cout<<"Det(A)="<return1;}doublemifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1}for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(v2+weiyi);}doublefanmifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[501];doubleC[5][501];voidyasuo(double*A,double(*C)[501]);voidLUfenjie(double(*C)[501]);voidqiuU(double(*C)[501],double*y,double*u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(1/v2+weiyi);}voidyasuo(double*A,double(*C)[501]){doubleb=0.16;doublec=-0.064;inti;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}voidLUfenjie(double(*C)[501]){intk,t,j;intr=2,s=2;doublesum;intminn(int,int);intmaxx(int,int);for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
cout<<"λ["<<501<<"]="<:scientific)<cout<<"λ[s]="<:scientific)<//程序四:求A的与数u最接近的特征值for(k=1;k<40;k++){uu=r[0]+k*(r[1]-r[0])/40;cout<<"最接近u["<<:scientific)<}//程序五:谱范数的条件数是绝对值最大的特征值除以绝对值最小的特征值的绝对值cout<<"cond(A)2="<//程序六:A的行列式的值就是A分解成LU之U的对角线的乘积yasuo(a,vv);LUfenjie(vv);uu=1;for(i=0;i<501;i++){uu=uu*vv[2][i];}cout<<"Det(A)="<return1;}doublemifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1}for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(v2+weiyi);}doublefanmifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[501];doubleC[5][501];voidyasuo(double*A,double(*C)[501]);voidLUfenjie(double(*C)[501]);voidqiuU(double(*C)[501],double*y,double*u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(1/v2+weiyi);}voidyasuo(double*A,double(*C)[501]){doubleb=0.16;doublec=-0.064;inti;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}voidLUfenjie(double(*C)[501]){intk,t,j;intr=2,s=2;doublesum;intminn(int,int);intmaxx(int,int);for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
scientific)<cout<<"λ[s]="<:scientific)<//程序四:求A的与数u最接近的特征值for(k=1;k<40;k++){uu=r[0]+k*(r[1]-r[0])/40;cout<<"最接近u["<<:scientific)<}//程序五:谱范数的条件数是绝对值最大的特征值除以绝对值最小的特征值的绝对值cout<<"cond(A)2="<//程序六:A的行列式的值就是A分解成LU之U的对角线的乘积yasuo(a,vv);LUfenjie(vv);uu=1;for(i=0;i<501;i++){uu=uu*vv[2][i];}cout<<"Det(A)="<return1;}doublemifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1}for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(v2+weiyi);}doublefanmifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[501];doubleC[5][501];voidyasuo(double*A,double(*C)[501]);voidLUfenjie(double(*C)[501]);voidqiuU(double(*C)[501],double*y,double*u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(1/v2+weiyi);}voidyasuo(double*A,double(*C)[501]){doubleb=0.16;doublec=-0.064;inti;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}voidLUfenjie(double(*C)[501]){intk,t,j;intr=2,s=2;doublesum;intminn(int,int);intmaxx(int,int);for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
cout<<"λ[s]="<:scientific)<//程序四:求A的与数u最接近的特征值for(k=1;k<40;k++){uu=r[0]+k*(r[1]-r[0])/40;cout<<"最接近u["<<:scientific)<}//程序五:谱范数的条件数是绝对值最大的特征值除以绝对值最小的特征值的绝对值cout<<"cond(A)2="<//程序六:A的行列式的值就是A分解成LU之U的对角线的乘积yasuo(a,vv);LUfenjie(vv);uu=1;for(i=0;i<501;i++){uu=uu*vv[2][i];}cout<<"Det(A)="<return1;}doublemifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1}for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(v2+weiyi);}doublefanmifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[501];doubleC[5][501];voidyasuo(double*A,double(*C)[501]);voidLUfenjie(double(*C)[501]);voidqiuU(double(*C)[501],double*y,double*u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(1/v2+weiyi);}voidyasuo(double*A,double(*C)[501]){doubleb=0.16;doublec=-0.064;inti;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}voidLUfenjie(double(*C)[501]){intk,t,j;intr=2,s=2;doublesum;intminn(int,int);intmaxx(int,int);for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
scientific)<//程序四:求A的与数u最接近的特征值for(k=1;k<40;k++){uu=r[0]+k*(r[1]-r[0])/40;cout<<"最接近u["<<:scientific)<}//程序五:谱范数的条件数是绝对值最大的特征值除以绝对值最小的特征值的绝对值cout<<"cond(A)2="<//程序六:A的行列式的值就是A分解成LU之U的对角线的乘积yasuo(a,vv);LUfenjie(vv);uu=1;for(i=0;i<501;i++){uu=uu*vv[2][i];}cout<<"Det(A)="<return1;}doublemifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1}for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(v2+weiyi);}doublefanmifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[501];doubleC[5][501];voidyasuo(double*A,double(*C)[501]);voidLUfenjie(double(*C)[501]);voidqiuU(double(*C)[501],double*y,double*u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(1/v2+weiyi);}voidyasuo(double*A,double(*C)[501]){doubleb=0.16;doublec=-0.064;inti;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}voidLUfenjie(double(*C)[501]){intk,t,j;intr=2,s=2;doublesum;intminn(int,int);intmaxx(int,int);for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
//程序四:
求A的与数u最接近的特征值
for(k=1;k<40;k++)
uu=r[0]+k*(r[1]-r[0])/40;
cout<<"最接近u["<<:scientific)<}//程序五:谱范数的条件数是绝对值最大的特征值除以绝对值最小的特征值的绝对值cout<<"cond(A)2="<//程序六:A的行列式的值就是A分解成LU之U的对角线的乘积yasuo(a,vv);LUfenjie(vv);uu=1;for(i=0;i<501;i++){uu=uu*vv[2][i];}cout<<"Det(A)="<return1;}doublemifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1}for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(v2+weiyi);}doublefanmifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[501];doubleC[5][501];voidyasuo(double*A,double(*C)[501]);voidLUfenjie(double(*C)[501]);voidqiuU(double(*C)[501],double*y,double*u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(1/v2+weiyi);}voidyasuo(double*A,double(*C)[501]){doubleb=0.16;doublec=-0.064;inti;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}voidLUfenjie(double(*C)[501]){intk,t,j;intr=2,s=2;doublesum;intminn(int,int);intmaxx(int,int);for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
<:scientific)<}//程序五:谱范数的条件数是绝对值最大的特征值除以绝对值最小的特征值的绝对值cout<<"cond(A)2="<//程序六:A的行列式的值就是A分解成LU之U的对角线的乘积yasuo(a,vv);LUfenjie(vv);uu=1;for(i=0;i<501;i++){uu=uu*vv[2][i];}cout<<"Det(A)="<return1;}doublemifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1}for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(v2+weiyi);}doublefanmifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[501];doubleC[5][501];voidyasuo(double*A,double(*C)[501]);voidLUfenjie(double(*C)[501]);voidqiuU(double(*C)[501],double*y,double*u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(1/v2+weiyi);}voidyasuo(double*A,double(*C)[501]){doubleb=0.16;doublec=-0.064;inti;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}voidLUfenjie(double(*C)[501]){intk,t,j;intr=2,s=2;doublesum;intminn(int,int);intmaxx(int,int);for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
scientific)<}//程序五:谱范数的条件数是绝对值最大的特征值除以绝对值最小的特征值的绝对值cout<<"cond(A)2="<//程序六:A的行列式的值就是A分解成LU之U的对角线的乘积yasuo(a,vv);LUfenjie(vv);uu=1;for(i=0;i<501;i++){uu=uu*vv[2][i];}cout<<"Det(A)="<return1;}doublemifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1}for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(v2+weiyi);}doublefanmifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[501];doubleC[5][501];voidyasuo(double*A,double(*C)[501]);voidLUfenjie(double(*C)[501]);voidqiuU(double(*C)[501],double*y,double*u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(1/v2+weiyi);}voidyasuo(double*A,double(*C)[501]){doubleb=0.16;doublec=-0.064;inti;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}voidLUfenjie(double(*C)[501]){intk,t,j;intr=2,s=2;doublesum;intminn(int,int);intmaxx(int,int);for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
//程序五:
谱范数的条件数是绝对值最大的特征值除以绝对值最小的特征值的绝对值
cout<<"cond(A)2="<//程序六:A的行列式的值就是A分解成LU之U的对角线的乘积yasuo(a,vv);LUfenjie(vv);uu=1;for(i=0;i<501;i++){uu=uu*vv[2][i];}cout<<"Det(A)="<return1;}doublemifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1}for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(v2+weiyi);}doublefanmifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[501];doubleC[5][501];voidyasuo(double*A,double(*C)[501]);voidLUfenjie(double(*C)[501]);voidqiuU(double(*C)[501],double*y,double*u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(1/v2+weiyi);}voidyasuo(double*A,double(*C)[501]){doubleb=0.16;doublec=-0.064;inti;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}voidLUfenjie(double(*C)[501]){intk,t,j;intr=2,s=2;doublesum;intminn(int,int);intmaxx(int,int);for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
//程序六:
A的行列式的值就是A分解成LU之U的对角线的乘积
yasuo(a,vv);
LUfenjie(vv);
uu=1;
for(i=0;i<501;i++)
uu=uu*vv[2][i];
cout<<"Det(A)="<return1;}doublemifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1}for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(v2+weiyi);}doublefanmifayunsuan(double*a,doubleweiyi){inti,k;doubleb=0.16;doublec=-0.064;doubleee,w,v1,v2,mm,sum;doubleu[501];doubley[501];doubleC[5][501];voidyasuo(double*A,double(*C)[501]);voidLUfenjie(double(*C)[501]);voidqiuU(double(*C)[501],double*y,double*u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if(weiyi!=0){for(i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if(weiyi!=0){for(i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return(1/v2+weiyi);}voidyasuo(double*A,double(*C)[501]){doubleb=0.16;doublec=-0.064;inti;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}voidLUfenjie(double(*C)[501]){intk,t,j;intr=2,s=2;doublesum;intminn(int,int);intmaxx(int,int);for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
return1;
doublemifayunsuan(double*a,doubleweiyi)
doubleb=0.16;
doublec=-0.064;
doubleee,w,v1,v2,mm,sum;
doubleu[501];
doubley[505]={0};
for(i=0;i<501;i++)u[i]=1;
//给u赋初值
if(weiyi!
=0)
a[i]-=weiyi;
ee=1;k=0;
//使得初始计算时进入循环语句
while(ee>1e-12)
mm=0;
mm=mm+u[i]*u[i];
w=sqrt(mm);
y[i+2]=u[i]/w;
//注意此处编程与书上不同,之后会解释它的巧妙之处1
u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];
//1显然巧妙之处凸显出来
sum=0;
sum+=y[i+2]*u[i];
v1=v2;
v2=sum;
//去除特殊情况,减少漏洞
if(k==0)
k++;
else
ee=fabs(v2-v1)/fabs(v2);
a[i]+=weiyi;
}//还原A矩阵
return(v2+weiyi);
doublefanmifayunsuan(double*a,doubleweiyi)
doubley[501];
doubleC[5][501];
voidqiuU(double(*C)[501],double*y,double*u);
//把A阵压缩到C阵中
u[i]=1;//给u赋初值
yasuo(a,C);
LUfenjie(C);
ee=1;k=0;//使得初始计算时进入循环语句
y[i]=u[i]/w;
qiuU(C,y,u);
sum+=y[i]*u[i];
ee=fabs(1/v2-1/v1)/fabs(1/v2);
return(1/v2+weiyi);
voidyasuo(double*A,double(*C)[501])
inti;
C[0][i]=c;
C[1][i]=b;
C[2][i]=A[i];
C[3][i]=b;
C[4][i]=c;
voidLUfenjie(double(*C)[501])
intk,t,j;
intr=2,s=2;
doublesum;
intminn(int,int);
intmaxx(int,int);
for(k=0;k<501;k++)
for(j=k;j<=minn(k+s,501-1);j++)
if(k==0)sum=0;
for(t=maxx(k-r,j-s);t{sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
sum=sum+C[k-t+s][t]*C[t-j+s][j];
C[k-j+s][j]=C[k-j+s][j]-sum;
for(j=k+1;j<=minn(k+r,501-1);j++)
if(k<501-1)
for(t=maxx(j-r,k-s);t{sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}voidqiuU(double(*C)[501],double*y,double*u){inti,t;doubleb[501];doublesum;intr=2,s=2;intminn(int,int);intmaxx(int,int);for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t{sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}intminn(intx,inty){intmin;if(x>y)min=y;elsemin=x;returnmin;}intmaxx(intb,intc){intmax;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}returnmax;}三、特征值以及的值λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.093483808675e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.066103226595e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.041090018133e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.091378510451e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
sum=sum+C[j-t+s][t]*C[t-k+s][k];
C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];
voidqiuU(double(*C)[501],double*y,double*u)
inti,t;
doubleb[501];
b[i]=y[i];
for(i=1;i<501;i++)
for(t=maxx(0,i-r);t
sum=sum+C[i-t+s][t]*b[t];
b[i]=b[i]-sum;
u[500]=b[500]/C[s][500];
for(i=501-2;i>=0;i--)
for(t=i+1;t<=minn(i+s,500);t++)
sum=sum+C[i-t+s][t]*u[t];
u[i]=(b[i]-sum)/C[s][i];
intminn(intx,inty)
intmin;
if(x>y)
min=y;
min=x;
returnmin;
intmaxx(intb,intc)
intmax;
if(b>c)
if(b>0)
max=b;
max=0;
if(c>0)
max=c;
returnmax;
三、特征值以及的值
λ[1]=-1.070011361502e+001λ[501]=9.724634098777e+000
λ[s]=-5.557910794230e-003
最接近u[1]的特征值为-1.018293403315e+001
最接近u[2]的特征值为-9.585707425068e+000
最接近u[3]的特征值为-9.172672423928e+000
最接近u[4]的特征值为-8.652284007898e+000
最接近u[5]的特征值为-8.093483808675e+000
最接近u[6]的特征值为-7.659405407692e+000
最接近u[7]的特征值为-7.119684648691e+000
最接近u[8]的特征值为-6.611764339397e+000
最接近u[9]的特征值为-6.066103226595e+000
最接近u[10]的特征值为-5.585101052628e+000
最接近u[11]的特征值为-5.114083529812e+000
最接近u[12]的特征值为-4.578872176865e+000
最接近u[13]的特征值为-4.096470926260e+000
最接近u[14]的特征值为-3.554211215751e+000
最接近u[15]的特征值为-3.041090018133e+000
最接近u[16]的特征值为-2.533970311130e+000
最接近u[17]的特征值为-2.003230769563e+000
最接近u[18]的特征值为-1.503557611227e+000
最接近u[19]的特征值为-9.935586060075e-001
最接近u[20]的特征值为-4.870426738850e-001
最接近u[21]的特征值为2.231736249575e-002
最接近u[22]的特征值为5.324174742069e-001
最接近u[23]的特征值为1.052898962693e+000
最接近u[24]的特征值为1.589445881881e+000
最接近u[25]的特征值为2.060330460274e+000
最接近u[26]的特征值为2.558075597073e+000
最接近u[27]的特征值为3.080240509307e+000
最接近u[28]的特征值为3.613620867692e+000
最接近u[29]的特征值为4.091378510451e+000
最接近u[30]的特征值为4.603035378279e+000
最接近u[31]的特征值为5.132924283898e+000
最接近u[32]的特征值为5.594906348083e+000
最接近u[33]的特征值为6.080933857027e+000
最接近u[34]的特征值为6.680354092112e+000
最接近u[35]的特征值为7.293877448127e+000
最接近u[36]的特征值为7.717111714236e+000
最接近u[37]的特征值为8.225220014050e+000
最接近u[38]的特征值为8.648666065193e+000
最接近u[39]的特征值为9.254200344575e+000
cond(A)2=1.925204273902e+003Det(A)=2.772786141752e+118
四、现象讨论
在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。
通过总结和分析原因,本作业的矩阵是个带状的矩阵,当只赋予u某些分量值时,可能在给定精度条件下不能将u完全转移到特征向量的情况,由此使得计算结果出现较大误差。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1