矩阵方程求解器Python

时间:2017-12-02 20:07:20

标签: python matrix sympy equation

这就是问题:我正在尝试解决形式的二阶矩阵方程: enter image description here

其中X(寻找)和C(已知)的大小为[nxn]。 (n大约为1000)。 C是已知的对称协方差矩阵。 (和X也应该是对称的)

这是我的代码:

from sympy import solve
from sympy import Indexed, IndexedBase, Tuple
import numpy as np

X = IndexedBase('X',shape=(n,n))
eqs = Tuple(np.dot(X,X)-np.dot(C,X)-np.eye(n))
solve(eqs, X)

这是正确的方法吗?我的代码需要很长时间。 我正在寻找任何类型的算法,可以帮助我有效地解决这种方程。

2 个答案:

答案 0 :(得分:3)

大多数象征性的工作都可以手工完成:

X^2 - CX - I = 0
-> X^2 + 2EX - I = 0          // sub C = -2E
-> X^2 + 2EX + E^2 - I = E^2  //add E^2 to both sides (i.e., complete the square)
-> (X + E)^2 = E^2 + I        //simplify and add I to both sides
-> X+E = +/-(E^2 + I)^(1/2)   //take square root (now we may have more than one answer)
-> X = -E +/- (E^2 + I)^(1/2) //subtract E from both sides

Matrix square-root可能是也可能不是您想要象征性地解决的问题。 SymPy肯定会让你象征性地代表它,但事实证明它无法用数字计算,在我的尝试中(在MinGW64的Python3中)。

您的矩阵C是对称的,因此我们可以检查平方根下的项(即1/2的幂)是否具有显式计算公式。一些初步事实:

Wikipedia (Symmetric Matrix)

  1. 两个对称矩阵的和与差是对称的。
  2. 给定对称矩阵A和B,当且仅当A和B通勤时,AB才是对称的。
  3. 每个实对称矩阵都可以通过真正的正交相似性进行对角化。
  4. Wikipedia (Square Root Of A Matrix)::Explicit Formulas::ByDiagonalization

    1. 表示任何可对角化的矩阵A=VDV^(-1),然后是A^(1/2) = VD^(1/2)V^(-1)
    2. 从我们问C开始,E^2+I是否可对角化(以便有一个简单明确的矩阵平方根公式)? C是对称的,E = -(1/2)C;标量乘法不会改变C的对称性,因为它会影响每个单元格;因此E是对称的。 E^2 = (E * E)通勤,因此E^2是对称的。 最后,I是对称的,因此(E^2 + I)是对称的。

      因此,可以使用上述(4)的平方根经过对角化。并且通过取对角线上元素的平方根来计算对角矩阵的平方根。在这里你可能会遇到另一个问题,即如果这些元素是否定的,你的答案就会很复杂。每个平方根也可能有多个答案,可能会给您一些考虑的答案。这很可能是SymPy未能给出数字答案的原因。

答案 1 :(得分:2)

你的代码不对。 NumPy用于数值计算,它不会创建表示等式左边的SymPy对象。并且它不会帮助您获得分析解决方案。以下是使用SymPy解决基质系统的示例;它是2乘2而不是1000乘1000.

import sympy as sym
X = sym.Matrix(sym.MatrixSymbol('X', 2, 2))
covar = sym.Matrix([[2, 1], [1, 3]])
sym.solve([X**2 - covar*X - sym.eye(2), X-X.T], X)

请注意,SymPy矩阵的乘法仅为*。第一个等式是你写的,第二个等式要求X是对称的(X.T是X的转置)。

然而,已经3比3的情况有问题,1000比1000完全没有希望。一个人并不是简单地通过将它扔到SymPy来解决500,000个非线性方程组的系统。

您可以尝试使用SciPy的多变量求解器来获得一些数值解,但它将成为许多数值解的一个解决方案。像X**2 - C*X - I = 0这样的基本方程的正确方法不是把它们扔到计算机上;这是做数学。