Appunti di Mathematica
Packages
Vediamo adesso alcuni packages, predefiniti in Mathematica, che potrebbero essere particolarmente utili per risolvere particolari problemi (per esempio, disegnare diseguaglianze, o tracciare diagrammi di Bode, che hanno scale logaritmiche).
Di solito i packages vengono trascurati, e ci si concentra solamente sulle funzioni predefinite in Mathematica. Questo di certo non è male, per chi ci mette mano per la prima volta, tuttavia trascurare i package secondo me rappresenta un grave errore; si pensa che si tratti solamente di comandi aggiuntivi di poca importanza, e che la sostanza è in Mathematica stessa. Questo è vero e falso allo stesso tempo: vero perché i packages sono scritti nel linguaggio standard di Mathematica, e quello che fanno lo potete fare anche voi definendo le vostre funzioni: falso perché per implementare una funzione di quelle definite nei packages occorrerebbero pagine e pagine di codice, che fortunatamente qualcun altro ha già scritto per noi. Non si tratta solamente di orpelli, ma ci sono molti comandi che possono veramente semplificare la vita di chi utilizza Mathematica. Sono certo che fra i vari package ce ne saranno almeno un paio che troverete invitanti, e che non abbandonerete.
Capisco che la prima cosa che si deve fare è imparare ad usare il programma ma, una volta imparato, imparare i comandi dei package (mica tutti: l'help serve anche per trovare quello che cercate in un dato momento), vi permette di fare cose che altrimenti, diciamocela tutta, non sapreste fare.
Non li elencherò tutti, perché sono troppi, ma quelli che reputo utili (o che almeno mi sono serviti) sono tutti qua; considero anche il fatto che, pur essendo solamente alcuni, sono già parecchi, per cui avrete di che sperimentare ed imparare fino alla laurea ed oltre... Ovviamente appena finito di leggere queste pagine dovete correre a leggervi l'help per scoprire gli altri!!!!
Comunque, cominciamo:
Algebra`AlgebraicInequalities`
<< Algebra`InequalitySolve`
In[1]:=
Questo package contiene una funzione utilizzata per risolvere una disequazione (oppure un sistema di disequazioni): x] trova i valori di x che soddisfano l'espressione
InequalitySolve[expr, contenente operatori logici e disuguaglianze algebriche
x p r, trova i valori di x che soddisfano le diseguaglianze
I n e q u a l i t y S o l v e [e i
x
{x , , … }]
1 2 320
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Supponiamo di avere la seguente espressione:
ê H1
= + <
diseguaglianza x ^ 2 xL 5
In[2]:= 2
x < 5
Out[2]= +
1 x
InequalitySolve@diseguaglianza, xD
In[3]:= è!!! è!!!
L L
1 1
< −1 − +
< <
x 3 3
5 x 5
Out[3]= 2 2
Come potete vedere, abbiamo ottenuto la soluzione che volevamo.
Un sistema di diseguaglianze viene scritto come un'unica equazione, dove le varie parti del sistema sono legate fra di loro dall'operatore AND:
=
ê H4 ê Hx
sistema
In[4]:= > + − <
y x x ^ 3 yL yL && x y ^ 2
+
3
y 4 x y
> < 2
&& x y
Out[4]= −
x x y 8x,
InequalitySolve@sistema, y<D
In[5]:= è!!!
Hx »» H0 L »» Hx
< < < ≤ > > >
0 && y xL x 1 && y x 1 && y xL
Out[5]=
Abbiamo utilizzato le soluzioni desiderate, sotto forma di condizioni per le incognite.
Come potete vedere, questo comando è molto potente, anche se funziona soltanto con equazioni polinomiali: < +
InequalitySolve@Exp@xD 1 x, xD
In[6]:=
— InequalitySolve::npi : A nonpolynomial equation or inequality encountered. The solution set may be incorrect.
False
Out[6]=
Come potete vedere, non possiamo ottenere gli intervalli, in questo caso.
321
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Algebra`ReIm`
Questo package permette di lavorare meglio con funzioni complesse, estraendone parte reale ed immaginaria senza dover utilizzare ComplexExpand.
Vediamo, per esempio, questa espressione:
ê
Re@x yD
In[7]:= E
x
ReA
Out[7]= y
Vediamo che rimane non valutata. Andiamo, adesso, a caricare il package:
<< Algebra`ReIm`
In[8]:= ê
Re@x yD
In[9]:= Re@xD
Im@xD Im@yD Re@yD
+
Out[9]= 2 2 2 2
+ +
Re@yD Re@yD
Im@yD Im@yD
Come si vede, questa volta Mathematica esplicita direttamente la parte reale ed immaginaria dei simboli, evitando comandi come ComplexExpand. Tuttavia, se specifichiamo un simbolo come reale o come immaginario, senza dover specificare il simbolo esplicitamente:
ê: =
y Re@yD 0;
In[10]:= ê
Re@x yD
In[11]:= Im@xD
Out[11]= Im@yD
Come vedere, con il package abbiamo calcolato il valore considerando l'assunzione che avevamo fatto.
322
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Algebra`RootIsolation`
Con questo package possiamo avere funzioni per gestire meglio il conteggio e l'isolamento di soluzioni di equazioni polinomiali:
- CountRoots[poly, {x, m1, m2}] restituisce il numero delle soluzioni di poly nell'intervallo complesso.
- RealRootIntervals[poly] restituisce gli intervalli disgiunti che isolano le radici reali di poly.
- RealRootIntervals[{poly1, poly2, …}] restituisce gli intervalli disgiunti che isolano le radici reali delle equazioni poly1, poly2, …
- ComplexRootIntervals[poly] restituisce gli intervalli disgiunti che isolano le soluzioni complesse di poly.
- ComplexRootIntervals[{poly1, poly2, …}] indovinate cosa fa??? Per i polinomi poly1, poly2, …
- ContractInterval[a, b, n] restituisce un intervallo isolante che circonda il valore del numero algebrico fino alla precisione di almeno n cifre significative.
Si possono eseguire delle operazioni sui polinomi e scoprire proprietà sulle loro radici senza bisogno di andare a trovarle esplicitamente. Per esempio:
<< Algebra`RootIsolation`
In[12]:= Hx 8x,
− + − −5,
CountRoots@Hx 4L ^ 4 3 x 6L, 5<D
In[13]:= 3
Out[13]=
Abbiamo visto che nell'intervallo specificato si trovano tre soluzioni, senza averle calcolate:
8x,
+ +
CountRoots@x ^ 9 1, 0, 1 I<D
In[14]:= 2
Out[14]=
Come vedete, funziona anche per intervalli complessi.
Consideriamo ancora la prima espressione, e vediamo gli intervalli delle soluzioni reali:
H−6 LD
+ + + 4
RealRootIntervals@H−4 xL 3 x x
In[15]:= 88−3, 81, 82,
0<, 2<, 6<<
Out[15]=
Questi sono, per l'appunto, intervalli disgiunti, ognuno contenente una radice reale del polinomio.
Analogamente possiamo realizzarli per le soluzioni immaginarie:
323
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
+
ComplexRootIntervals@x ^ 9 1D
In[16]= 98−2, 9− =, 9− =, 9− 9− =,
3 3 3 3 3 3 3 3 3 3
− − − + −
0<, , , , 0=, ,
Out[16]= =, 90, =, 9 =, 9 ==
9− 2 2 4 2 4 4
2 2 4 2
3 3 3 3 3 3 3 3 3 3 3
3 3 + − +
, ,
, 4
2 4 2 4 2 2 4 2 2
Possiamo anche specificare un intervallo piccolo a piacere per una soluzione:
+
ContractInterval@Root@x ^ 9 1, 2D, 20D
In[17]= 9− 56524103165212567109 189717416474225563087
− ,
Out[17]= =
73786976294838206464 295147905179352825856
452192825321700536871 379434832948451126173
− − 590295810358705651712
590295810358705651712
N@%, 20D
In[18]= 8−0.76604444311897803520 <
− 0.64278760968653932632 ,
Out[18]= −0.76604444311897803520 − 0.64278760968653932632
Come potete vedere, possiamo ottenere l'approssimazione che vogliamo.
324
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Calculus`FourierTransform`
Questo package contiene alcune funzioni che sono l'equivalente numerico dei comandi per la trasformata di Fourier predefinite in Mathematica:
- NFourierTransform[expr, t, w] restituisce un'approssimazione numerica della trasformata di Fourier di expr valutata nel valore numerico w, mentre expr è considerata funzione di t.
- NInverseFourierTransform[expr, w, t] restituisce un'approssimazione numerica della trasformata inversa di Fourier di expr valutata nel valore numerico t, mentre expr è considerata funzione di w.
- NFourierSinTransform[expr, t, w] restituisce un'approssimazione numerica della trasformata in seno di Fourier di expr valutata nel valore numerico w, mentre expr è considerata funzione di t.
- NInverseFourierSinTransform[expr, w, t] restituisce un'approssimazione numerica della trasformata inversa in seno di Fourier di expr valutata nel valore numerico t, mentre expr è considerata funzione di w.
- NFourierCosTransform[expr, t, w] restituisce un'approssimazione numerica della trasformata in coseno di Fourier di expr valutata nel valore numerico w, mentre expr è considerata funzione di t.
- NInverseFourierCosTransform[expr, w, t] restituisce un'approssimazione numerica della trasformata inversa in coseno di Fourier di expr valutata nel valore numerico t, mentre expr è considerata funzione di w.
Supponiamo di avere la seguente espressione:
ê H1
= +
espr Exp@−Abs@t ^ 3DD Abs@tDL;
In[19]:= Timing@FourierTransform@espr, t, wDD
In[20]:= 921.422 3
−Abs@tD
Second, FourierTransformA , t, wE=
Out[20]= +
1 Abs@tD
Come potete vedere, in questo caso non è in grado di calcolare la trasformata di questa funzione, fra l'altro dopo un tempo neanche breve per il programma. Allora, se ci interessa comunque la trasformata, per esempio in w = 10, possiamo utilizzare la funzione del package:
<< Calculus`FourierTransform`
In[21]:= Timing@NFourierTransform@espr, t, 10DD
In[22]:= 80.016 <
+
Second, 0.00716034 0.
Out[22]= 325
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Come potete vedere, non solo abbiamo trovato la soluzione che ci interessava, ma abbiamo anche risparmiato un sacco di tempo...
8ω,
Plot@
In[23]:= ωDDD, −8,
8Hue@0.35D,
Evaluate@Abs@NFourierTransform@espr, t, 8<,
→
PlotStyle Thickness@0.013D<,
→
Frame True,
D
PlotLabel "Trasformata numerica di Fourier per espr"
Trasformata numerica di Fourier per espr
0.5
0.4
0.3
0.2
0.1
0 -7.5 -5 -2.5 0 2.5 5 7.5
Graphics
Out[23]=
Come potete vedere, non è poi molto importante il non poter calcolare analiticamente la funzione, a meno che non dobbiate scriverlo sul quaderno, ovvio...
Il vantaggio di questo comando, rispetto alla trasformata numerica predefinita in Mathematica, è che, mentre quest'ultima lavora solamente con liste di dati, quella definita nel package invece lavora su funzioni, il che specialmente in calcoli teorici è un bel vantaggio.
Oltre che per la trasformata generale, il pacchetto offre anche funzioni per lavorare con le funzioni periodiche e con la serie di Fourier:
326
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
- FourierCoefficient[expr, t, n] restituisce l'n-simo coefficiente nell'espansione in serie esponenziale della funzione periodica in t uguale ad expr nell'intervallo t = −1/2, t = 1/2.
- FourierSinCoefficient[expr, t, n] restituisce l'n-simo coefficiente nell'espansione in serie del seno.
- FourierCosCoefficient[expr, t, n] restituisce l'n-simo coefficiente nell'espansione in serie del coseno.
- FourierSeries[expr, t, k] restituisce la serie esponenziale fino all'ordine k della funzione periodica in t uguale ad expr nell'intervallo t = −1/2, t = 1/2.
- FourierTrigSeries[expr, t, k] restituisce l'espansione in serie trigonometrica fino all'ordine k.
Supponiamo di avere la classica onda quadra:
ê 8x,
= − − −2,
p1 Plot@Hx Round@xDL Abs@x Round@xDD, 2<D
In[24]:= 1
0.5
-2 -1 1 2
-0.5
-1
Graphics
Out[24]= H- L,
Sviluppiamo adesso i primi quattro termini della serie di Fourier: dato che l'intervallo preso in considerazione dal comando è compreso in −1/2, 1/2, non abbiamo bisogno di specificare il Round, e basta scrivere:
ê
FourierTrigSeries@Abs@tD t, t, 5D
In[25]= π π π
4 Sin@2 tD 4 Sin@6 tD 4 Sin@10 tD
+ +
Out[25]= π π π
3 5
Vediamo che effettivamente rappresenta quello che volevamo:
8t, 8RGBColor@0.3,
−2, →
Plot@%, 2<, PlotStyle 0.6, 0.7D<D
In[26]= 1
0.5
-2 -1 1 2
-0.5
-1
Graphics
Out[26]= Show@p1, %D
In[27]= 1
0.5
-2 -1 1 2
-0.5
-1
Graphics
Out[27]=
Come potete vedere, l'espansione trigonometrica (troncata) rappresenta effettivamente l'espansione in serie di Fourier. Possiamo anche trovarci la serie esponenziale, se vogliamo:
ê
FourierSeries@Abs@tD t, t, 5D
In[28]= −2 π π −6 π π −10 π π
t 2 t t 6 t t 10 t
2 2 2
2 2
2 − + −
− +
Out[28]= π π π
π π π
3 3 5 5
Naturalmente, possono capitare casi in cui non è possibile risolvere simbolicamente l'espansione in serie:
328
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Clear@esprD
In[29]:= espr@t_D := Cos@Cos@tDD
In[30]:= FourierTrigSeries@espr@tD, t, 3D
In[31]:= †
† 1 1
2 2
+ π π +
Cos@Cos@tDD t 2 Cos@2 tD Cos@2 tD Cos@Cos@tDD t
Out[31]= 1 1
− −
2 2
† 1
2 π +
π Cos@4 tD Cos@Cos@tDD t
2 Cos@4 tD 1
− 2
† 1
2 π
π Cos@6 tD Cos@Cos@tDD t
2 Cos@6 tD 1
− 2
Possiamo comunque ottenere la serie con coefficienti numerici, se non riusciamo a trovare i simbolici:
- NFourierCoefficient[expr, t, n] restituisce l'approssimazione numerica dell'n-simo coefficiente nell'espansione in serie.
- NFourierSinCoefficient[expr, t, n] restituisce l'approssimazione numerica dell'n-simo coefficiente nell'espansione in serie seno.
- NFourierCosCoefficient[expr, t, n] restituisce l'approssimazione numerica dell'n-simo coefficiente nell'espansione in serie coseno.
- NFourierSeries[expr, t, k] trova l'espansione in serie esponenziale, di ordine k, con coefficienti numerici.
- NFourierTrigSeries[expr, t, k] trova l'espansione in serie trigonometrica, di ordine k, con coefficienti numerici.
Vediamo di risolvere il problema di poco fa in termini numerici:
NFourierTrigSeries@espr@tD, t, 3D
In[32]= − π + π −
0.574072 0.0405754 Cos@2 tD 0.00954455 Cos@4 tD
Out[32]= π + π + π + π
0.00419166 Cos@6 tD 0. Sin@2 tD 0. Sin@4 tD 0. Sin@6 tD
Notate anche che, se avete espressioni comunque convertibili, nella stragrande maggioranza dei casi la soluzione numerica si trova molto più velocemente di quella simbolica, per cui, per espressioni complicate, usatela solo se vi serve veramente.
H- L.
Inoltre, potremmo avere funzioni periodiche, ma con un periodo diverso da 1, per cui il periodo non sarà più contenuto in −1/2, 1/2. Per ovviare a ciò, dobbiamo modificare i parametri di Fourier. Per esempio, se ho:
329
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Hf = + +
8x,
3 Sqrt@Abs@Sin@xDDD Cos@3 xD;
In[33]:= −7,
Plot@f, 7<DL 5
4.5
4
3.5
3
2.5
-6 -4 -2 2 4 6
Graphics
Out[33]= 8x, −4<D
FindMinimum@f,
In[34]:=
— FindMinimum::lstol :
The line search decreased the step size to within tolerance specified by AccuracyGoal and PrecisionGoal but was unable to find a sufficient decrease in the function. You may need more than MachinePrecision digits of working precision to meet these tolerances.
More…
82.00009, 8x → −3.14159<<
Out[34]=
Possiamo vedere (nonostante il warning, dovuto al fatto che abbiamo un piccolo problema di convergenza, perché il minimo è una cuspide), che il periodo è fra −π e π per cui dobbiamo far sapere al comando che questi sono i nuovi limiti; per far questo si utilizza l'opzione Fourier-Parameters, modificando i parametri necessari:
330
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
common setting discrete inverse discrete Fourier transform
Fourier
convention (r−1)(s−1)/n
n n −2 π
1 1
i
Mathematica u v e
{0, 1} r s
default π
2 i
e /
(r−1)(s−1)/n
n −2 π
1 n
i
data analysis u v e
{−1, 1} r s
(r−1)(s−1)/n s=1
n r=1
π
2 i
e
signal u v e
(r−1)(s−1)/n
{1, −1} r s
r=1 n s=1
−2 π i
e
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Pacchetti fondamentali di Mathematica
Nel documento vengono presentati i “pacchetti” (Packages) fondamentali di Mathematica: tali pacchetti raccolgono al loro interno tutta una serie di comandi e funzioni predefinite che, sebbene possano essere programmate anche in autonomia da ogni singolo utente, vengono standardizzate nel software e quindi risultano più comode da usare. Il documento si divide in tre parti: nella prima si analizzano pacchetti per il calcolo simbolico o la risoluzione di problemi speciali (calcolo delle radici di un'equazione, operazioni con i numeri complessi, trasformate di Fourier…).
Nella seconda e più estesa parte si analizzano molti dei pacchetti grafici del software: dal classico plot per le funzioni nel piano cartesiano, a quello per grafici 3D, passando per i grafici discreti, gli alberi, le curve parametriche e altri.
Nell’ultima parte vengono introdotti i pacchetti di algebra lineare, quali il calcolo matriciale e vettoriale o l’ortogonalizzazione di vettori.