Tutorial Sage
Release 10.4

The Sage Group

23 lug 2024

Indice

1

Introduzione
1.1 Installazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Modi di usare Sage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Obiettivi di lungo periodo per Sage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3
5
5
5

2

Algebra di base e Analisi
2.1 Risoluzione di equazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Differenziazione, Integrazione, etc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Risoluzione di Equazioni Differenziali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4 Metodo di Eulero per i sistemi di equazioni differenziali . . . . . . . . . . . . . . . . . . . . . . . . .
2.5 Funzioni speciali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7
7
9
10
13
15

3

Indici e tabelle

17

Bibliografia

19

i

ii

Tutorial Sage, Release 10.4

Sage è un software di calcolo numerico e simbolico libero e open-source di supporto nell’insegnamento e della ricerca
in algebra, geometria, teoria dei numeri, crittografia, calcolo numerico e aree correlate. Sia il modello di sviluppo diSage, sia la tecnologia utilizzata in Sage stesso, si distinguono per un’enfasi particolarmente forte su apertura, community,
cooperazione e collaborazione: vogliamo creare l’automobile, non reinventare la ruota. L’obiettivo complessivo di Sage è
creare un’alternativa adeguata, libera e open-source a Maple, Mathematica, Magma e MATLAB.
Questo tutorial è la via migliore per familiarizzare con Sage in poche ore e può essere letto in HTML o PDF.

Indice1

Tutorial Sage, Release 10.4

2

IndiceCAPITOLO

1Introduzione

Questo tutorial dovrebbe richiedere circa 3/4 ore per una lettura completa. Lo si può leggere in versione HTML o PDF.
Nonostante molto in Sage sia implementato usando Python, la conoscenza di Python non è un prerequisito per la lettura
di questo tutorial. Per chi volesse imparare il Python (un linguaggio molto divertente!) allo stesso tempo, ci sono molte
risorse eccellenti e libere per farlo tra le quali [PyT] e [PyB]. Se si vuole solo provare velocemente Sage, questo tutorial
è il punto di partenza adatto. Per esempio:
sage: 2 + 2
4
sage: factor(-2007)-1 * 3^2 * 223
sage: A = matrix(4,4, range(16)); A[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11][12 13 14 15]
sage: factor(A.charpoly())
x^2 * (x^2 - 30*x - 80)
sage: m = matrix(ZZ,2, range(4))
sage: m[0,0] = m[0,0] - 3sage: m[-3 1][ 2 3]
sage: E = EllipticCurve([1,2,3,4,5]);
sage: E
Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5
over Rational Field
sage: E.anlist(10)[0, 1, 1, 0, -1, -3, 0, -1, -3, -3, -3]
sage: E.rank()(continues on next page)3

Tutorial Sage, Release 10.4

(continua dalla pagina precedente)1
sage: k = 1/(sqrt(3)*I + 3/4 + sqrt(73)*5/9); k
36/(20*sqrt(73) + 36*I*sqrt(3) + 27)
sage: N(k)0.165495678130644 - 0.0521492082074256*I
sage: N(k,30)# 30 "bits"
0.16549568 - 0.052149208*I
sage: latex(k)\frac{36}{20 \, \sqrt{73} + 36 i \, \sqrt{3} + 27}>>> from sage.all import *>>> Integer(2) + Integer(2)4>>> factor(-Integer(2007))-1 * 3^2 * 223>>> A = matrix(Integer(4),Integer(4), range(Integer(16))); A[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11][12 13 14 15]>>> factor(A.charpoly())
x^2 * (x^2 - 30*x - 80)>>> m = matrix(ZZ,Integer(2), range(Integer(4)))>>> m[Integer(0),Integer(0)] = m[Integer(0),Integer(0)] - Integer(3)>>> m[-3 1][ 2 3]>>> E = EllipticCurve([Integer(1),Integer(2),Integer(3),Integer(4),Integer(5)]);>>> E
Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5
over Rational Field>>> E.anlist(Integer(10))[0, 1, 1, 0, -1, -3, 0, -1, -3, -3, -3]>>> E.rank()
1>>> k = Integer(1)/(sqrt(Integer(3))*I + Integer(3)/Integer(4) +␣˓→sqrt(Integer(73))*Integer(5)/Integer(9)); k
36/(20*sqrt(73) + 36*I*sqrt(3) + 27)>>> N(k)0.165495678130644 - 0.0521492082074256*I>>> N(k,Integer(30))# 30 "bits"
0.16549568 - 0.052149208*I>>> latex(k)\frac{36}{20 \, \sqrt{73} + 36 i \, \sqrt{3} + 27}

