- 0
- 0
- 约7.23千字
- 约 5页
- 2019-07-06 发布于天津
- 举报
第九章上机习题说明文档 (二)
石朋忆石朋忆
石朋忆石朋忆
题目二题目二::
题目二题目二::
用 QR 算法找矩阵的特征值和特征向量。
A=[ 2 -1 0 0
-1 2 -1 0
0 -1 2 -1
0 0 -1 2]
一、一、程序说明程序说明 ::
一一、、程序说明程序说明::
这次的程序一共包括三个文件,chap9.cpp,chap9_Jacobi.h 和chap9_QR.h 。其中在头文
件chap9_Jacobi.h 中定义了eigenJacobi 的类,用于输入第一题中的A 矩 ,用Jacobi 方法
对矩 A 求出特征值和特征向量;在头文件chap9_QRi.h 中定义了eigenQR 的类,用于输
入第二题中的A 矩 ,用QR 方法对矩 A 求出特征值和特征向量。在主程序中分别创建
两个类的对象m 和n ,在构造函数中输入矩阵的维数4 。对m 调用函数no1;jacobi;output 求
出和显示矩 A 的特征值和对应特征向量;对n 调用函数no2;qr 求出和显示矩 A 的特征
值和对应特征向量:
本文件主要介绍本文件主要介绍 eigenQR 类:类:
本文件主要介绍本文件主要介绍 类类::
eigenQR 类的成员函数包括 :
eigenQR(int num); //构造函数
void no2(); //输入第二题矩
void qr(); //QR 解法,其中调用了下面的void schmidt() ,void exchange()函数
void schmidt(); //施密特正交化,其中调用了下面的double multiple(int i,int k)
// 以及double norm2(int i)函数
void exchange(); //交换相乘
double compare(); //计算本次循环得到的矩阵与上次循环矩阵的差别
//利用元素之差的按模取最大值
double multiple(int i,int k); //计算点乘
double norm2(int i); //计算二范数
double abs(double ab) //计算绝对值
数据成员包括 :(其中 dimA2 为矩阵的维数+1)
double a[dimA2][dimA2]; //存储矩 A ,并且用于输出特征值
double b[dimA2][dimA2]; //在void schmidt() 函数中暂时存储未单位化的向量b
double q[dimA2][dimA2]; //存储QR 分解中的Q 矩
double r[dimA2][dimA2]; //存储QR 分解中的R 矩
double ee[dimA2][dimA2]; //用来存储每次Q 矩阵的乘积 (即书中的E 矩 )
//并且用于最后输出矩阵的特征向量
int n; //矩 A 的维数
double e; //容许误差
关于程序的补充说明关于程序的补充说明::
关于程序的补充说明关于程序的补充说明::
1、为了方便起见,数组在后面的使用当中都是直接从1 开始计数,即a[0][0]、b[0][0]等均
未加使用。原因是因为这次的算法本身就很麻烦了,为了不在其中出错,或者说符合课本上
的计数方式,采用了这种偷懒的方式,请助教见谅 (这次的作业太麻烦了……)。因此程序
中的循环与一般的C++ 中的惯用写法不太一样(比如int i 从1 开始计数);并且dimA2 选用
5
原创力文档

文档评论(0)