文档详情

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

发布:2025-04-11约5千字共7页下载文档
文本预览下载声明

数值分析作业第一题

算法设计方案

利用带状Dollittle分解,将A[501][501]转存到数组C[5][501],以节省存储空间

1、计算λ1和λ501

首先使用幂法求出矩阵的按模最大的特征值λ0:如果λ00,则其必为按模最大值,因此λ501=λ0,然后采用原点平移法,平移量为λ501,使用幂法迭代求出矩阵A-λ501I的按模最大的特征值,其特征值按从小到大排列应为λ1-λ501、λ2-λ501、……、。因此A-λ501I的按模最大的特征值应为λ1-λ501。又因为λ501的值已求得,由此可直接求出λ1。

2、计算λS

λS为矩阵A按模最小的特征值,可以通过反幂法直接求出。

3、计算λik

λik是对矩阵A进行λik平移后,再用反幂法求出按模最小的特征值λmin,λik=λik+λmin。

4、计算矩阵A的条件数计算cond(A)2和行列式det(A)

矩阵A的条件数为,其中λ1和λn分别是矩阵A的模最大和最小特征值,直接利用上面求得的结果直接计算。

矩阵A的行列式可先对矩阵A进行LU分解后,det(A)等于U所有对角线上元素的乘积。

二、源程序:

#includemath.h

#includestdio.h

#includestdlib.h

#includeiostream.h

#defines2

#definer2

intMax(intv1,intv2);

intMin(intv1,intv2);

intmaxt(intv1,intv2,intv3);

voidstorage(doubleC[5][501],doubleb,doublec);

doublemifa(doubleC[5][501]);

voidLU(doubleC[5][501]);

doublefmifa(doubleC[5][501]);

intMax(intv1,intv2)//求两个数的最大值

{ return((v1v2)?v1:v2);

}

intMin(intv1,intv2)//求两个数最小值

{ return((v1v2)?v1:v2);

}

intmaxt(intv1,intv2,intv3)//求三个数最大值

{intt;

if(v1v2)t=v1;

elset=v2;

if(tv3)t=v3;

return(t);

}

/***将矩阵值转存在一个数组里,以节省存储空间***/

voidstorage(doubleC[5][501],doubleb,doublec)

{ inti=0,j=0;

C[i][j]=0,C[i][j+1]=0;

for(j=2;j=500;j++)

C[i][j]=c;

i++;

j=0;

C[i][j]=0;

for(j=1;j=500;j++)

C[i][j]=b;

i++;

for(j=0;j=500;j++)

C[i][j]=(1.64-0.024*(j+1))*sin(0.2*(j+1))-0.64*exp(0.1/(j+1));

i++;

for(j=0;j=499;j++)

C[i][j]=b;

C[i][j]=0;

i++;

for(j=0;j=498;j++)

C[i][j]=c;

C[i][j]=0,C[i][j+1]=0;

}

//用于求解最大的特征值,幂法

doublemifa(doubleC[5][501])

{ intm=0,i,j;

doubleb2,b1=0,sum;

doubleu[501],y[501];

for(i=0;i501;i++)

{u[i]=1.0;

}

do

{ sum=0;

if(m!=0)b1=b2;

m++;

for(i=0;i=500;i++)

sum+=u[i]*u[i];

for(i=0;i=500;i++)

y[i]=u[i]/sqrt(sum);

for(i=0;i=500;i++)

{u[i]=0;

for(j=Max(i-r,0);j=Min(i+s,500);j++)

u[i]=u[i]+C[i-j+s][j]*y[j];

}

b2=0;

for(i=0;i=500;i++)

b2=b2+y[i]*u[i];

}

while(fabs(b2-b1)/fabs(b2)=1.0e-12)

显示全部
相似文档