题目

编写程序,使用 <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