北航数值分析作业第一题题解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

北航数值分析作业第一题:

一、算法设计方案

1.要求计算矩阵的最大最小特征值,通过幂法求得模最大的特征值,进行一定

判断即得所求结果;

2.求解与给定数值接近的特征值,可以该数做漂移量,新数组特征值倒数的绝

对值满足反幂法的要求,故通过反幂法即可求得;

3.反幂法计算时需要方程求解中间过渡向量,需设计Doolite分解求解;

4.|A|=|B||C|,故要求解矩阵的秩,只需将Doolite分解后的U矩阵的对角线相

乘即为矩阵的Det。

算法编译环境:vlsual c++6.0

需要编译函数:幂法,反幂法,Doolite分解及方程的求解

二、源程序如下:

#include

#include

#include

#include

int Max(int value1,int value2);

int Min(int value1,int value2);

void Transform(double A[5][501]);

double mifa(double A[5][501]);

void daizhuangdoolite(double A[5][501],double x[501],double b[501]); double fanmifa(double A[5][501]);

double Det(double A[5][501]);

/***定义2个判断大小的函数,便于以后调用***/

int Max(int value1,int value2)

{

return((value1>value2)?value1:value2);

}

int Min(int value1,int value2)

{

return ((value1

}

/*****************************************/

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

void Transform(double A[5][501],double b,double c)

{

int i=0,j=0;

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

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

A[i][j]=c;

i++;

j=0;

A[i][j]=0;

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

A[i][j]=b;

i++;

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

A[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++)

A[i][j]=b;

A[i][j]=0;

i++;

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

A[i][j]=c;

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

}

/***转存结束***/

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

double mifa(double A[5][501])

{

int s=2,r=2,m=0,i,j;

double b2,b1=0,sum,u[501],y[501];

for (i=0;i<=500;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]+A[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)>=exp(-12));

return b2;

}

//带状DOOLITE分解,并且求解出方程组的解

void daizhuangdoolite(double A[5][501],double x[501],double b[501]) {

int i,j,k,t,s=2,r=2;

double B[5][501],c[501];

for(i=0;i<=4;i++)

{

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

B[i][j]=A[i][j];

}

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

c[i]=b[i];

for(k=0;k<=500;k++)

{

for(j=k;j<=Min(k+s,500);j++)

{

for(t=Max(0,Max(k-r,j-s));t<=k-1;t++)

B[k-j+s][j]=B[k-j+s][j]-B[k-t+s][t]*B[t-j+s][j];

}

for(i=k+1;i<=Min(k+r,500);i++)

{

for(t=Max(0,Max(i-r,k-s));t<=k-1;t++)

B[i-k+s][k]=B[i-k+s][k]-B[i-t+s][t]*B[t-k+s][k];

B[i-k+s][k]=B[i-k+s][k]/B[s][k];

}

}

for(i=1;i<=500;i++)

for(t=Max(0,i-r);t<=i-1;t++)

c[i]=c[i]-B[i-t+s][t]*c[t];

x[500]=c[500]/B[s][500];

for(i=499;i>=0;i--)

{

x[i]=c[i];

for(t=i+1;t<=Min(i+s,500);t++)

相关文档
最新文档