4

Capitolo 1. Introduzione

Tutorial Sage, Release 10.4

1.1 Installazione
Se non si ha Sage installato su un computer e si vogliono solamente provare alcuni comandi, si può usare online all’indirizzo
https://sagecell.sagemath.org/.
Si veda la Sage Installation Guide nella sezione documentazione della homepage di Sage [Sage] per istruzioni
sull’installazione di Sage sul proprio computer. Qui vengono fatti solamente due commenti.
1. Il file di download di Sage arrive con le «batterie incluse». In altre parole, nonostante Sage usi Python, IPython,
PARI, GAP, Singular, Maxima, NTL, GMP e così via, non è necessario installarli separatamente siccome sono
incluse con la distribuzione di Sage. Comunque, per usare certe feature di sage, ad es. Macaulay o KASH, bisogna
installare il pacchetto opzionale Sage che interessa o almeno avere i programmi in questioni gia installati sul proprio
computer. Macaulay e KASH sono pacchetti di Sage (per una lista dei pacchetti opzionali disponibili, digitare «sage-optional», o sfogliare la pagina «Download» sul sito web di Sage.
2. Le versioni binarie precompilate di Sage (che si trovano sul sito web di Sage) possono essere più facili e più veloci
da installare invece che la versione da codice sorgente. Basta solo spacchettare il file e eseguire «sage».

1.2 Modi di usare Sage
Sage si può usare in molti modi.
• Interfaccia grafica del notebook: vedere la sezioni sul Notebook nel manuale di riferimento e la:ref:»sezione-notebook» sotto,• Linea di comando interattiva: vedere :ref:”capitolo-shell_interattiva”,• Programmi: scrivendo programmi interpretati e compilati in Sage (vedere :ref:”sezione-loadattach” e:ref:”sezione-compilazione”), e• Scripts: scrivendo degli script autosufficienti che usino la libreria Sage (vedere :ref:”sezione-autosufficienti”).

1.3 Obiettivi di lungo periodo per Sage
• Utile: il pubblico per Sage il quale sage è stato pensato sono gli studenti di matematica (dalla scuola superiore
all’università), gli insegnanti e i ricercatori in matematica. Lo scopo è di fornire software che possa essere usato
per esplorare e sperimentare le costruzioni matematiche in algebra, geometria, teoria dei numeri, calcolo, calcolo
numerico, ecc. Sage aiuta a rendere più facile la sperimentazione interattiva con gli oggetti matematici.
• Efficiente: essere veloce. Sage usa del software maturo e altamente ottimizzato come GMP, PARI, GAP e NTL ecosì è molto veloce con certe operazioni.
• Libero e open source: il codice sorgente deve essere liberamente disponibile e leggibile, così che gli utenti possano capire cosa stia facendo veramente il sistema e possano estenderlo più facilmente. Così come i matematici
acquisiscono una comprensione più profonda di un teorema leggendo attentamente o almeno scorrendo velocemente la dimostrazione, le persone che fanno calcoli dovrebbero essere capaci di capire come funzionano i calcoli
leggendo il codice sorgente documentato. Se si usa Sage per fare calcoli in un articolo che si pubblica, si può essere
rassicurati dal fatto che i lettori avranno sempre libero accesso a Sage e a tutto il suo codice sorgente ed è persino
concesso di archiviare la versione di Sage che si è utilizzata.
• Facile da compilare: Sage dovrebbe essere facile da compilare dal sorgente per gli utenti Linux, macOS e
Windows. Questo garantisce maggiore flessibilità agli utenti di modificare il sistema.

1.1. Installazione

5Tutorial Sage, Release 10.4

• Cooperazione: Fornire un interfaccia robusta alla maggior parte degli altri sistemi di algebra computazionale,compresi: PARI, GAP, Singular, Maxima, KASH, Magma, Maple e Mathematica. Sage è pensato per unificare eestendere il software matematico esistente.
• Ben documentato: tutorial, guida alla programmazione, manuale di riferimento e how to con numerosi esempi e
discussioni della matematica sottostante.
• Amichevole verso l’utente: dovrebbe essere facile capire quale funzionalità è fornita per un dato oggetto e guardare
la documentazione e il codice sorgente. Bisogna anche raggiungere un alto livello di supporto agli utenti.

6

Capitolo 1. Introduzione

CAPITOLO

2

Algebra di base e Analisi

Sage sa svolgere diversi calcoli legati all’algebra di base ed all’analisi: per esempio, risoluzione di equazioni, calcolo
differenziale ed integrale e trasformate di Laplace. Si veda la documentazione per le «Costruzioni di Sage» per ulteriori
esempi.

2.1 Risoluzione di equazioni
La funzione solve risolve le equazioni. Per usarla, bisogna anzitutto specificare alcune variabili; pertanto gli argomenti
di solve sono un’equazione (od un sistema di equazioni), insieme con le variabili rispetto alle quali risolvere:
sage: x = var( x )sage: solve(x^2 + 3*x + 2, x)[x == -2, x == -1]>>> from sage.all import *>>> x = var( x )>>> solve(x**Integer(2) + Integer(3)*x + Integer(2), x)[x == -2, x == -1]

Si possono risolvere le equazioni rispetto ad una variabile in funzione delle altre:
sage: x, b, c = var( x b c )sage: solve([x^2 + b*x + c == 0],x)[x == -1/2*b - 1/2*sqrt(b^2 - 4*c), x == -1/2*b + 1/2*sqrt(b^2 - 4*c)]>>> from sage.all import *>>> x, b, c = var( x b c )>>> solve([x**Integer(2) + b*x + c == Integer(0)],x)[x == -1/2*b - 1/2*sqrt(b^2 - 4*c), x == -1/2*b + 1/2*sqrt(b^2 - 4*c)]

Si può anche risolvere rispetto a diverse variabili:

7Tutorial Sage, Release 10.4

sage: x, y = var( x, y )sage: solve([x+y==6, x-y==4], x, y)[[x == 5, y == 1]]>>> from sage.all import *>>> x, y = var( x, y )>>> solve([x+y==Integer(6), x-y==Integer(4)], x, y)[[x == 5, y == 1]]

Il seguente esempio dell’uso di Sage per risolvere un sistema di equazioni non lineari è stato fornito da Jason Grout: perprima cosa, si risolve il sistema simbolicamente:sage: var( x y p q )(x, y, p, q)
sage: eq1 = p+q==9
sage: eq2 = q*y+p*x==-6
sage: eq3 = q*y^2+p*x^2==24
sage: solve([eq1,eq2,eq3,p==1],p,q,x,y)[[p == 1, q == 8, x == -4/3*sqrt(10) - 2/3, y == 1/6*sqrt(10) - 2/3],[p == 1, q == 8, x == 4/3*sqrt(10) - 2/3, y == -1/6*sqrt(10) - 2/3]]>>> from sage.all import *>>> var( x y p q )(x, y, p, q)>>> eq1 = p+q==Integer(9)>>> eq2 = q*y+p*x==-Integer(6)>>> eq3 = q*y**Integer(2)+p*x**Integer(2)==Integer(24)>>> solve([eq1,eq2,eq3,p==Integer(1)],p,q,x,y)[[p == 1, q == 8, x == -4/3*sqrt(10) - 2/3, y == 1/6*sqrt(10) - 2/3],[p == 1, q == 8, x == 4/3*sqrt(10) - 2/3, y == -1/6*sqrt(10) - 2/3]]

Per una soluzione numerica, si può invece usare:sage: solns = solve([eq1,eq2,eq3,p==1],p,q,x,y, solution_dict=True)
sage: [[s[p].n(30), s[q].n(30), s[x].n(30), s[y].n(30)] for s in solns][[1.0000000, 8.0000000, -4.8830369, -0.13962039],[1.0000000, 8.0000000, 3.5497035, -1.1937129]]>>> from sage.all import *>>> solns = solve([eq1,eq2,eq3,p==Integer(1)],p,q,x,y, solution_dict=True)>>> [[s[p].n(Integer(30)), s[q].n(Integer(30)), s[x].n(Integer(30)), s[y].
˓→n(Integer(30))] for s in solns][[1.0000000, 8.0000000, -4.8830369, -0.13962039],[1.0000000, 8.0000000, 3.5497035, -1.1937129]](La funzione n scrive un’approssimazione numerica, e l’argomento è il numero di bit di precisione.)

8

Capitolo 2. Algebra di base e Analisi

Tutorial Sage, Release 10.4

2.2 Differenziazione, Integrazione, etc.
Sage è in grado di differenziare ed integrare molte funzioni. Per esempio, per differenziare sin(𝑢) rispetto a 𝑢, si procede
come nelle righe seguenti:
sage: u = var( u )sage: diff(sin(u), u)cos(u)>>> from sage.all import *>>> u = var( u )>>> diff(sin(u), u)cos(u)Per calcolare la derivata quarta di sin(𝑥2 ):sage: diff(sin(x^2), x, 4)
16*x^4*sin(x^2) - 48*x^2*cos(x^2) - 12*sin(x^2)>>> from sage.all import *>>> diff(sin(x**Integer(2)), x, Integer(4))
16*x^4*sin(x^2) - 48*x^2*cos(x^2) - 12*sin(x^2)

Per calcolare le derivate parziali di 𝑥2 + 17𝑦 2 rispetto a x e y, rispettivamente:sage: x, y = var( x,y )sage: f = x^2 + 17*y^2
sage: f.diff(x)2*xsage: f.diff(y)34*y>>> from sage.all import *>>> x, y = var( x,y )>>> f = x**Integer(2) + Integer(17)*y**Integer(2)>>> f.diff(x)2*x>>> f.diff(y)34*yPassiamo agli integrali, sia indefiniti che definiti. Per calcolare∫︀

𝑥 sin(𝑥2 ) 𝑑𝑥 e

∫︀ 1

𝑥
𝑑𝑥
0 𝑥2 +1

sage: integral(x*sin(x^2), x)-1/2*cos(x^2)
sage: integral(x/(x^2+1), x, 0, 1)
1/2*log(2)>>> from sage.all import *>>> integral(x*sin(x**Integer(2)), x)-1/2*cos(x^2)>>> integral(x/(x**Integer(2)+Integer(1)), x, Integer(0), Integer(1))
1/2*log(2)Per calcolare la decomposizione in frazioni parziali di 𝑥21−1 :2.2. Differenziazione, Integrazione, etc.

9

Tutorial Sage, Release 10.4

sage: f = 1/((1+x)*(x-1))
sage: f.partial_fraction(x)-1/2/(x + 1) + 1/2/(x - 1)>>> from sage.all import *>>> f = Integer(1)/((Integer(1)+x)*(x-Integer(1)))>>> f.partial_fraction(x)-1/2/(x + 1) + 1/2/(x - 1)

2.3 Risoluzione di Equazioni Differenziali
Si può usare Sage per studiare le equazioni differenziali ordinarie. Per risolvere l’equazione 𝑥′ + 𝑥 − 1 = 0:
sage: t = var( t )# definisce una variabile tsage: x = function( x )(t)# definisce x come funzione di quella variabile
sage: DE = diff(x,t) + x - 1
sage: desolve(DE, [x,t])(_C + e^t)*e^(-t)>>> from sage.all import *>>> t = var( t )# definisce una variabile t>>> x = function( x )(t)# definisce x come funzione di quella variabile>>> DE = diff(x,t) + x - Integer(1)>>> desolve(DE, [x,t])(_C + e^t)*e^(-t)

Questo metodo utilizza l’interfaccia di Sage per Maxima [Max], e così il suo output può essere leggermente diverso dagli
altri output di Sage. In questo caso, risulta che la soluzione generale dell’equazione differenziale è 𝑥(𝑡) = 𝑒−𝑡 (𝑒𝑡 + 𝑐).
Si può anche calcolare la trasformata di Laplace; la trasformata di Laplace di 𝑡2 𝑒𝑡 − sin(𝑡) è calcolata come segue:sage: s = var("s")
sage: t = var("t")
sage: f = t^2*exp(t) - sin(t)sage: f.laplace(t,s)-1/(s^2 + 1) + 2/(s - 1)^3>>> from sage.all import *>>> s = var("s")>>> t = var("t")>>> f = t**Integer(2)*exp(t) - sin(t)>>> f.laplace(t,s)-1/(s^2 + 1) + 2/(s - 1)^3

Il successivo è un esempio più articolato. Lo scostamento dall’equilibrio (rispettivamente) per due molle accoppiate fissate
ad un muro a sinistra|------\/\/\/\/\---|massa1|----\/\/\/\/\/----|massa2|
molla1
molla2

è modellizzato dal sistema di equazioni differenziali del secondo ordine
𝑚1 𝑥′′1 + (𝑘1 + 𝑘2 )𝑥1 − 𝑘2 𝑥2 = 0𝑚2 𝑥′′2 + 𝑘2 (𝑥2 − 𝑥1 ) = 0,

10Capitolo 2. Algebra di base e Analisi

Tutorial Sage, Release 10.4

dove 𝑚𝑖 è la massa dell’oggetto i, 𝑥𝑖 è lo scostamento dall’equilibrio della massa i, e 𝑘𝑖 è la costante elastica della molla i.
Esempio: Usare Sage per risolvere il problema precedente con 𝑚1 = 2, 𝑚2 = 1, 𝑘1 = 4, 𝑘2 = 2, 𝑥1 (0) = 3, 𝑥′1 (0) = 0,𝑥2 (0) = 3, 𝑥′2 (0) = 0.
Soluzione: Calcolare la trasformata di Laplace della prima equazione (con la notazione 𝑥 = 𝑥1 , 𝑦 = 𝑥2 :sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
sage: lde1 = de1.laplace("t","s"); lde1.sage()2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) ˓→ 2*D[0](x)(0)>>> from sage.all import *>>> de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")>>> lde1 = de1.laplace("t","s"); lde1.sage()2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) ˓→ 2*D[0](x)(0)Questo è di difficile lettura, ma dice che−2𝑥′ (0) + 2𝑠2 * 𝑋(𝑠) − 2𝑠𝑥(0) − 2𝑌 (𝑠) + 6𝑋(𝑠) = 0(dove la trasformata di Laplace di una funzione in minuscolo come 𝑥(𝑡) è la funzione in maiuscolo 𝑋(𝑠)). Calcolare la
trasformata di Laplace della seconda equazione:
sage: t,s = SR.var( t,s )sage: x = function( x )sage: y = function( y )sage: f = 2*x(t).diff(t,2) + 6*x(t) - 2*y(t)sage: f.laplace(t,s)
2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) ˓→ 2*D[0](x)(0)>>> from sage.all import *>>> t,s = SR.var( t,s )>>> x = function( x )>>> y = function( y )>>> f = Integer(2)*x(t).diff(t,Integer(2)) + Integer(6)*x(t) - Integer(2)*y(t)>>> f.laplace(t,s)
2*s^2*laplace(x(t), t, s) - 2*s*x(0) + 6*laplace(x(t), t, s) - 2*laplace(y(t), t, s) ˓→ 2*D[0](x)(0)che significa−𝑌 ′ (0) + 𝑠2 𝑌 (𝑠) + 2𝑌 (𝑠) − 2𝑋(𝑠) − 𝑠𝑦(0) = 0.
Imporre le condizioni iniziali per 𝑥(0), 𝑥′ (0), 𝑦(0), e 𝑦 ′ (0), e risolvere le due equazioni risultanti:
sage: var( s X Y )(s, X, Y)
sage: eqns = [(2*s^2+6)*X-2*Y == 6*s, -2*X +(s^2+2)*Y == 3*s]
sage: solve(eqns, X,Y)[[X == 3*(s^3 + 3*s)/(s^4 + 5*s^2 + 4),
Y == 3*(s^3 + 5*s)/(s^4 + 5*s^2 + 4)]]>>> from sage.all import *>>> var( s X Y )(continues on next page)2.3. Risoluzione di Equazioni Differenziali

