मैं पूछ रहा हूँ कि क्या हल करने वाले व्यंजक पर 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 इसे पहचान सके और इस प्रकार इसे np.linalg.solve से जोड़ सके। लेकिन मुझे नहीं लगता कि sympy इसका समर्थन करते हैं।

0
Nathan Explosion 24 जिंदा 2021, 12:09

2 जवाब

सबसे बढ़िया उत्तर

आप sympy.linsolve के बजाय फ़ंक्शन sympy.codegen.matrix_nodes.MatrixSolve का उपयोग कर सकते हैं।

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")

1
Autumnii 24 जिंदा 2021, 15:00

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.
1
hpaulj 24 जिंदा 2021, 20:49