北航数值分析B大作业一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1、题目 (1)
2、算法设计方案 (1)
3、源程序 (2)
4、输出结果 (12)
5、迭代初始向量选取对计算结果的影响分析 (14)
1、 题目
设有501×501的矩阵
A = ⎥⎥⎥⎥
⎥⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎢
⎢⎢⎢⎢⎣
⎡501500499321
a b a c b a ...............
c b a c b a c b a b
c
b c
b c
b c b 其中0.1=(1.640.024)sin(0.24)0.64(=1,2,501)
i
ai i i e i --…,;b=0.16,c=-0.064。矩阵A 的特征值(=1,2,501)i i λ…,
满足 12<<<λλλ501 (1501)
=min s i i λλ≤≤
试求:
1. 1λ,501λ和s λ的值;
2. A 的与1
1=+40
k k
λλμλ501-最接近的特征值(=1,2,39)k i k λ…,。
3. A 的(谱范数)条件数2cond(A)和行列式det A 。
2、算法设计方案
由已知可知,矩阵A 为带状矩阵,为了节省类存空间,对于矩阵中的大量0元素不存储。根据带状矩阵的特点,选择一个5行501列的二维数组存储。
1. 求解矩阵A 的最大、最小特征值和按模最小特征值,采用幂法进行计算。计算步骤如下:
a) 用幂法求出矩阵A 的按模最大特征值'λ,用反幂法求出矩阵A 的按模最小特征值s λ;
b) 用幂法求出矩阵A -'λI 的按模最大特征值''λ; c) 比较''λ+'λ与'λ的大小,较大特征值为
501λ,较小值1λ。
2. 求解与1
1=+40
k k
λλμλ501-最接近的特征值(=1,2,39)k i k λ…,,
可以按以下步骤完成: a) 用反幂法求出矩阵A -k μI 的按模最小特征值λμ; b) 则k i λ=λμ+k μ。
3. 求解矩阵A 的条件数和行列式值。对于条件数而言,由于A 为对称矩阵,根据条件数的定义可知,2'
cond(A)=
s
λλ,其中'λ为矩阵A 的按模最大特征值,s λ为矩阵A 的按模最小特征值;对于行列式值而言,可以先将矩阵A 按Doolittle 分解,则A = LU ,则
===A LU L U U 。
4. 程序设计思路。通过对题目进行分析以及算法可知,任务涉及矩阵Doolittle 分解求解带状方程组、求矩阵按模最大特征值、求矩阵按模最小特征值和用Doolittle 分解求解矩阵A 的行列式。为了能够简化主函数的复杂程度,可以将分模块完成相应的功能,最后在主函数中调用已经完成的功能函数即可。
3、源程序
源程序如下:
#include
#include
#define M 5
#define N 501
/************************************************************
求最大、最小值的函数
************************************************************/ int Max(int para1,int para2)
{
if(para1 >= para2)
return para1;
else
return para2;
}
int Min(int para1,int para2)
{
if(para1 < para2)
return para1;
else
return para2;
}
/************************************************************
初始化矩阵
************************************************************/ void Creat(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 < N;j++)
{
A[i][j] = c;
}
/*初始化第二行*/
i++;
j = 0;
A[i][j] = 0;
j++;
for (j=1; j < N;j++)
{
A[i][j] = b;
}
/*初始化第三行*/
i++; j = 0;
for (j=0; j < N;j++)
{
A[i][j] = (1.64 - 0.024 * (j+1)) * sin(0.2 * (j+1)) - 0.64 * exp(0.1 / (j+1));
}
/*初始化第四行*/
i++; j = 0;
for (j=0;j < (N - 1);j++)
{
A[i][j] = b;
}
A[i][j] = 0;
/*初始化第五行*/
i++; j= 0;
for (j=0;j < (N - 2);j++)
{
A[i][j] = c;
}
A[i][j] = 0; j++;
A[i][j] = 0;
}