11Tutorial Sage, Release 10.4

(continua dalla pagina precedente)(s, X, Y)>>> eqns = [(Integer(2)*s**Integer(2)+Integer(6))*X-Integer(2)*Y == Integer(6)*s, ˓→Integer(2)*X +(s**Integer(2)+Integer(2))*Y == Integer(3)*s]>>> solve(eqns, X,Y)[[X == 3*(s^3 + 3*s)/(s^4 + 5*s^2 + 4),
Y == 3*(s^3 + 5*s)/(s^4 + 5*s^2 + 4)]]

Ora si calcola la trasformata inversa di Laplace per ottenere la risposta:
sage: var( s t )(s, t)
sage: inverse_laplace((3*s^3 + 9*s)/(s^4 + 5*s^2 + 4),s,t)cos(2*t) + 2*cos(t)sage: inverse_laplace((3*s^3 + 15*s)/(s^4 + 5*s^2 + 4),s,t)-cos(2*t) + 4*cos(t)>>> from sage.all import *>>> var( s t )(s, t)>>> inverse_laplace((Integer(3)*s**Integer(3) + Integer(9)*s)/(s**Integer(4) +␣˓→Integer(5)*s**Integer(2) + Integer(4)),s,t)cos(2*t) + 2*cos(t)>>> inverse_laplace((Integer(3)*s**Integer(3) + Integer(15)*s)/(s**Integer(4) +␣˓→Integer(5)*s**Integer(2) + Integer(4)),s,t)-cos(2*t) + 4*cos(t)Pertanto, la soluzione è
𝑥1 (𝑡) = cos(2𝑡) + 2 cos(𝑡),𝑥2 (𝑡) = 4 cos(𝑡) − cos(2𝑡).

