Sympy 中的隐式 linsolve() 然后 lambdify

Implicit linsolve() in Sympy and then lambdify

我问是否可以从涉及求解的表达式的 lambdify 中得到 np.linalg.solve()

例如让

from sympy import MatrixSymbol, linsolve, lambdify

A = MatrixSymbol('A', 3, 3)
b = MatrixSymbol('b', 3, 1)

func = lambdify((A, b), linsolve((A, b)), modules="numpy")

是否可以生成 func(A, b) = np.linalg.solve(A, b)?

以上代码肯定行不通。它首先会在 linsolve((A, b)).

处失败

我的尝试是以某种方式将 linsolve((A, b)) 标记为隐式表达式,以便 lambdify 可以识别它,因此 link 可以用 np.linalg.solve 识别它。但是我没发现 sympy 是否支持这个。

您可以使用函数 sympy.codegen.matrix_nodes.MatrixSolve 而不是 sympy.linsolve

from sympy import MatrixSymbol, lambdify
from sympy.codegen.matrix_nodes import MatrixSolve

A = MatrixSymbol('A', 3, 3)
b = MatrixSymbol('b', 3, 1)


func = lambdify((A, b), MatrixSolve(A, b), modules="numpy")

对于MatrixSolvelambdify执行简单的词法替换:

In [87]: MatrixSolve(A,b)
Out[87]: MatrixSolve(MatrixSymbol(Str('A'), Integer(3), Integer(3)), vector=MatrixSymbol(Str('b'), Integer(3), Integer(1)))

In [88]: func = lambdify((A, b), MatrixSolve(A, b), modules="numpy")

In [89]: func
Out[89]: <function _lambdifygenerated(A, b)>

In [90]: func?
Signature: func(A, b)
Docstring:
Created with lambdify. Signature:

func(A, b)

Expression:

MatrixSolve(A, vector=b)

Source code:

def _lambdifygenerated(A, b):
    return (solve(A, b))

如果不在 ipython/isympy 中,则使用 print(func.__doc__) 显示该文档。


您最初的问题是使用 sympy.linsolve:

In [81]: linsolve((A,b))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-81-9ddeeeb0f242> in <module>
----> 1 linsolve((A,b))

/usr/local/lib/python3.8/dist-packages/sympy/solvers/solveset.py in linsolve(system, *symbols)
   2630         if not isinstance(system[0], MatrixBase):
   2631             if sym_gen or not symbols:
-> 2632                 raise ValueError(filldedent('''
   2633                     When passing a system of equations, the explicit
   2634                     symbols for which a solution is being sought must

ValueError: 
When passing a system of equations, the explicit symbols for which a
solution is being sought must be given as a sequence, too.