我想问的是,在一个涉及求解的表达式中,是否有可能将np.linalg.solve()从lambdify中提取出来?
例如,让
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能够识别它,从而将它与np.linalg.solve连接起来。但我不知道sympy是否支持这一点。
发布于 2021-01-24 10:49:58
您可以使用函数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")发布于 2021-01-24 17:49:31
使用MatrixSolve,lambdify执行一个简单的词法替换:
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))或者使用print(func.__doc__)显示该文档(如果不是在ipython/isympy中)。
你最初的问题是使用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.https://stackoverflow.com/questions/65868781
复制相似问题