Essa può essere disegnata in forma parametrica usando
sage: t = var( t )sage: P = parametric_plot((cos(2*t) + 2*cos(t), 4*cos(t) - cos(2*t) ),....: (0, 2*pi), rgbcolor=hue(0.9))
sage: show(P)>>> from sage.all import *>>> t = var( t )>>> P = parametric_plot((cos(Integer(2)*t) + Integer(2)*cos(t), Integer(4)*cos(t) -␣˓→cos(Integer(2)*t) ),... (Integer(0), Integer(2)*pi), rgbcolor=hue(RealNumber( 0.9 )))>>> show(P)Le singole componenti possono essere tracciate usando:
sage: t = var( t )sage: p1 = plot(cos(2*t) + 2*cos(t), 0, 2*pi, rgbcolor=hue(0.3))
sage: p2 = plot(4*cos(t) - cos(2*t), 0, 2*pi, rgbcolor=hue(0.6))
sage: show(p1 + p2)>>> from sage.all import *>>> t = var( t )>>> p1 = plot(cos(Integer(2)*t) + Integer(2)*cos(t), Integer(0), Integer(2)*pi,␣
˓→rgbcolor=hue(RealNumber( 0.3 )))(continues on next page)

12

Capitolo 2. Algebra di base e Analisi

