设有的矩阵。
其中矩阵的特征值满足 ,试求:
1. 的值。
2. 的与数最接近的特征值。
3. 的(谱范数)条件数和行列式。
1. 算法的设计方案
本题的核心算法是幂法、带原点平移的幂法、反幂法和lu分解法,要点在于选择算法时,应使的所有零元素都不存储。故算法设计的思路如下,第一步,对使用幂法(powermethod),可得的按模最大的特征值,记为;
第二步,对使用带有原点平移的幂法,令平移量,可得另一端点的特征值记为;
第三步,比较与的大小,根据条件可知, ;
第四步,对使用反幂法(inversepowermethod),可得的按模最小的特征值(使用lu杜立特尔分解法)
第五步,根据计算出,然后利用带有原点平移的反幂法求得,其中平移量,反幂法运算39次,可得;
第六步, 根据定义,非奇异的实对称矩阵的谱范数条件数,其中分别是矩阵的模为最大和模为最小的特征值,对于本题,则有;
第七步,由lu分解可知,,可得。
由于题目要求算法中所有零元素均不为0,故构造一个givevalue()函数为从一个的数组里为赋值。
2. 全部的源程序。
#include <>
#include <>
void init_a();初始化a
double givevalue(int,int);/为a中元素赋值。
double powermethod(double);/带原点平移的幂法。
double inversepowermethod(double);/带原点平移的反幂法。
int presolve(double);/三角lu分解。
int solve(double double 解方程组。
int max(int,int);
int min(int,int);
double (*u)[502]=new double[502][502];/上三角u数组。
double (*l)[502]=new double[502][502];/单位下三角l数组。
double a[6][502];/矩阵a
int main()
int i,k;
double lambdat1,lambdat2,lambda1,lambda501,lambdas,mu[40],det;
double lambda[40];
init_a();对a初始化。
lambdat1=powermethod(0);
lambdat2=powermethod(lambdat1);
lambda1=lambdat1 lambda501=lambdat1>lambdat2?lambdat1:lambdat2;
presolve(0);
lambdas=inversepowermethod(0);
det=1;
for(i=1;i<=501;i++)
det=det*u[i][i];
for (k=1;k<=39;k++)
mu[k]=lambda1+k*(lambda501-lambda1)/40;
presolve(mu[k]);
lambda[k]=inversepowermethod(mu[k]);
printf计算结果如下所示n");
printf("λ1.11e λ=1.11e",lambda1,lambda501);
printf("λs=%1.11e",lambdas);
printf("cond(a)=%1.11e",fabs(lambdat1/lambdas));
printf("deta=%1.11e ",det);
for (k=1;k<=39;k++)
printf("λi%d=%1.11e ",k,lambda[k]);if(k % 3==0) printf("");
void init_a()/对a初始化。
int i;
for (i=3;i<=501;i++)a[1][i]=a[5][502-i]=-0.064;
for (i=2;i<=501;i++)a[2][i]=a[4][502-i]=0.16;
for (i=1;i<=501;i++)a[3][i]=(1.64-0.024*i)*sin(0.2*i)-0.64*exp(0.1/i);
double givevalue(int i,int j)//为a中非零元赋值,if (abs(i-j)<=2) return a[i-j+3][j];else return 0;
double powermethod(double offset)//幂法。
int i,x1;
double u[502],y[502];
double beta=0,prebeta=-1000,yita=0;
for (i=1;i<=501;i++)
u[i]=1,y[i]=0;//给向量u赋初值
for (int k=1;k<=10000;k++)
prebeta=beta;beta=0;
for (i=1;i<=501;i++)beta=beta+ y[i]*u[i];
if (fabs((prebeta-beta)/beta)<=1e-12) ;
输出偏移量,误差,迭代次数。
return (beta+offset);
double inversepowermethod(double offset)//反幂法。
int i;
double u[502],y[502];
double beta=0,prebeta=0,yita=0;
for (i=1;i<=501;i++)
u[i]=1,y[i]=0; /给u赋初值
for (int k=1;k<=10000;k++)
/输出偏移量,误差,迭代次数。
return (beta+offset);
int presolve(double offset)//三角lu分解。
int i,k,j,t;
double sum;
for (k=1;k<=501;k++)
for (j=1;j<=501;j++)
x[501]=y[501]/u[501][501];
for (i=500;i>=1;i--)
return 0;
int max(int x,int y)
return (x>y?x:y);
int min(int x,int y)
return (x}
3. 计算结果。
计算结果如图1所示。
图1偏移量offset,误差err,迭代次数k也在结果中有所反应,部分结果如图2所示。
图24. 讨论迭代初始向量的选取对计算结果的影响,并说明原因。
在main程序中,为初始向量u赋初值得到上述结果。
下面改变初始向量u的赋值,观察计算结果的差异。
北航研究生数值分析A作业三
数值分析 a 计算实习题目三。一 题目。关于x,y,t,u,v,w的下列方程组。0.5cost u v w x 2.67 t 0.5sinu v w y 1.07 0.5t u cosv w x 3.74 t 0.5u v sinw y 0.79 以及关于z,t,u的下列二维数表。确定了一个二元函数...
北航研究生数值分析作业第二题
一 算法设计方案。1.按照题目给出的矩阵定义对矩阵a赋初值 对应的函数为a init 2.对矩阵a进行householder变换,使其拟上三角化 对应的函数为householder 3.输出拟上三角化后的a 对应的函数为aout int 4.对拟上三角化后的矩阵a使用带双步位移的qr分解法逐次迭代 ...
研究生数值分析作业题
11级研究生数值分析习题。第一章误差及相关问题。1.设的相对误差为,求的绝对误差。2.要使的相对误差不超过0.1 应取几位有效数字?解 知识点 有效数字和相对误差间的关系。因为的首位数字为4,设近视数有n位有效数字,所以有 令 解得 所以有4位有效数字。3.用x近似即最大为多少时,该近似计算的截断误...