我想用数值方法求解一个包含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转换为一系列符号,或者应该避免这种方式。
答案 0 :(得分:1)
一种更干净的方法是从for file in *; do sed -i $' \n ' ${file}
创建一个矩阵:
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]
,所以它是一个双数组,但是由于SymPy的sy.symarray("v", (2, 1))
构造函数对于一维输入很酷,因此没有必要。