Tutorial Sage, Release 10.4

(continua dalla pagina precedente)>>> p2 = plot(Integer(4)*cos(t) - cos(Integer(2)*t), Integer(0), Integer(2)*pi,␣
˓→rgbcolor=hue(RealNumber( 0.6 )))>>> show(p1 + p2)

BIBLIOGRAFIA: Nagle, Saff, Snider, Fundamentals of Differential Equations, 6th ed, Addison-Wesley, 2004. (si veda
§ 5.5).

2.4 Metodo di Eulero per i sistemi di equazioni differenziali
Nel prossimo esempio, si illustrerà il metodo di Eulero per le ODE di primo e secondo ordine. Per prima cosa ricordiamol’idea di base per le equazioni di primo ordine. Dato un problema di Cauchy della forma𝑦 ′ = 𝑓 (𝑥, 𝑦)𝑦(𝑎) = 𝑐
si vuole trovare il valore approssimato della soluzione a 𝑥 = 𝑏 con 𝑏 > 𝑎.
Ricordando dalla definizione di derivata che𝑦 ′ (𝑥) ≈𝑦(𝑥 + ℎ) − 𝑦(𝑥),ℎdove ℎ > 0 è dato e piccolo. Questo e la DE insieme danno give 𝑓 (𝑥, 𝑦(𝑥)) ≈ 𝑦(𝑥+ℎ)−𝑦(𝑥). Ora si risolve per 𝑦(𝑥 + ℎ):ℎ𝑦(𝑥 + ℎ) ≈ 𝑦(𝑥) + ℎ * 𝑓 (𝑥, 𝑦(𝑥)).
Se chiamiamo ℎ𝑓 (𝑥, 𝑦(𝑥)) il «termine di correzione» (per mancanza di un termine migliore), 𝑦(𝑥) il «vecchio valore diy», e 𝑦(𝑥 + ℎ) il «nuovo valore di y», allora questa approssimazione può essere espressa come𝑦𝑛𝑒𝑤 ≈ 𝑦𝑜𝑙𝑑 + ℎ * 𝑓 (𝑥, 𝑦𝑜𝑙𝑑 ).
Se si spezza l’intervallo da a a b in n intervalli, dimodoché ℎ = 𝑏−𝑎𝑛 , allora si possono registrare le informazioni perquesto metodo in una tabella.
𝑥𝑦ℎ𝑓 (𝑥, 𝑦)𝑎𝑎+ℎ𝑎 + 2ℎ…
𝑏 = 𝑎 + 𝑛ℎ𝑐𝑐 + ℎ𝑓 (𝑎, 𝑐)…

