Simboli sympy Python

Nov 01 2020

Quando uso "x" e "z" come simboli, non ho problemi con questo codice:

from sympy import *
x, z = symbols('x z')
y = -6*x**2 + 2*x*z**0.5 + 50*x - z
solve((diff(y, x), diff(y, z)))
y.subs({x: 5, z: 25})

Ma quando uso "q" e "a", risolvere non mi dà alcuna soluzione.

q, a = symbols('q a')
y = -6*q**2 + 2*q*a**0.5 + 50*q - a
solve((diff(y, q), diff(y, a)))
y.subs({q: 5, a: 25})

Come puoi vedere utilizzo "subs" per verificare che non ci siano errori di battitura nella funzione obiettivo.

AGGIORNAMENTO: Ho usato "Simbolo" per impostare ogni variabile individualmente, ma ancora una volta usare "q" e "a" non funziona.

# This works
x = Symbol('x')
z = Symbol('z')
y = -6*x**2 + 2*x*z**0.5 + 50*x - z
solve((diff(y, x), diff(y, z)))

# This does not work
q = Symbol('q')
a = Symbol('a')
y = -6*q**2 + 2*q*a**0.5 + 50*q-a
solve((diff(y, q), diff(y, a)))

Grazie.

Risposte

5 Marcin Nov 02 2020 at 00:00

Fatto!

Tutto dipende da un ordine alfabetico delle tue variabili.

Se sostituite xper ze zper xnel vostro primo esempio sarà anche smettere di lavorare.

Risolvi internamente invia l'espressione alla funzione _solvein sympy.solverscui poi cerca di risolvere l'equazione e fallisce molte volte.

Infine, come ultimo sforzo, quello che fa è cercare di risolvere -sqrt(a) + qo x - sqrt(z)prelevare simboli da esso attraverso una funzione interna _ok_syms, con un argomento che li ordina alfabeticamente (anche senza questo argomento lo farebbe comunque, ma se avvolto con reversedesso magicamente fa funzionare i tuoi esempi in modo esattamente opposto).

E così risolve x - sqrt(z)come x: sqrt(z)e -sqrt(a) + qcome a: q**2.

Mentre nel primo caso si finisce con una soluzione facilmente risolvibile 50 - 10*sqrt(z), nel secondo caso si perde in -12*q + 2*sqrt(q**2) + 50quanto non è in grado di semplificare sqrt(q**2).

fonte: molti test su: https://github.com/sympy/sympy/blob/master/sympy/solvers/solvers.py