- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数值分析大作业一
幕法反幕法求矩阵特征值
2014.11
尤万龙
PT1400133
数值分析大作业一
题目:
设有50泮501的实对称矩阵A
A=
?? c
??b
b 。501
0.1
其屮,勺=(1.64 —0.024i)sin(0.2i) —0.64e,(i = l,2,???,501), b=O.I6, c=?0.064。矩
阵A的特征值入(i = l,2,???,501),并且有
人 人「??5人(I入卜昙叭()
求的值
求A的与数从二人+R如二九最接近的特征值? (k = l,2,…,39)。
40 人
求A的(谱范数)条件数cond悶和行列式det Ao
算法设计
由于C语言小数组角标都是从0开始的,所以在数组MatrixC⑸[501] 屮检索A的带内元素aij的方法是:A的带内元素aij=C小的元素 ci-j+2, j o
由于X 1 X2- X501,所以在以所有特征值建立的数轴上,入1、入 501位于数轴的两端,两者Z—必为按模最大。利用幕法,可以求出来 按模最大的特征值,但该值可能为入1也可能为入501;
上步求出按模最大的特征值入M后,将原矩阵平移入M,再利用幕法求一 次平移后矩阵的按模最大的特征值,即是数轴上另一?端点值入o
比较入M与XM+XM7的大小,大的为矩阵A的最大特征值,小的为A 矩阵的最小的特征值;
利用反幕法,求矩阵A的按模最小的特征值。但是反幕法屮要用到线性 方程组的求解,而原矩阵A又是带状矩阵,采用LU分解。所以在这Z 前要定义一个LU分解子程序,将A矩阵分解为单位下三角矩阵L和上 三角矩阵U的乘积。
先利用循环求出k从1到39变化的uk的值。半循环次数为39吋,在 每次循环时都将压缩后的矩阵A的第三行减去相应的,然后调用LU分 解的子程序,利用反幕法求出与uk最接近的特征值,该特征值等于利 用反幕法求出的值与uk的和。
A的谱范数条件数等于按模最大的特征值的绝对值与按模最小的特征值 的绝对值之比,按模最人的特征值与按模最小的特征值已分别在前面求 出。
A的行列式的值就是矩阵A进行LU分解后U的对角线元素的乘积。先把 带状线性矩阵A[501] [501]转存为一个矩阵c[5] [501].
源程序
Aheader file comheader. hV
ttifndef COWIEADERJLTNCLUDED
ttdefine COMHEADER^INCLUDED
#includeios treani〉
#includeiomanip
ttincludecmat.h
#includefstremn〉
//^include matrixfuc. h
u s i ngname s pac e s t d;
constintcolumn size 二 501;
constdouble Err = 1. 0e~12;
ttendif
/* matrix function class declare matrixfuc. h */
ttpragmaonce
#includez,comheader. h〃
classmatri xfuc
{
public:
matrixfuc (void);
matrixfuc(void);
doublematrix init (); doublepower_ei g();
doubleinvpower eig(doubleMatB[5][column size]); voidmatrix LU(doubleMatB[5][column size]);
double matA[5][columns!ze];
}; ~
Arealization of matrixfucmatrixfuc. cpp */
#include matrixfuc.h
int int_max2(inta,int b);
int int_min2(inta,int b);
int int_max3(inta,intb,int c);
matrixfuc::matrixfuc(void)
{
}
matrixfuc::?m atrixfuc(void)
{
}
/*初始化矩阵*/
doublematrixfuc::matrix_init(void)
{
for(i=();i5;i++)
for(j=0;jcolumn_size;j++)
{
if(i==0lli==4)
{
matA[i][j]=-0.064;
}
else 讦(i==]||i==3)
matA[iJ|jJ=O .16;
else if(i==2)
{
matA[i][j]=( 1.64-0.024*(j+l ))*sin(0.2*(j+l)) -0.64*exp(0.1 /(j+1));
}
}
matA[OJ[OJ =
文档评论(0)