考虑线性方程组: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]])
(这是我问题的简化版本,它有几十个变量和符号(
所以你得到:
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]])
这意味着a2
和a4
可以是任何实数,然后a1
和a3
将取决于他们的选择。
问题:
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)