在线性系统 A*x=b 中,如何在 SymPy 中从给定的 x 和 b 中象征性地获得 A

In a linear system A*x=b, how to obtain A, from given x and b, symbolically in SymPy

考虑线性方程组:A*x=b

只知道向量b,以及感兴趣的变量x:

from sympy import Matrix, symbols

i, j, x1, x2 = symbols('i j x1 x2')

b = Matrix([i*j*x1 + j**2*x2,
                x2 +    i*x1])  

x = Matrix([x1, x2])

有没有办法象征性地自动获得A?

返回值将是:

A == Matrix([[i*j, j**2],
             [  i,    1]])

(这是我的问题的简化版,有几十个变量和符号)

您将 x 和 b 指定为向量。
所以你得到了:
A = [a1, a2; a3, a4]
x = [x1; x2]
b = [b1; b2]

方程组为: Ax = b 或
a1 * x1 + a2 * x2 = b1 (eq1)
a3 * x1 + a4 * x2 = b2 (eq2)

这是一个有 2 个方程和 4 个未知数 (a1,a2,a3,a4) 的系统。
所以,不,没有办法解决这个问题得到 a1,..,a4。 这与任何program/language无关,这是线性代数。

您唯一能做的就是限制未知数,例如,对于已知的 a1、a3 和 x2!= 0,您可以计算 a2 和 a4。

以下是基本方法,solve 一般不推荐使用。通过在源代码中进行一些窥探,您可以找出它是哪个特定的求解函数 运行.

from sympy import *

i, j, x1, x2 = symbols('i j x1 x2', real=True)

b = Matrix([[i * j * x1 + j ** 2 * x2],
            [x2 + i * x1]])

x = Matrix([[x1],
            [x2]])

a1, a2, a3, a4 = symbols("a_1 a_2 a_3 a_4", real=True)
A = Matrix([[a1, a2],
            [a3, a4]])

solution = solve(Eq(A * x, b), (a1, a2, a3, a4))
print(solution)

for key, value in solution.items():
    A = A.replace(key, value)
print(A)

产生:

{a_3: (-a_4*x2 + i*x1 + x2)/x1, a_1: (-a_2*x2 + i*j*x1 + j**2*x2)/x1}
Matrix([[(-a_2*x2 + i*j*x1 + j**2*x2)/x1, a_2], [(-a_4*x2 + i*x1 + x2)/x1, a_4]])

意味着 a2a4 可以是任何实数,然后 a1a3 将取决于他们的选择。

问题:

from sympy import Matrix, symbols, Poly
import numpy as np

i, j, x1, x2 = symbols('i j x1 x2')

b = Matrix([i*j*x1 + j**2*x2,
                x2 +    i*x1])

x = Matrix([x1, x2])

# A = ?

一种可能的解决方案:

A = np.zeros((len(b),len(x))).tolist()
n_rows = len(A)
n_cols = len(A[0])

for i in range(n_rows):
    for j in range(n_cols):
        A[i][j] = Poly(b[i], x.free_symbols).coeff_monomial(x[j])
A = Matrix(A)