sympy nsolve 与 MatrixSymbol

sympy nsolve with MatrixSymbol

我想对涉及 MatrixSymbol 的方程式进行数值求解。这是一个基本示例:

import sympy as sy
v = sy.MatrixSymbol('v', 2, 1)
equation = (v - sy.Matrix([17, 23])).as_explicit()

我想要这样的东西:

sy.nsolve(equation, v, sy.Matrix([0,0]))

但是因为 nsolve 不接受 MatrixSymbols,我做了一个笨拙的解决方法,给出了 Matrix([[17.0], [23.0]]):

的正确输出
vx, vy = sy.symbols('v_x v_y')
sy.nsolve(equation.subs(v, sy.Matrix([vx, vy])), [vx, vy], [0,0])

本质上,我已将 MatrixSymbol 转换为符号矩阵以使 nsolve 满意。

有更好的方法吗?

编辑:解决方法可以简化为:

vseq = sy.symbols('a b') #names must be distinct
sy.nsolve(equation.subs(v, sy.Matrix(vseq)), vseq, [0,0])

但是应该有一种更简洁的方法将 MatrixSymbol 转换为一系列 Symbols,或者首先避免需要这样做的方法。

更简洁的方法是从 symarray:

创建矩阵
v = sy.Matrix(sy.symarray("v", (2,)))
equation = v - sy.Matrix([17, 23])
sy.nsolve(equation, v, [0, 0])

在这里,symarray 创建一个 (NumPy) 符号数组 [v_0, v_1],然后将其转换为矩阵。也可以使用 sy.symarray("v", (2, 1)) 所以它是一个双数组,但由于 SymPy 的 Matrix 构造函数对一维输入很酷,所以这不是必需的。