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.
vuoi
o PayPal
tutte le volte che vuoi
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.
<div>
Scarica il
</div>Daniele Lupo 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]:= è!!! è!!!
»» H5 H5
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: restituisce il numero delle soluzioni di poly
CountRoots[poly, {x, , m }
nell'intervallo complesso
m m {m
, }] 1 2
1 2 restituisce gli intervalli disgiunti che isolano le radici
RealRootIntervals[poly] reali di poly
poly restituisce gli intervalli disgiunti che isolani le radici
RealRootIntervals[{ ,
1 reali delle equazioni poly , poly , …
poly , … }] 1 2
2 restituisce gli intervalli disgiunti che isolano le
ComplexRootIntervals[poly] soluzioni complesse di poly
poly indovinate cosa fa??? Per i polinomi poly , poly , …
ComplexRootIntervals[{ 1 1 2
poly
, , … }]
2 n] restituisce un intervallo isolante che circonda il valore
ContractInterval[a, a fino alla precisione di almeno n
del numero algebrico
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 fediamo 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 contentente 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 + − +
, ,
, 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:
restituisce un approssimazione numerica della
NFourierTransform[expr,
w] trasformata di Fourier di expr valutata nel valore
t, w, mentr expr è considerata funzione di t
numerico
restituisce un approssimazione numerica della
NInverseFourierTransform[e
w, trasformata inversa di Fourier di expr valutata nel valore
xpr, t] w
numerico t, mentr expr è considerata funzione di
restituisce un approssimazione numerica della
NFourierSinTransform[expr,
w] trasformata in seno di Fourier di expr valutata nel valore
t, w, mentr expr è considerata funzione di t
numerico
frestituisce un approssimazione numerica della
NInverseFourierSinTransfor
w, trasformata inversa in seno di Fourier di expr valutata nel
t]
m[expr, valore numerico t, mentr expr è considerata funzione di
restituisce un approssimazione numerica della
NFourierCosTransform[expr,
w] trasformata in coseno di Fourier di expr valutata nel
t, w, mentr expr è considerata funzione di
valore numerico
restituisce un approssimazione numerica della
NInverseFourierCosTransfor
w, trasformata inversa in cosenodi Fourier di expr valutata
t]
m[expr, nel valore numerico t, mentr expr è considerata funzione
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
w
trasformata, per esempio in = 10, possiamo utilizzare la funzione del packge:
<< 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 vantagigo di questo comando, rispetto alla trasformata numerica predefinita in Mathematica, è
che, mentre quest'ultima lavora solamente con liste di dati, quella definira 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
-
restituisce l' n simo coefficiente nell'espansione in serie
FourierCoefficient[expr, esponenziale della funzione periodica in t uguale ad
t, n] 1 1
ÅÅÅÅ ÅÅÅÅ
t=- , t=
expr nell'intervallo 2 2
-
restituisce l' n simo coefficiente nell'espansione in
FourierSinCoefficient[expr, serie del seno
t, n] -
restituisce l' n simo coefficiente nell'espansione in
FourierCosCoefficient[expr, serie del coseno
t, n] t, k] restituisce la serie esponenziale fino all'ordine k
FourierSeries[expr, della funzione periodica in t uguale ad expr
1 1
ÅÅÅÅ ÅÅÅÅ
nell'intervallo t=- , t=
2 2
restituisce l'espansione in serie trigonometrica
FourierTrigSeries[expr, fino all'ordine k
t, 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
1 1
ÅÅÅÅ ÅÅÅÅ
considerazione dal comando è compreso in , non abbiamo bisogno di specificare il Round, e
2 2
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:
327
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
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
sombolici: restituisce l'approssimazione numerica dell'
NFourierCoefficient[expr, -
n simo coefficiente nell'espansione in serie
t, n] restituisce l'approssimazione numerica dell'
NFourierSinCoefficient[expr -
n simo coefficiente nell'espansione in serie seno
t, n]
, restituisce l' approssimazione numerica dell'
NFourierCosCoefficient[expr - simo coefficiente nell' espansione in serie coseno
n
t, n]
, t, k] trova l'espansione in serie esponenziale, di ordine k,
NFourierSeries[expr, con coefficienti numerici
trova l'espansione in serie trigonometrica, di ordine k,
NFourierTrigSeries[expr, con coefficienti numerici
t, k]
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
1 1
ÅÅÅÅ ÅÅÅÅ
sarà più contenuto in , Per ovviare a ciò, dobbiamo modificare i parametri di Fourier. Per
2 2
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
More…
digits of working precision to meet these tolerances.
82.00009, 8x → −3.14159<<
Out[34]=
Possiamo vedere (nonostante il warning, dovuto al fatto che abbiamo un piccolo problema di
p,
convergenza, perchè il minimo è una cuspide), che il periodo è fra -p 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 d i s c r e t e inverse discrete Fourier transform
F o u r i e r
‚ ‚
convention Hr-1L Hs-1Lên
n n -2 p
1 1
ÅÅÅÅ
ÅÅÅÅÅ ÅÅÅÅ
ÅÅÅÅÅ i
Mathematica u v e
{0, 1} r s
Hr-1L Hs-1Lên
1ê2 1ê2
n n
r=1 s=1
default p
2 i
e ⁄
‚ Hr-1L Hs-1Lên
n -2 p
1 n
ÅÅÅÅ i
data analysis u v e
{-1, 1} r s
Hr-1L Hs-1Lên s=1
n r=1
p
2 i
e
⁄ ‚ Hr-1L Hs-1Lên
n p
1
n ÅÅÅÅ 2 i
s i g n a l u v e
Hr-1L Hs-1Lên
{1, -1} r s
r=1 n s=1
-2 p i
processing e