计算实习报告1Word格式文档下载.docx
- 文档编号:20006844
- 上传时间:2023-01-14
- 格式:DOCX
- 页数:15
- 大小:45.54KB
计算实习报告1Word格式文档下载.docx
《计算实习报告1Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算实习报告1Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
,对该矩阵应用反幂法求得
,则与
最接近的A的特征值为:
重复以上过程39次即可求得
(k=0,1,…39)的值。
③求A的(谱范数)条件数
和行列式
在
(1)中用反幂法求矩阵A的按模最小特征值时,要用到Doolittle分解方法,在Doolittle分解完成后得到的两个矩阵分别为L和U,则A的行列式可由U阵求出,即:
det(A)=det(U)。
求得det(A)不为0,因此A为非奇异的实对称矩阵,则:
分别为模最大特征值与模最小特征值。
2、程序源代码:
#include"
Stdio.h"
Conio.h"
math.h"
//****************************************************************************//
//在存储带状矩阵时,下面的几个量在程序中反复用到,为方便编程故把它们定义成宏.//
//M:
转换后的矩阵的行数,M=R+S+1。
//
//N:
转换后的矩阵的列数,与原矩阵列数相等。
//S:
上半带宽。
//R:
下半带宽。
//Epsilon:
用来指定求解精度。
#defineM5
#defineN501
#defineR2
#defineS2
#defineEpsilon0.000000000001
voidCreat_MatrixA(doublearray[M+1][N+1]);
voidLoad_MatrixA(doublearrayA[M+1][N+1],doublearrayB[M+1][N+1]);
voidLoad_vectoru(doubleu[N+1]);
doubleMifa(doubleu[N+1],doublearray[M+1][N+1]);
doubleFanmifa(doubleu[N+1],doublearrayA[N+1][N+1]);
voidSolution_Yushu(doublearray[N+1][N+1],doubleu[N+1],doublenamda1,doublenamda501);
voidDoolittle_Dai(doublearray[M+1][N+1]);
voidBack_Doolittle_Dai(doublearray[M+1][N+1],doubley[N+1],doublex[N+1]);
doublemax(doublea,doubleb);
doublemin(doublea,doubleb);
main(void)
{
//定义主程序中用到的变量//
//MatrixA:
用来存储源矩阵A。
//arrayA:
用反幂法求矩阵的按模最小特征值时,矩阵的数据会被更改。
//因此实际计算中,使用源矩阵A的拷贝arrayA。
//u:
用来存放迭代向量,初始化后的u里存储的是初始迭代向量。
//u_k:
u_k=λ
(1)+k*(λ(501)-λ
(1))/40,用来存储A的与数。
//cond(A):
用来存储A的条件数cond(A)=λ(max)/λ(s)。
//det_A:
用来存储A的行列式的值。
doubleMatrixA[M+1][N+1],arrayA[M+1][N+1],u[N+1];
doublenamdas=0,namda1=0,namda2=0,namda501=0;
doublecond_A,det_A=1;
inti;
/*调用函数Creat_MatrixA生成带状矩阵A*/
Creat_MatrixA(MatrixA);
//求矩阵A的最小、最大和按模最小的特征值//
printf("
/***********************************************************/\n"
);
矩阵A的两端特征值及按模最小特征值分别为:
\n"
/*求λ(s):
加载矩阵A,对A用反幂法*/
Load_MatrixA(MatrixA,arrayA);
Load_vectoru(u);
namdas=Fanmifa(u,arrayA);
/*利用反幂法进行Doolittle分解得到的U阵求矩阵A的行列式的值:
det(A)=det(U)*/
for(i=1;
i<
=N;
i++)
det_A*=arrayA[S+1][i];
/*重新加载矩阵A,对A用幂法求得A的按模最大特征值λ(m1)*/
namda1=Mifa(u,arrayA);
/*计算B=A+λ(m1)I,并对B用反幂法求得λ(m2)*/
arrayA[S+1][i]+=namda1;
/*调用反幂法,求变换矩阵的按模最小特征值*/
namda2=Fanmifa(u,arrayA);
namda501=namda2-namda1;
λ
(1)=%.12e\nλ(501)=%.12e\nλ(s)=%.12e\n"
min(namda1,namda501),max(namda1,namda501),namdas);
//求和A的与数最接近的特征值的大小//
和A的与数最接近的特征值λ(i_k)分别为:
/*调用求和A的与数最接近的特征值的大小子函数*/
Solution_Yushu(MatrixA,u,namda1,namda501);
//求矩阵A的条件数cond(A)和行列式的值det(A)//
cond_A=fabs(max(namda1,namda501)/namdas);
矩阵A的条件数:
cond(A)=%.12e\n"
cond_A);
A的行列式的值为:
det(A)=%.12e\n"
det_A);
getch();
return0;
}
/*创建源矩阵A,按带状特征存储*/
voidCreat_MatrixA(doublearray[M+1][N+1])
inti,j;
for(i=0;
=M;
for(j=0;
j<
j++)array[i][j]=0;
for(j=3;
j++)array[1][j]=-0.064;
for(j=2;
j++)array[2][j]=0.16;
for(j=1;
j++)array[3][j]=(1.64-0.024*j)*sin(0.2*j)-0.64*exp(0.1/j);
=N-1;
j++)array[4][j]=0.16;
=N-2;
j++)array[5][j]=-0.064;
/*输出矩阵A各元素,测试创建矩阵是否正确*/
/*
j++)printf("
%lf"
array[i][j]);
*/
/*生成矩阵A的拷贝,避免计算过程中对源矩阵A的修改*/
voidLoad_MatrixA(doublearrayA[M+1][N+1],doublearrayB[M+1][N+1])
j++)arrayB[i][j]=arrayA[i][j];
/*测试输出矩阵A的拷贝,看加载是否正确*/
%f"
arrayB[i][j]);
/*给出迭代初始向量u0*/
voidLoad_vectoru(doubleu[N+1])
=200;
i++)u[i]=1;
for(i=201;
i++)u[i]=0;
/*测试输出迭代初始向量u*/
i++)printf("
u[i]);
/*幂法*/
doubleMifa(doubleu[N+1],doublearray[M+1][N+1])
/*定义变量:
ita表示η,beta表示β(也即是按模最大的λ值)*/
doubleita=0,beta=0,y[N+1],temp=0,namda0=-1;
inti,j,flag;
flag=0;
while(fabs(beta-namda0)>
Epsilon||flag<
900)
{
namda0=beta;
ita=beta=0;
i++)ita+=u[i]*u[i];
ita=sqrt(ita);
/*计算向量y:
y_k-1=u_k-1/η_k-1*/
i++)y[i]=u[i]/ita;
/*计算向量u:
u_k=A(y_k-1)*/
/*
经过转转换后的带状矩阵A,在与向量的乘法中按元素位置,
在左上角、中间和右下角三个地方分别表现出不同的下标变化规律。
*/
{
if(i<
=2)
{
=i+2;
j++)temp+=array[i-j+S+1][j]*y[j];
u[i]=temp;
temp=0;
}
if(i>
=3&
&
=499)
for(j=i-2;
=500)
}
i++)beta+=y[i]*u[i];
flag++;
/*测试输出用幂法求得的λ*/
λ=%.12e\n"
beta);
returnbeta;
/*反幂法*/
doubleFanmifa(doubleu[N+1],doublearray[N+1][N+1])
doubleita=0,beta=0,y[N+1],namda0=-1;
/*在这里ita表示η,beta表示β*/
inti,flag;
/*y_k-1=u_k-1/η_k-1*/
用flag作为是否进行Doolittle分解的标志。
当flag=0时,是第一次进入反幂法求解子函数,要进行Doolittle分解。
Doolittle分解完成后随即进行回代求解:
Au_k=y_k-1
*/
if(flag==0)Doolittle_Dai(array);
Back_Doolittle_Dai(array,y,u);
/*测试用反幂法输出求得的λ*/
1/beta);
return1/beta;
/*带状矩阵的Doolittle分解*/
voidDoolittle_Dai(doublearray[M+1][N+1])
intk,i,j,t;
doubletemp;
for(k=1;
k<
k++)
for(j=k;
=min(k+S,N);
j++)
for(t=max(max(1,k-R),j-S);
t<
=k-1;
t++)temp+=array[k-t+S+1][t]*array[t-j+S+1][j];
array[k-j+S+1][j]=array[k-j+S+1][j]-temp;
for(i=k+1;
=min(k+R,N);
for(t=max(max(1,i-R),k-S);
t++)temp+=array[i-t+S+1][t]*array[t-k+S+1][k];
array[i-k+S+1][k]=(array[i-k+S+1][k]-temp)/array[S+1][k];
/*带状矩阵Doolittle分解的回代过程*/
array[M+1][N+1]:
用来传递经过Dolittle分解后的矩阵A。
b[N+1]:
用作向量y的拷贝,避免在回代过程中造成对y的修改。
voidBack_Doolittle_Dai(doublearray[M+1][N+1],doubley[N+1],doublex[N+1])
inti,t;
doubletemp,b[N+1];
i++)b[i]=y[i];
for(i=2;
for(t=max(1,i-R);
=i-1;
t++)temp+=array[i-t+S+1][t]*b[t];
b[i]=b[i]-temp;
x[N]=b[N]/array[S+1][N];
for(i=N-1;
i>
=1;
i--)
for(t=i+1;
=min(i+S,N);
t++)temp+=array[i-t+S+1][t]*x[t];
x[i]=(b[i]-temp)/array[S+1][i];
/*求和A的与数最接近的特征值的大小*/
A的与数uk=λ
(1)+k*(λ(501)-λ
(1))/40。
求矩阵A与uk(k=1,2,……39)最接近的特征值,先求A的原点平移矩阵A-ukI,
再求A-ukI按模最小特征值,最后将该特征值加上反向平移量uk。
voidSolution_Yushu(doubleMatrixA[M+1][N+1],doubleu[N+1],doublenamda1,doublenamda501)
inti,k;
doubleu_k,namda,array[M+1][N+1];
=39;
/*平移量不同,反幂法的对象A-ukI就不一样,因此要重新加载A阵*/
Load_MatrixA(MatrixA,array);
u_k=namda1+(namda501-namda1)*k/40;
i++)array[S+1][i]-=u_k;
namda=Fanmifa(u,array);
namda=u_k+namda;
λ(i_%d)=%.12e\n"
k,namda);
/*求两个数中的最大、最小值*/
max(a,b):
返回a、b中的较大值。
min(a,b):
返回a、b中的较小值。
doublemin(doublea,doubleb)
if(a<
=b)returna;
elsereturnb;
doublemax(doublea,doubleb)
if(a>
3、程序运行结果:
/***********************************************************/
λ
(1)=-1.070011361514e+001
λ(501)=9.724634099672e+000
λ(s)=-5.557910794214e-003
λ(i_1)=-1.018293403315e+001
λ(i_2)=-9.581110544848e+000
λ(i_3)=-9.172672423928e+000
λ(i_4)=-8.652284007898e+000
λ(i_5)=-8.093483808675e+000
λ(i_6)=-7.659405407692e+000
λ(i_7)=-7.119684648691e+000
λ(i_8)=-6.611764339397e+000
λ(i_9)=-6.066103226595e+000
λ(i_10)=-5.585101052628e+000
λ(i_11)=-5.114083529812e+000
λ(i_12)=-4.578872176865e+000
λ(i_13)=-4.096470926260e+000
λ(i_14)=-3.554211215751e+000
λ(i_15)=-3.041090018133e+000
λ(i_16)=-2.533970311130e+000
λ(i_17)=-2.003230769564e+000
λ(i_18)=-1.503557611227e+000
λ(i_19)=-9.935586060075e-001
λ(i_20)=-4.870426738850e-001
λ(i_21)=2.231736249575e-002
λ(i_22)=5.324174742069e-001
λ(i_23)=1.052898962693e+000
λ(i_24)=1.589445881881e+000
λ(i_25)=2.059487502799e+000
λ(i_26)=2.558075597073e+000
λ(i_27)=3.080240509307e+000
λ(i_28)=3.613620867692e+000
λ(i_29)=4.091378510451e+000
λ(i_30)=4.603035378279e+000
λ(i_31)=5.132924283898e+000
λ(i_32)=5.594906348083e+000
λ(i_33)=6.080933857027e+000
λ(i_34)=6.680354092112e+000
λ(i_35)=7.293877448126e+000
λ(i_36)=7.717111714236e+000
λ(i_37)=8.225220014050e+000
λ(i_38)=8.648666065194e+000
λ(i_39)=9.254200344575e+000
cond(A)=1.749692368182e+003
det(A)=2.772786141752e+1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算 实习 报告