ℎ𝑓 (𝑎, 𝑐)
…

???

…

L’obiettivo è riempire tutti gli spazi vuoti della tavella, una riga alla volta, finché si arriva al valore ???, che è il metodo diapprossimazione di Eulero per 𝑦(𝑏).
L’idea per sistemi di ODE è simile.
Esempio: Si approssimi numericamente 𝑧(𝑡) a 𝑡 = 1 usando 4 passi del metodo di Eulero, dove 𝑧 ′′ + 𝑡𝑧 ′ + 𝑧 = 0,𝑧(0) = 1, 𝑧 ′ (0) = 0.
Si deve ridurre l’ODE di secondo ordine ad un sistema di due equazioni del primo ordine (usando 𝑥 = 𝑧, 𝑦 = 𝑧 ′ ) ed
applicare il metodo di Eulero:

2.4. Metodo di Eulero per i sistemi di equazioni differenziali

13Tutorial Sage, Release 10.4

sage: t,x,y = PolynomialRing(RealField(10),3,"txy").gens()
sage: f = y; g = -x - y * t
sage: eulers_method_2x2(f,g, 0, 1, 0, 1/4, 1)tx
h*f(t,x,y)
y
0
1
0.00
0
1/4
1.0
-0.062
-0.25
1/2
0.94
-0.12
-0.48
3/4
0.82
-0.16
-0.66
1
0.65
-0.18
-0.74

