La funzione solve()
Il più semplice risolutore che ci offre SymPy è la funzione solve() e risolve le equazioni algebriche, comprese polinomiali e trascendenti.
Gli argomenti da passare alla funzione sono:
- l’equazione da risolvere implicitamente uguagliata a zero: ciò significa, per esempio, che se l’equazione è [math]x^2 – x = 2[/math] l’argomento da inserire è [math]x^2 – x – 2[/math]
- la variabile in relazione alla quale si intende trovare la soluzione, sicché l’equazione indicata si risolve con l’istruzione
solve(x**2-x-2, x)
che ritorna la lista delle due soluzioni possibili [-1, 2].
import sympy as sy
x = sy.symbols("x")
print(sy.solve(x**2 - x - 2, x))
⇒
[-1, 2]
ritorna la lista delle due soluzioni possibili [-1, 2].
Risolviamo ora la “cubica” [math]x^3 + x – 10 = 0[/math]:
import sympy as sy
x = sy.symbols("x")
print(sy.solve(x**3 + x - 10, x))
⇒
[2, -1 - 2*I, -1 + 2*I]
Una soluzione reale e due soluzioni complesse.
Dunque, se l’equazione non ammette soluzioni reali vengono indicate le soluzioni complesse, come avviene, per esempio, cercando le soluzioni di [math]x^2 + x + 2 = 0[/math]:
import sympy as sy
x = sy.symbols("x")
print(sy.solve(x**2 + x + 2, x))
⇒
[-1/2 - sqrt(7)*I/2, -1/2 + sqrt(7)*I/2]
cioè [math]-0.5 – 1.3228756555323i[/math] e [math]-0.5 + 1.3228756555323i[/math] come possiamo ricavare sottoponendo le due espressioni a evalf().
import sympy as sy
x = sy.symbols("x")
print(sy.solve(x**2 + x + 2, x))
soluzioni = sy.solve(x**2 + x + 2, x)
print(soluzioni[0].evalf())
print(soluzioni[1].evalf())
⇒
[-1/2 - sqrt(7)*I/2, -1/2 + sqrt(7)*I/2]
-0.5 - 1.3228756555323*I
-0.5 + 1.3228756555323*I
Risolvere il sistema di equazioni lineari
Analogamente, per la risoluzione di sistemi lineari:
import sympy as sy
x1, x2 = sy.symbols("x1 x2")
equations = [
sy.Eq(2*x1 + 1*x2, 10),
sy.Eq(1*x1 - 2*x2, 11)
]
print(sy.solve(equations))
⇒
{x1: 31/5, x2: -12/5}
Risolvere equazioni esponenziali
Risolviamo l’equazione [math]e^x – 5x + 1 = 0[/math].
Per [math]e^x[/math] useremo la funzione exp(x).
import sympy as sy
x = sy.symbols("x")
print(sy.solve(sy.exp(x) + 5 + 1, x))
⇒
[log(6) + I*pi]
Risolviamo l’equazione [math]3^{x-1} – 4 = 0[/math]:
import sympy as sy
x = sy.symbols("x")
print(sy.solve(3**(x - 4) - 4, x))
⇒
[2*log(18)/log(3)]
Risolvere equazioni logaritmiche
Risolviamo l’equazione [math]x + \log(x) = 0[/math]:
import sympy as sy
x = sy.symbols("x")
print(sy.solve(x + sy.log(x), x))
⇒
[LambertW(1)]
ritorna la soluzione [LambertW(1)], la più ermetica di tutte.
Integrare Python e SymPy
Se siamo interessati a soluzioni espresse in numeri, anche per quelle strane equazioni che hanno radici non immediatamente esprimibili in numero salvo approssimazioni di calcolo, possiamo costruirci uno script come questo, che utilizza la funzione solve() di SymPy:
from sympy import *
def avvio():
print("Inserisci la parte sinistra di una equazione uguagliata a zero")
print("(usa la sintassi Python e nomina con x l'incognita)")
global espressione
espressione = input()
def risolvi():
x = symbols('x')
e = sympify(espressione)
l = solve(e, x)
n = len(l)
for i in range(n):
s = N(l[i - 1])
print('soluzione', i + 1, ': ')
pprint(s)
print("Vuoi risolvere un'altra equazione? (si/no)")
r = input()
if r == 'si' or r == 'SI' or r == 'Si':
avvio()
else:
input('Premi INVIO per terminare')
risolvi()
avvio()
⇒
Inserisci la parte sinistra di una equazione uguagliata a zero
(usa la sintassi Python e nomina con x l'incognita)
x + log(x)
soluzione 1 :
0.567143290409784
Vuoi risolvere un'altra equazione? (si/no)
no
Premi INVIO per terminare
