【发布时间】:2018-06-28 12:53:21
【问题描述】:
给定一个N x N 对称矩阵C 和一个N x N 对角矩阵I,求方程det(λI-C)=0 的解。换句话说,要找到C 的(广义)特征值。
我知道如何在 MATLAB 中使用内置函数解决这个问题的几种方法:
第一种方式:
function lambdas=eigenValues(C,I)
syms x;
lambdas=sort(roots(double(fliplr(coeffs(det(C-I*x))))));
第二种方式:
[V,D]=eig(C,I);
但是,我需要使用 Python。 NumPy 和 SymPy 中也有类似的功能,但是根据文档(numpy、sympy),它们只采用一个矩阵 C 作为输入。虽然,结果与 Matlab 产生的结果不同。此外,SymPy 生成的符号解决方案也无济于事。也许我做错了什么?如何解决?
示例
- MATLAB:
%输入
I =
2 0 0
0 6 0
0 0 5
C =
4 7 0
7 8 -4
0 -4 1
[v,d]=eig(C,I)
%结果
v =
-0.3558 -0.3109 -0.5261
0.2778 0.1344 -0.2673
0.2383 -0.3737 0.0598
d =
-0.7327 0 0
0 0.4876 0
0 0 3.7784
- Python 3.5:
%输入
I=np.matrix([[2,0,0],
[0,6,0],
[0,0,5]])
C=np.matrix([[4,7,0],[7,8,-4],[0,-4,1]])
np.linalg.eigh(C)
%结果
(array([-3., 1.91723747, 14.08276253]),
matrix(
[[-0.57735027, 0.60061066, -0.55311256],
[ 0.57735027, -0.1787042 , -0.79670037],
[ 0.57735027, 0.77931486, 0.24358781]]))
【问题讨论】:
-
你确定结果不会因为特征向量的顺序/方向而不同吗?
-
我添加了一个例子。当然,eig(C) 无论是在 python 中,还是在 matlab 中都会输出相同的结果,但我确实需要 eig(C,I)
-
我明白了,但只是让您知道:它们不一定输出相同,因为向量/值的顺序和方向可能不同。它们在数学上是相同的,但数字可能不同。
-
是的,已经明白了,谢谢
-
使用
I表示除单位矩阵以外的对角矩阵是非常糟糕的表示法。
标签: python matlab numpy sympy eigenvalue