数值分析第一次大作业Word下载.docx
《数值分析第一次大作业Word下载.docx》由会员分享,可在线阅读,更多相关《数值分析第一次大作业Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
![数值分析第一次大作业Word下载.docx](https://file1.bdocx.com/fileroot1/2022-10/29/b7cb1cb0-ce29-4424-9a82-a987f1d61bce/b7cb1cb0-ce29-4424-9a82-a987f1d61bce1.gif)
其中,反幂法每迭代一次都要求解线性方程组,由于矩阵A为带状矩阵,故可用三角分解法解带状线性方程组的方法求解得到。
2、求的与数最接近的特征值
1)令矩阵,利用反幂法计算出矩阵按模最小的特征值,则。
3、求的(谱范数)条件数cond()2和行列式det
1),前文已算出和,直接带入即可。
2)反幂法计算时,已经对矩阵A进行过Doolittle分解,得到A=LU。
而L为对角线上元素全为1的下三角矩阵,U为上三角矩阵,可知,,即有。
最后,为节省存储量,需对矩阵进行压缩,将中带内元素存储为数组。
二、源程序代码
#include<
windows.h>
iostream>
iomanip>
math.h>
usingnamespacestd;
#defineN501
#defineK39
#definer2
#defines2
#defineEPSI1.0e-12
//求两个整数中的最大值
intint_max2(inta,intb)
{
return(a>
b?
a:
b);
}
//求两个整数中的最小值
intint_min2(inta,intb)
return(a<
//求三个整数中的最大值
intint_max3(inta,intb,intc)
intt;
if(a>
b)
t=a;
elset=b;
if(t<
c)t=c;
return(t);
//定义向量内积
doubledianji(doublex[],doubley[])
doublesum=0;
for(inti=0;
i<
N;
i++)
sum=sum+x[i]*y[i];
return(sum);
//计算两个数之间的相对误差
doubleerro(doublelamd0,doublelamd1)
doublee,d,l;
e=fabs(lamd1-lamd0);
d=fabs(lamd1);
l=e/d;
return(l);
//矩阵A的压缩存储初始化成C
voidinit_c(doublec[][N])
inti,j;
for(i=0;
r+s+1;
for(j=0;
j<
j++)
if(i==0||i==4)
c[i][j]=-0.064;
elseif(i==1||i==3)
c[i][j]=0.16;
else
c[i][j]=(1.64-0.024*(j+1))*sin(0.2*(j+1))-0.64*exp(0.1/(j+1));
//矩阵复制
voidfuzhi_c(doublec_const[][N],doublec[][N])
c[i][j]=c_const[i][j];
//LU三角分解
voidLUDet_c(doublec_const[][N],doublec_LU[][N])
doublesum;
intk,i,j;
fuzhi_c(c_const,c_LU);
for(k=1;
k<
=N;
k++)
{
for(j=k;
j<
=int_min2(k+s,N);
{
sum=0;
for(i=int_max3(1,k-r,j-s);
i<
=k-1;
sum+=c_LU[k-i+s][i-1]*c_LU[i-j+s][j-1];
c_LU[k-j+s][j-1]-=sum;
}
for(j=k+1;
=int_min2(k+r,N);
for(i=int_max3(1,j-r,k-s);
sum+=c_LU[j-i+s][i-1]*c_LU[i-k+s][k-1];
c_LU[j-k+s][k-1]=(c_LU[j-k+s][k-1]-sum)/c_LU[s][k-1];
}
//三角分解法解带状线性方程组
voidjiefc(doublec_const[][N],doubleb_const[],doublex[])
doubleb[N],c_LU[r+s+1][N],sum;
b[i]=b_const[i];
LUDet_c(c_const,c_LU);
for(i=2;
sum=0;
for(j=int_max2(i-2,1);
=i-1;
sum+=c_LU[i-j+2][j-1]*b[j-1];
b[i-1]-=sum;
x[N-1]=b[N-1]/c_LU[2][N-1];
for(i=N-1;
i>
=1;
i--)
for(j=i+1;
=int_min2(i+2,N);
sum+=c_LU[i-j+2][j-1]*x[j-1];
x[i-1]=(b[i-1]-sum)/c_LU[2][i-1];
//幂法求按模最大特征值
doublemifa_c(doublec_const[][N])
doubleu[N],y[N];
doublesum,length_u,beta0,beta1;
i++)//迭代初始向量
u[i]=0.5;
length_u=sqrt(dianji(u,u));
y[i]=u[i]/length_u;
for(i=1;
sum=sum+c_const[i-j+2][j-1]*y[j-1];
u[i-1]=sum;
beta1=dianji(u,y);
do
beta0=beta1;
length_u=sqrt(dianji(u,u));
for(i=0;
y[i]=u[i]/length_u;
for(i=1;
for(j=int_max2(i-2,1);
sum=sum+c_const[i-j+2][j-1]*y[j-1];
u[i-1]=sum;
beta1=dianji(u,y);
}while(erro(beta0,beta1)>
=EPSI);
return(beta1);
//反幂法求按模最小特征值
doublefmifa_c(doublec_const[][N])
doublelength_u,beta0,beta1;
inti;
jiefc(c_const,y,u);
beta1=dianji(y,u);
jiefc(c_const,y,u);
beta1=dianji(y,u);
beta1=1/beta1;
//计算lamd_1、lamd_501、lamd_s
voidcalculate1(doublec_const[][N],double&
lamd_1,double&
lamd_501,double&
lamd_s)
doublelamd_mifa0,lamd_mifa1,c[r+s+1][N];
lamd_mifa0=mifa_c(c_const);
fuzhi_c(c_const,c);
c[2][i]=c[2][i]-lamd_mifa0;
lamd_mifa1=mifa_c(c)+lamd_mifa0;
if(lamd_mifa0<
lamd_mifa1)
lamd_1=lamd_mifa0;
lamd_501=lamd_mifa1;
else
lamd_501=lamd_mifa0;
lamd_1=lamd_mifa1;
lamd_s=fmifa_c(c_const);
//平移+反幂法求最接近u_k的特征值
voidcalculate2(doublec_const[][N],doublelamd_1,doublelamd_501,doublelamd_k[])
i