h*g(t,x,y)
-0.25
-0.23
-0.17
-0.081
0.022>>> from sage.all import *>>> t,x,y = PolynomialRing(RealField(Integer(10)),Integer(3),"txy").gens()>>> f = y; g = -x - y * t>>> eulers_method_2x2(f,g, Integer(0), Integer(1), Integer(0), Integer(1)/Integer(4),␣
˓→Integer(1))
txh*f(t,x,y)yh*g(t,x,y)
0
1
0.00
0
-0.25
1/4
1.0
-0.062
-0.25
-0.23
1/2
0.94
-0.12
-0.48
-0.17
3/4
0.82
-0.16
-0.66
-0.081
1
0.65
-0.18
-0.74
0.022

Pertanto, 𝑧(1) ≈ 0.75.
Si possono anche tracciare i punti (𝑥, 𝑦) per ottenere un grafico approssimato della curva. La funzione eulers_method_2x2_plot svolge questa funzione; per usarla, bisogna definire le funzioni f e g che prendono on argomento contre coordinate: (t, x, y).
sage: f = lambda z: z[2]# f(t,x,y) = y
sage: g = lambda z: -sin(z[1]) # g(t,x,y) = -sin(x)sage: P = eulers_method_2x2_plot(f,g, 0.0, 0.75, 0.0, 0.1, 1.0)>>> from sage.all import *>>> f = lambda z: z[Integer(2)]# f(t,x,y) = y>>> g = lambda z: -sin(z[Integer(1)]) # g(t,x,y) = -sin(x)>>> P = eulers_method_2x2_plot(f,g, RealNumber( 0.0 ), RealNumber( 0.75 ), RealNumber(
˓→ 0.0 ), RealNumber( 0.1 ), RealNumber( 1.0 ))A questo punto, P ha in memoria due grafici: P[0], il grafico di x vs. t, e P[1], il grafico di y vs. t. Si possono tracciare
entrambi come mostrato qui in seguito:
sage: show(P[0] + P[1])>>> from sage.all import *>>> show(P[Integer(0)] + P[Integer(1)])

