Come risolvere un'equazione differenziale in Python
Per risolvere le equazioni differenziali di ogni ordine in Python è molto utile il modulo SymPy dedicato al calcolo simbolico.
Inizio importando le funzioni della libreria librerie necessarie:
from sympy import symbols, Function, Eq, dsolve
Poi decido qual è la funzione e le variabili coinvolte nell'equazione differenziale rispettivamente tramite le funzioni Function() e symbols().
Ad esempio, se sto lavorando con il tempo \( t \) e una funzione \( y(t) \) scrivo:
t = symbols('t')
y = Function('y')(t)
Questi due comandi associano un simbolo alla variabile t e alla variabile y. In questo modo Python interpreterà queste due variabili come simboli anziché come valori numerici.
A questo punto scrivo l'equazione differenziale che voglio risolvere.
Prendo l'esempio di un'equazione differenziale del terzo ordine:
\[ \frac{d^3y}{dt^3} - 3\frac{d^2y}{dt^2} + 3\frac{dy}{dt} - y = 0 \]
In SymPy, la scrivo così:
ode = Eq(y.diff(t, 3) - 3*y.diff(t, 2) + 3*y.diff(t) - y, 0)
Dove diff(t,n) è la funzione della derivata di ordine n rispetto alla variabile t.
- y.diff(t,3) è la derivata terza della funzione y rispetto alla variabile t
- y.diff(t,2) è la derivata seconda della funzione y rispetto alla variabile t
- y.diff(t) è la derivata prima della funzione y rispetto alla variabile t
- y è la funzione non derivata
Ora, uso dsolve() per risolvere l'equazione.
La funzione dsolve() prende l'equazione e la funzione che sto risolvendo come argomenti:
solution = dsolve(ode, y)
Infine, visualizzo la soluzione
print(solution)
Eq(y(t), (C1 + t*(C2 + C3*t))*exp(t))
Questo vuol dire che la soluzione dell'equazione differenziale è
$$ y(t) = C_1 + t \cdot (C_2 + C_3 \cdot t) \cdot e^t $$
Mettendo tutto insieme in un unico script:
from sympy import symbols, Function, Eq, dsolve
# Definizione delle variabili
t = symbols('t')
y = Function('y')(t)
# Definizione dell'equazione differenziale del terzo ordine
ode = Eq(y.diff(t, 3) - 3*y.diff(t, 2) + 3*y.diff(t) - y, 0)
# Risoluzione dell'equazione differenziale
solution = dsolve(ode, y)
# Stampa della soluzione
print(solution)
In questo modo ho risolto un'equazione differenziale del terzo ordine con SymPy.
Per fare qualcosa di diverso, come un'equazione di ordine superiore o un sistema di equazioni differenziali, il processo è simile: definisco le variabili e le funzioni come simboli, scrivo le equazioni, e uso dsolve() per trovare la soluzione.
E così via.