题目
编写程序,使用 <code>eig()</code> 函数求解一个 3×3 对称矩阵的全部特征值与对应的正交特征向量;验证特征方程 $A v_i = \lambda_i v_i$ 成立。
输入格式:无需外部输入。
输出格式:分别输出特征值构成的向量/对角阵、特征向量构成的变换矩阵,并输出验算误差。
数据范围与约定:实对称方阵。
思路与算法
1. eig 单输出与双输出lambda = eig(A) 只返回特征值组成的列向量;[V, D] = eig(A) 返回特征向量矩阵 $V$ 和对角线上排列特征值的对角阵 $D$,满足 $A V = V D$。
2. 特征向量归一化
返回的特征向量默认已经过欧氏模长归一化,即 $\|v_i\|_2 = 1$。
3. 实对称矩阵性质
实对称方阵的特征值必定全部为实数,且不同特征值对应的特征向量严格相互正交。
完整程序
% Octave / MATLAB 第30题:特征值与特征向量
A = [2, 1, 0;
1, 2, 1;
0, 1, 2];
% 双返回值调用:V 是特征向量列矩阵,D 是特征值对角矩阵
[V, D] = eig(A);
% 提取特征值列向量
lambdas = diag(D);
fprintf("实对称方阵 A:\n");
disp(A);
fprintf("特征值 (diag(D)):\n");
disp(lambdas');
fprintf("特征向量矩阵 V (每一列为一个特征向量):\n");
disp(V);
% 验证第一对特征对:A * v1 == lambda1 * v1
v1 = V(:, 1);
lam1 = D(1, 1);
diff_err = norm(A * v1 - lam1 * v1);
fprintf("验证特征对误差 norm(A*v1 - lam1*v1): %.2e\n", diff_err);运行示例
输出:
实对称方阵 A:
2 1 0
1 2 1
0 1 2
特征值 (diag(D)):
0.5858 2.0000 3.4142
特征向量矩阵 V (每一列为一个特征向量):
-5.0000e-01 7.0711e-01 5.0000e-01
7.0711e-01 3.1225e-16 7.0711e-01
-5.0000e-01 -7.0711e-01 5.0000e-01
验证特征对误差 norm(A*v1 - lam1*v1): 6.00e-16