14

Capitolo 2. Algebra di base e Analisi

Tutorial Sage, Release 10.4

2.5 Funzioni speciali
Sono implementati diversi polinomi ortogonali e funzioni speciali, usando sia PARI [GAP] che Maxima [Max]. Essi sono
documentati nelle sezioni apposite («Polinomi ortogonali» e «Funzioni speciali», rispettivamente) del manuale di Sage.
sage: x = polygen(QQ, x )sage: chebyshev_U(2,x)
4*x^2 - 1sage: bessel_I(1,1).n(250)
0.56515910399248502720769602760986330732889962162109200948029448947925564096
sage: bessel_I(1,1).n()0.565159103992485
sage: bessel_I(2,1.1).n()0.167089499251049>>> from sage.all import *>>> x = polygen(QQ, x )>>> chebyshev_U(Integer(2),x)4*x^2 - 1>>> bessel_I(Integer(1),Integer(1)).n(Integer(250))
0.56515910399248502720769602760986330732889962162109200948029448947925564096>>> bessel_I(Integer(1),Integer(1)).n()0.565159103992485>>> bessel_I(Integer(2),RealNumber( 1.1 )).n()0.167089499251049

A questo punto, Sage ha soltanto incorporato queste funzioni per l’uso numerico. Per l’uso simbolico, si usi direttamentel’interfaccia di Maxima, come nell’esempio seguente:sage: maxima.eval("f:bessel_y(v, w)")
bessel_y(v,w)
sage: maxima.eval("diff(f,w)")(bessel_y(v-1,w)-bessel_y(v+1,w))/2>>> from sage.all import *>>> maxima.eval("f:bessel_y(v, w)")
bessel_y(v,w)>>> maxima.eval("diff(f,w)")(bessel_y(v-1,w)-bessel_y(v+1,w))/2

2.5. Funzioni speciali

15

Tutorial Sage, Release 10.4

16

Capitolo 2. Algebra di base e Analisi

CAPITOLO

3

Indici e tabelle• genindex• modindex• search

17

Tutorial Sage, Release 10.4

18

Capitolo 3. Indici e tabelle

Bibliografia[PyB] (en) The Python Beginner’s Guide, https://wiki.python.org/moin/BeginnersGuide[PyT] (en) The Python Tutorial, https://docs.python.org/3/tutorial/[Sage] (en) Sage, https://www.sagemath.org[GAP] (en) The GAP Group, GAP - Groups, Algorithms, and Programming, Version 4.11; 2021, https://www.
gap-system.org[Max] (en) Maxima, Version 5.45; 2021, http://maxima.sf.net/

19