如何解决Sympy 中的隐式 linsolve() 然后进行 Lambdify
我在问是否有可能在涉及求解的表达式中从 np.linalg.solve()
中取出 lambdify
?
例如,让
from sympy import MatrixSymbol,linsolve,lambdify
A = MatrixSymbol('A',3,3)
b = MatrixSymbol('b',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
是否支持这一点。
解决方法
您可以使用函数 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',1)
func = lambdify((A,b),MatrixSolve(A,modules="numpy")
,
使用 MatrixSolve
,lambdify
执行简单的词法替换:
In [87]: MatrixSolve(A,b)
Out[87]: MatrixSolve(MatrixSymbol(Str('A'),Integer(3),Integer(3)),vector=MatrixSymbol(Str('b'),Integer(1)))
In [88]: func = lambdify((A,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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。