实验8 反幂法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数值分析》实验8
一.实验名称:反幂法
二、实验目的:
(1) 掌握求矩阵按模最小特征值及其对应的特征向量的规范化反幂法;
(2) 掌握原点移位法。
三、实验要求
(1) 按照题目要求完成实验内容
(2) 写出相应的实验原理与C 语言程序
(3) 给出实验结果,结果分析
(4) 写出相应的实验报告
四、实验题目:
用反幂法求以下矩阵的指定特征值及其特征向量(迭代终止误差为1e-3):
41411014110⎛⎫ ⎪ ⎪ ⎪⎝⎭
接近2的特征值及其特征向量.
程序:
#include
#include
int main(){
int n = 3, i, k, j, max_k = 1000;
double y[max_k][n], x[max_k][n], max_x[max_k], z[n], u[n][n], l[n][n], t, err = 1e-5, norm_dx = 1,tt=12;//norm_dx:dx 的一范数,tt:为了求接近tt 的特征值,
for (i = 0; i < n; i++)
for (j = 0; j < n; j++){
u[i][j] = 0;
(j == i) ? (l[i][j] = 1) : (l[i][j] = 0);
}
double a[][3] = { 4, 1, 4, 1, 10, 1, 4, 1, 10 };
for (i = 0; i < n; i++)
{ a[i][i]-=tt;
x[0][i] = 1;
}
for (i = 0; i < n; i++){
for (k = i; k < n; k++){
t = 0;
for (j = 0; j < i; j++)
t += l[i][j] * u[j][k];
u[i][k] = a[i][k] - t;
}
for (k = i + 1; k < n; k++){
t = 0;
for (j = 0; j < i; j++)
t += l[k][j] * u[j][i];
l[k][i] = (a[k][i] - t) / u[i][i];
}
}
for (k = 0; k<1000 && norm_dx>pow(err, 2); k++){
max_x[k] = 0;
for (i = 0; i < n; i++){
if (fabs(max_x[k]) < fabs(x[k][i]))
max_x[k] = x[k][i];
}
for (i = 0; i < n; i++)
y[k][i] = x[k][i] / max_x[k];
for (i = 0; i < n; i++){
t = 0;
for (j = 0; j < i; j++)
t += l[i][j] * z[j];
z[i] = y[k][i] - t;
}
for (i = n - 1; i >= 0; i--){
t = 0;
for (j = i + 1; j < n; j++)
t += u[i][j] * x[k + 1][j];
x[k + 1][i] = (z[i] - t) / u[i][i];
}
norm_dx = 0;
for (i = 0; i < n; i++)
norm_dx += pow((x[k + 1][i] - x[k][i]), 2);
}
k--;
printf("接近%f特征值=%f\n近似特征向量=\n", tt,1 / max_x[k]+12);
for (i = 0; i < n; i++)
(i < n - 1) ? printf("%f,", y[k][i]) : printf("%f\n", y[k][i]);
}
结果:
接近12.000000特征值=12.677104
近似特征向量=
0.526706,0.570281,1.000000
Press any key to continue...