如果我有一个方程组,则使用 numpy:
3x + 2y = 5
1x + 4y = 10
我可以用 numpy.linalg.solve
解决它们:
a = [[3,2],[1,4]]
b = [5,10]
solution = numpy.linalg.solve(a,b)
现在,如果我有两个矩阵,A 和 B,每个矩阵的形状都是 (100,100),我想求解以下形式的方程:(A'A - yBB')x = 0
我不确定如何使用 numpy.linalg.solve
进行设置
这看起来您正在尝试解决 generalized eigenvalue problem ,其中 y
是未知的广义特征值 λ,x
是相应的广义特征向量。如果那是你想要的,你可以使用 scipy.linalg.eig
.这是一个例子。
为了保持输出的可读性,我将使用形状为 (2, 2) 的数组。
In [91]: from scipy.linalg import eig
In [92]: A
Out[92]:
array([[2, 3],
[1, 1]])
In [93]: B
Out[93]:
array([[0, 1],
[3, 0]])
这些是等式中的矩阵。
In [94]: a = A.T.dot(A)
In [95]: b = B.dot(B.T)
求解广义特征值问题:
In [96]: lam, v = eig(a, b)
这些是广义特征值(您的y
):
In [97]: lam
Out[97]: array([ 6.09287487+0.j, 0.01823624+0.j])
v
的列是广义特征向量(您的x
):
In [98]: v
Out[98]:
array([[ 0.98803087, -0.81473616],
[ 0.1542563 , 0.57983187]])
验证解决方案。请注意,结果大约为 1e-16,即数值接近于 0。
In [99]: (a - lam[0]*b).dot(v[:,0])
Out[99]: array([ 2.22044605e-16+0.j, -8.88178420e-16+0.j])
In [100]: (a - lam[1]*b).dot(v[:,1])
Out[100]: array([ 0.+0.j, 0.+0.j])
我是一名优秀的程序员,十分优秀!