1 / 22
文档名称:

北航数值分析实验报告.doc

格式:doc   大小:73KB   页数:22页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

北航数值分析实验报告.doc

上传人:小健 2021/7/11 文件大小:73 KB

下载得到文件列表

北航数值分析实验报告.doc

相关文档

文档介绍

文档介绍:北航数值分析实验报告
《数值分析》计算实****报告
第一大题
学号:DY1305姓名:指导老师:
一、 题目要求
已知501*501阶的带状矩阵A ,其特征值满
足?1?501??1
40
最接近的特征值?ik;
3、A的条件数cond (A) 2和行列式detA。
二、 算法设计方案
题目所给的矩阵阶数过大,必须经过去零压缩后进行 存储和运算,本算法中压缩后的矩阵A1如下所示。
?0?0?Al??al
??b??c
0ba2bc
cbbc cbbc
cba5 OObO
a3...a 499 c?
b??a5 01?
?0?0??
由矩阵A的特征值满足的条件可知
?1与?501之间必有一个最大,则采用幕法求出的
一个特征值必为其中的一个:当所求得的特征值为正 数,则为?501;否则为?1。在求得?1与
?5 01其中的一个后,采用带位移的幕法则可求出它们 中的另一个,且位移量即为先求出的特
征值的值。用反幕法求得的特征值必为?s。由条件数 的性质可得,cond(A)2为模最大的特征值与模最小的特征 值之比的模,因此,求出?1, ?501和?s的值后,则可以求 得 cond (A)2o
对于题目的第二问。当我们将位移量设为?k,再用反 慕法求得的相应的特征值即为与之最接近的特征值。
由于在使用反幕法或带位移的反幕法过程中需要解线 性方程组,对此我采用三角分解法先分解矩阵A0 ,再求迭 代所需的解向量。当把A0进行三角分解后,三角矩阵的对 角线元素之积即为detA。
注:算法中涉及求范数时,均为?2。本报告的非程序 部分的矩阵和向量下标均以1
开始,程序部分的下标按程序语法规定从0开始计。
三、创新点
在幕法求按模最大的特征值过程中,Uk-l归一化后得 到yk?l再进行迭代求uk,迭代公式为
uk ?Ayk?l
为A的非0元素与对应的yk?l的积的和,而在程序中 变为
uk?Al yk?l
以第一、二、三列的乘积为列,
uk[l]?ayk?l[l]+byk?l [2]?cyk?l[3]
?Al[3][l]yk?l[l]?Al[4][l]y k?l[2]?A1 [5] [l]yk?l[3]
uk [2] ?byk?l [1] +a yk?l [2] +by k?l [3] ?cyk ?1 [4]
?A1 [2][2]yk?l 2]yk?l[2]?
Al [4] [2]yk ?1[3]?A1[5 ] [2]yk?l[4 ]uk[3]?cyk ?l[l]+byk
?1[2]+ayk?l [3]+byk?l[4]?cyk?l[5 ]
?A1[1] [ 3]yk?l[l] +
Al [2] [3]yk ?1[2]+A1[3 ][3]yk?l[3 ]?A1[4][3]
yk?l[4]?Al [5][3]yk?l [5]
由上可以看出前三列的相乘在编程时是不太方便的, 为了统一和简化编程,做出如下两处改动即可解决问题:
首先,为了方便压缩矩阵的赋值,将A1的0元素处理 后变为如下的矩阵A0, ?c?b?AO??a 1 ??b??c
cba 2bc cbbc c bbc
cba500b c
a3. . . a499
c?
b??a501?;
?b?c??
其次,将向量yk?l的空间拓展为505X 1,并且有
yk?l [l]?yk?l[2 ]?yk?l[504 ]?yk?l[505 ]?0
这样就可以将这个迭代部分统一为
uk[j]??aO[i][j]?yk?l [i], j=l, 2, ...,501
i?l
5
四、运算结果及分析
以下计算结果截图为初始迭代向量的情况下算得的。
本算法采用的是各个分量相同且为1的初始迭代向量, 运算后得到了正确的结果。将各个分量全改为0后无法运 算,但改为相同的其他实数后也能得到相同的正确结论, 这是运算时间开销不同。当模最大或最小特征值对应的初 始迭代向量的分量为0而其他分量不全为0的时候也能够 得到相同的正确结果。原因为即使所求的特征值对应的初 始迭代向量分量为0,那么由于计算过程有舍入误差的影响, 必然会在迭代的某一步产生一个该分量不为0的新迭代向 量。因此,也能得到正确的结论。
五、源程序
#include#i ncludettinc ludettdefin eCM5#defin eCN501
#d efineG〃矩阵A中的b#defin eH-〃矩阵A中的 cvoidiniti al(doubles [CM][CN]); intmax (int a, intb) ; in tmin (inta, intb);
do ublepower ( double (*a) [