Trasformata di Legendre di una funzione

Usiamo il programma python legendre.py per calcolare numericamente la trasformata di Legendre di una funzione.

Eseguiamo preventivamente la cella che segue per poter visualizzare la grafica direttamente in questa scheda del browser

In [25]:
%matplotlib inline

Carichiamo il programma legendre che deve essere presente nello stesso folder di questo notebook

In [26]:
%run legendre.py

La funzione di cui si vuole fare la trasformata è:

$$y=e^{-x}$$

Questa è codificata nella funzione func nel file legendre.py ed è conservata come metodo all'interno della classe function allo scopo di poterla modificare con un metodo opportuno della classe, senza dover editare il programma e doverlo rilanciare; si veda più avanti. Per controllare la funzione inserita, usare il metodo print associato all'istanza $f$ della classe function:

In [27]:
f.print()
np.e**(-1*x)

La funzione legendre(xmin,xmax,npoint) definisce le rette tangenti alla funzione y in npoint punti, da x=xmin a x=xmax, e le disegna (rette in blu); la funzione y (curva in nero) è l'inviluppo dell'insieme di rette tangenti:

In [28]:
legendre(0.0,5,10)

Aumentando il parametro npoint, la ricostruzione della curva y appare più evidente

In [29]:
legendre(0,5,50)

I valori numerici dei coefficienti angolari m e delle intercette q delle rette $r=mx+q$, tangenti alla curva y alle diverse ascisse x, si possono visualizzare chiamando la funzione legendre con il parametro opzionale plot=False:

In [30]:
m,q=legendre(0,5,10,plot=False)
for im in range(m.size):
    print("m  %6.3f, q  %6.3f" % (m[im], q[im]))
m  -1.000, q   1.000
m  -0.574, q   0.893
m  -0.329, q   0.695
m  -0.189, q   0.504
m  -0.108, q   0.349
m  -0.062, q   0.235
m  -0.036, q   0.155
m  -0.020, q   0.100
m  -0.012, q   0.064
m  -0.007, q   0.040

La trasformata di Legendre è la funzione q(m):

$$q(m)=y-\frac{dy}{dx}x=y-mx$$

Questa può essere visualizzata con la funzione legendre_plot(xmin,xmax,npoint):

In [31]:
legendre_plot(0,5,100)

Volendo eseguire la trasformata su una funzione diversa, usare il metodo f.set dando in input la nuova funzione. Per esempio, volendo fare la trasformata della funzione $y=log(x)$, scriviamo:

In [32]:
f.set('np.log(x)')
f.print()
np.log(x)

Da notare che la funzione logaritmo (in base e) è una funzione della libreria numpy, quindi va invocata con il prefisso np.

L'argomento di f.set è passato sotto forma di stringa racchiudendolo tra apici. Si procede poi come già visto sopra:

In [33]:
legendre(0.1,5,10)
In [34]:
legendre_plot(0.1,5,100)