- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北航研可捣治鯝作业二
题目要求:
试用带双步位移的QR分解法求矩阵的全部特征值,并对其中的每一个实特征值求相应的特征向量。已知
说明:
1、求矩阵特征值时,要求迭代的精度水平为。
2、打印内容:
算法的设计方案。
全部源程序(要求注明主程序和每个子程序的功能)。
矩阵A经过拟上三角化后所得的矩阵。
对矩阵进行QR分解方法结束后所得的矩阵Q,R和RQ。
矩阵A的全部特征值,其中,如果是实数,则令。
A的相应于实特征值的特征向量。
3、采用e型输出数据,并且至少显示12位有效数字。
一、算法设计方案
1、输入需要求解的矩阵:
通过子程序getMatrix()生成需要的矩阵。
2、矩阵的拟上三角化:
为减少求解特征值和特征向量的计算量,在对矩阵进行QR分解前先进行拟上三角化。调用子程序void triangulation()。对a拟上三角化具体算法如下:
设,记,并记的第r列至第n列的元素为
,对于执行:
当此算法执行完后,就得到与原矩阵相似的拟上三角矩阵。
3、输出R、Q、RQ,通过子程序void print()实现,其中使用了矩阵的QR分解,由子程序void qrDecomposition()完成。QR分解具体算法如下:
记,并记,令
对于执行:
4、带双步位移的QR方法求特征值,由子程序void qrAlgorithm()完成。具体算法如下:
(1)化为拟上三角矩阵;给定精度水平和迭代最大型次数。
(2)记,令。
(3)如果,则得到的一个特征值,置(降阶),转(4);否则转(5)。
(4)如果,则得到的一个特征值,转(11);如果,则直接转(11);如果,则转(3)。
(5)求二阶子阵
的两个特征值和,即计算二次方程
的两个根和。
(6)如果,则得到的两个特征值和,转(11);否则转(7)。
(7)如果,则得到的两个特征值和,置(降阶),转(4);否则转(8)。
(8)如果,则计算终止,未得到的全部特征值;否则转(9)。
(9)记,计算
(10)置,转(3)。
(11)的全部特征值已计算完毕,停止计算。
5、使用列主元的高斯消去法求相应于实特征值的特征向量,由子程序void gaussianElimination()完成。具体算法如下:
根据特征值和特征向量的定义,设,是相应于特征值的特征向量,则有
, 即得
用列主元的高斯消去法解方程组则得特征向量。
设,有
用列主元的高斯消去法算法如下:
记,
a.消元过程:
对执行
(1)选行号,使。
(2)交换与。
(3)对于,计算
b.回代过程:
此算法执行完后,就得到相应的特征向量.
二、全部源程序
// shuzhifenxi2.cpp : Defines the entry point for the console application.
//
#includestdio.h
#includestdafx.h
#includemath.h
#define n 10
double precision=1.0e-12;
double a[n][n];
struct Eigenvalue //特征值结构定义,r为实部,i为虚部
{
double r;
double i;
};
Eigenvalue eigenvalue[n];
//生成矩阵A
void getMatrix()
{
int i,j;
for(i=0;in;i++)
for(j=0;jn;j++)
{
if(i!=j)
a[i][j]=sin(0.5*(i+1)+0.2*(j+1));
else
a[i][j]=1.5*cos((i+1)+1.2*(j+1));
}
}
//设单位矩阵
void setUnitMatrix(double u[n][n])
{
for(int i=0;in;i++)
for(int j=0;jn;j++)
{
if(i==j)
u[i][j]=1;
else
u[i][j]=0;
}
}
//对a拟上三角化
void triangulation()
{
int i=0,j=0,r=0,z=0;
double sum=0,c=0,h=0,t=0;
double u[n],p[n],q[n],w[n],b[n][n],x[n][n],y[n][n];
for(r=0;rn-2;r++)
{
z=0;
for(i=r+2;in;i++)
if(a[i][r]==0)
z++;
if(z==0) //判断,若a[i][r]全为0,则进行下一个循环
{
//构造cr
sum=0;
for(i=r+
文档评论(0)