使用MatrixSymbol的sympy nsolve

时间:2018-07-18 18:41:48

标签: matrix sympy equation solver

我想用数值方法求解一个包含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转换为一系列符号,或者应该避免这种方式。

1 个答案:

答案 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))构造函数对于一维输入很酷,因此没有必要。