如何用numpy解(a'a yBB')x=0形式的方程

2024-03-29 14:51:02 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一个方程组,使用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的形状都是(100100),我想解一个方程的形式:(A'A-yBB')x=0

我不确定如何使用numpy.linalg.solve设置


Tags: numpy矩阵方程组形式形状方程solutionsolve
2条回答

这个特定的方程有一个解析解:

  1. x是0,y可以是任何值

或者

  1. x可以是任何东西,然后A'A - yBB' = 0可以是线性的,用numpy.linalg.solve求解

可以是线性的,因为尺寸相加不好

这看起来像是要解generalized eigenvalue problem,其中y是未知的广义特征值λ,x是相应的广义特征向量。如果这是您想要的,您可以使用^{}。下面是一个例子。你知道吗

为了保持输出的可读性,我将使用带有shape(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])

相关问题 更多 >