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



考虑线性方程组: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。 这与任何程序/语言无关,这是线性代数。

您唯一能做的就是对未知数进行约束,例如,对于已知的 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)

相关内容

  • 没有找到相关文章

最新更新