求解带状矩阵的若干问题 下载本文

内容发布更新时间 : 2024/5/23 2:35:13星期一 下面是文章的全部内容请认真阅读。

数值分析—第一题 陈广华 SY0607109 B班

求解带状矩阵的若干问题

一、任务及求解思路。

1、 求矩阵A的λ1、λ501以及?s。它们满足λ1<λ2<...<λ501,且?s?1)求λ1和λ501

用幂法求出矩阵A的模为最大的特征值λ,1)如果λ<0,则λ1=λ,此时以λ为偏移量,求矩阵A-λE的模为最大的特征值??,于是?501?????;2)如果λ>0,则λ501=λ,此时以λ为偏移量,求矩阵A-λE的模为最大的特征值??,于是?1?????。

2)求?s。

用反幂法直接求出矩阵A的模为最小的特征值λs。

2、 求矩阵A的与数?k最接近的特征值?ik,其中?k??1?kmin?i。

1?i?501?501??140,k?1,2,?39

求法:以?k为偏移量,用反幂法求矩阵A-?kE的模为最小的特征值即为?ik。

3、 求矩阵A的谱范数条件数cond(A)2和矩阵的行列式的值det(A)。

1)求cond(A)2

由于A为实对称矩阵,且非奇异,所以有

cond(A)2=

?1 ?n其中λ1和λn分别是矩阵A的模为最大和模为最小的特征值。 由以上结论,再由第一问求得的结果,即可得出cond(A)2。 2)求det(A)

用Doolittle法把A分解为下三角矩阵L和上三角矩阵U,有A=LU。矩阵L是对角线元素均为1下三角矩阵,所以| L |=1;矩阵U是上三角矩阵,有| U |=u11u22?unn,于是有

| A |=| L || U |=| U |=u11u22?unn。

由以上结论,把A用Doolittle法分解为下三角矩阵L和上三角矩阵U,即可得出det(A)。具体到本题中,就是把A中的非零元素经过转存后的矩阵C中的第s+1行元素作连乘积。

第 页 共 12 页

1

数值分析—第一题 陈广华 SY0607109 B班

二、全部源程序。(C++语言)

1、函数及其功能

本程序共定义了七个函数,它们的功能如下:

void InitMatrix(double A[M][N],double b,double c),对矩阵A进行初始化,即为题目中所给矩阵,并且只存储非0元素。

void AbsMaxEigenval(double A[M][N],double &MaxEigenval),用幂法找出矩阵A的模为最大的特征值MaxEigenval。

void AbsMinEigenval(double A[M][N],double &MinEigenval),用反幂法找出矩阵A的模为最小的特征值MinEigenval。

void Doolittle(double A[M][N],double x[N], double b[N]),用Doolittle分解法求解线性方程组,返回方程组的解x。在本题中此函数用于帮助求解矩阵行列式、绝对值最小特征值和最大最小特征值。

double Det(double A[M][N]),求矩阵A的行列式的值,用到上一个函数。

void MaMiEigenval(double A[M][N],double &MaxEigenval,double &MinEigenval),用幂法、反幂法配合平移求解实际最大特征值MaxEigenval和实际最小特征值MinEigenval。

int Max(int x,int y)和int Min(int x,int y),分别用来求两个整数的较大值和较小值。由于此函数较为简单,故不再在下面进行说明。

2、程序代码:

1、 matrix.h(函数的声明头文件):

#include

#include #define M 5 #define N 501

//转化后的矩阵的初始化函数。

void InitMatrix(double A[M][N],double b,double c); //求按模为最大的特征值。

void AbsMaxEigenval(double A[M][N],double &MaxEigenval); //求按模为最小的特征值。

void AbsMinEigenval(double A[M][N],double &MinEigenval); //用Doolittle方法解带状方程组。

void Doolittle(double A[M][N],double x[N], double b[N]); //求带状矩阵的行列式。 double Det(double A[M][N]);

第 页 共 12 页

2

数值分析—第一题 陈广华 SY0607109 B班

//求最大和最小的特征值。

void MaMiEigenval(double A[M][N],double &MaxEigenval,double &MinEigenval); 2、 matrix.cpp(函数的源代码)

#include \#include \

//转化后的矩阵的初始化。

void InitMatrix(double A[M][N],double b,double c) { int i = 0; int j = 0; //输入矩阵第一行。 A[i][j] = 0; j++; A[i][j] = 0; j++; for (j=2; j

第 页 共 12 页

3