Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
Matematica I:
Introduzione a MATLAB
Introduzione a MATLAB
Questo capitolo introduttivo si propone lo scopo di fornire una breve guida a MATLAB. Per maggiori approfondimenti, oltre ai laboratori MATLAB presentati nel seguito, rimandiamo a testi pi` u specici 1 . Per iniziare a lavorare con MATLAB in ambiente Windows solitamente occorre selezionare licona di MATLAB nel desktop o nella barra comandi, mentre se si usa il sistema operativo Unix (o qualche derivato come Linux) ` e necessario scrivere matlab, seguito da invio, in una nestra al prompt dei comandi. Una volta avviato, MATLAB vi ore diverse nestre; sseremo la nostra attenzione sulla nestra dei comandi caratterizzata dal prompt >> se state utilizzando la versione Professional Edition o dal prompt EDU>> nel caso abbiate a disposizione la versione Student Edition. Per comodit` a nel seguito utilizzeremo sempre >> per indicare il prompt della riga comandi della nestra principale di MATLAB.
Prime operazioni
MATLAB pu` o essere utilizzato in modo diretto per calcolare semplici espressioni matematiche: >> 8 + 3 - 1 ans = 10 >> 1/sqrt(2) ans = 1.4142 La funzione sqrt ` e una funzione matematica elementare di MATLAB che calcola la radice quadrata del suo argomento. La risposta ` e del tipo ans=..., dove ans ` e una variabile generata automaticamente da MATLAB quando unespressione non ` e assegnata a una variabile denita dallutente. Le variabili denite dallutente possono essere utilizzate in altre espressioni matematiche >> a = 8 + 3 - 1 a = 10 >> b = 1/sqrt(2) b = 1.4142 >> c = a + b c = 11.4142
1 Si veda oltre alla Reference Guide di MATLAB, il testo MATLAB: concetti e progetti, ed. Apogeo 2002, degli stessi autori.
Introduzione a MATLAB
Per evitare la visualizzazione del risultato basta concludere lespressione con un punto e virgola ;. Per visualizzare il contenuto di una variabile ` e suciente scriverne il nome/i eventualmente separati con una virgola: , >> a,b,c a = 10 b = 1.4142 c = 11.4142 Pi` u espressioni o pi` u istruzioni MATLAB possono convivere sulla stessa riga, basta che siano separate da un punto e virgola (se vogliamo sopprimere la visualizzazione di qualche risultato) oppure da una virgola (se vogliamo visualizzare il risultato). Per esempio > a=2+3/5; b=sqrt(a), c=a*b b = 1.6125 c = 4.1924 I nomi delle variabili possono essere lunghi un massimo di 31 caratteri con la distinzione tra lettere maiuscole e minuscole, per esempio le variabili a e A sono distinte. La prima lettera di una variabile deve essere un carattere alfabetico (a-z, A-Z), mentre dalla seconda lettera in avanti possiamo utilizzare un qualsiasi carattere alfanumerico incluso il simbolo underscore .
Variabile ans i,j pi eps realmax realmin Inf NaN computer version
Signicato valore ultima operazione eseguita non assegnata a una variabile unit` a immaginaria, 1 approssimazione di , 3.14159265... precisione macchina massimo numero macchina positivo rappresentabile minimo numero macchina positivo rappresentabile , ossia un numero maggiore di realmax Not a Number, tipicamente il risultato di unespressione 0/0 tipo di computer versione di MATLAB
Alcune variabili sono predenite in MATLAB per la memorizzazione di valori speciali. Parte di queste variabili sono riportate nella Tabella 2.4. Il signicato delle variabili eps, realmax, realmin, Inf e NaN ` e strettamente legato allaritmetica e allinsieme dei numeri macchina utilizzato. I principali operatori disponibili in MATLAB sono indicati nella Tabella 2.5. Vi sono gli usuali operatori aritmetici e altri operatori preceduti da un punto, vedremo in seguito il signicato delle operazioni corrispondenti. I numeri in virgola mobile (la rappresentazione che un calcolatore fa dei numeri reali) non sono lunico tipo di dato numerico ammesso. Un altro tipo di dato utile in varie applicazioni e presente in MATLAB sono i numeri complessi e le operazioni con questi. Un numero complesso z , in forma algebrica z = Re z + iIm z (con Re z , Im z parte reale e parte immaginaria, due valori reali), pu` o essere scritto in modo simile anche in MATLAB:
Introduzione a MATLAB
Operatore + * / .* ./ .
Signicato addizione sottrazione moltiplicazione divisione elevamento a potenza moltiplicazione termine a termine per vettori divisione termine a termine per vettori elevamento a potenza termine a termine per vettori
>> a=3+4i; >> b=2.6+3.3i; >> a+b ans = 5.6000 + 7.3000i >> a*b ans = -5.4000 +20.3000i Ricordiamo che lunit` a immaginaria, rappresentata dalle variabili i e j, ` e tale che i2 = 2 j = 1. Le forme a=3+4i, a=3+4*i, a=3+4j, a=3+4*j sono accettate e sono equivalenti. Oltre alle operazioni di base, molte delle funzioni comunemente disponibili per una calcolatrice scientica sono presenti in MATLAB. Per esempio >> y=cos(pi/4)+sin(pi/4) y = 1.4142 utilizza le funzioni trigonometriche coseno cos e seno sin, con argomento /4, somma tali valori e inne assegna il risultato alla variabile y . Si noti che il risultato dellespressione cos (/4) + sin (/4) ` e visualizzato utilizzando solo ` quattro cifre decimali. Questa ` e limpostazione del formato standard di MATLAB. E possibile modicarla tramite il comando format. Per esempio >> format long >> cos(pi/4)+sin(pi/4) ans = 1.41421356237309 >> format short abilita prima il formato a 14 cifre decimali (format long), calcola il risultato, poi riattiva il formato standard a 4 cifre decimali (format short)2 . Per numeri molto piccoli o molto grandi ` e comoda la notazione esponenziale scientica in cui si esprime un valore numerico come un numero (maggiore di 1 e minore di 10, detto mantissa ), moltiplicato per una opportuna potenza di 10, detta esponente. Per esempio il numero 31415000000 sar` a rappresentato come 3.1415e+010 che signica 3. 1415 1010 , mentre il numero 0.000001234 come 1.2340e-006, ossia 1. 234 106 . Alcune funzioni matematiche elementari predenite in MATLAB, sono riportate nella Tabella 2.6, per una lista pi` u ampia si provi il comando help elfun.
2 La modica della visualizzazione di un risultato tramite format non ha nulla a che vedere con leettiva precisione con cui MATLAB eettua il calcolo. Tutte le operazioni in MATLAB sono eseguite in doppia precisione, questo vuol dire avere almeno 15 cifre decimali signicative.
Introduzione a MATLAB
Funzione sin cos asin acos tan atan exp log log2 log10 sqrt abs sign
Signicato seno coseno arcoseno arcocoseno tangente arcotangente esponenziale logaritmo naturale, base e logaritmo in base 2 logaritmo in base 10 radice quadrata valore assoluto la funzione segno
Vettori e matrici
Se le operazioni viste nella sezione precedente sono comuni a molte calcolatrici tascabili non altrettanto si pu` o dire della capacit` a di eettuare calcoli con matrici e vettori. In tale ambito MATLAB esprime al meglio le sue potenzialit` a (non a caso lacronimo MATLAB sta per MATrix LABoratory). Dallalgebra lineare sappiamo come i vettori possono essere considerati casi particolari di matrici. Per esempio un vettore di dimensione 8 nella forma riga o colonna ` e, rispettivamente, una matrice di tipo 1 8 (una riga e otto colonne) o 8 1 (otto righe e una colonna). Questo ` e esattamente il modo in cui MATLAB denisce i vettori. Non solo, per MATLAB anche le quantit` a scalari sono semplici matrici di tipo 1 1. Per memorizzare il vettore x = (1,3,5,7,9,11,13,15)T nella forma riga in MATLAB possiamo scrivere >> x = [1 3 5 7 9 11 13 15] x = 1 3 5 7 9
11
13
15
Le parentesi quadre delimitano gli elementi del vettore, mentre gli spazi bianchi le singole componenti del vettore riga. Il vettore colonna pu` o invece essere ottenuto come segue >> x = [1;3;5;7;9;11;13;15] x = 1 3 5 7 9 11 13 15 Le componenti in questo caso sono delimitate da un punto e virgola che serve per indicare la ne della riga. Per accedere al valore di una componente del vettore (riga o colonna) basta scrivere >> x(4) ans = 7
Introduzione a MATLAB
Se cambiamo il valore di una componente del vettore dobbiamo ricordarci di usare il punto e virgola per evitare la visualizzazione dellintero vettore >> x(4)=1; Per passare da vettori riga a vettori colonna si utilizza il simbolo di apostrofo, per esempio >> x = [1 3 5 7 9 11 13 15] x = 1 3 5 7 9 11 13 15 Dal punto di vista dellalgebra lineare loperazione che si eettua ` e la trasposizione. La funzione length in MATLAB consente di determinare la lunghezza di un vettore >> length(x) ans = 8 Se ora vogliamo inserire la matrice 2 4 8 1 3 : A=> 9 11 possiamo scrivere >> A = [1 3 5 7 ; 9 11 13 15] A = 1 3 5 7 9 11 13 15 Anche in questo caso gli spazi separano gli elementi per colonna e il punto e virgola separa le righe. Potremo accedere agli elementi della matrice in maniera naturale utilizzando i corrispondenti indici >> A=(1,3) ans= 5 Se vogliamo quindi cambiare lelemento A(1,3) basta scrivere >> A=(1,3)=4; La funzione MATLAB che ci consente di determinare le dimensioni di una matrice ` e size >> size(A) ans = 2 4 Se vogliamo controllare le variabili che attualmente MATLAB ha memorizzato nellarea di lavoro, Workspace, possiamo usare i comandi who e whos. Il primo comando, who, elenca i nomi delle variabili attualmente presenti mentre whos aggiunge informazioni riguardanti il tipo di variabile e loccupazione di memoria, >> who Your variables are: A x 5 13
9 7 > ;, 15
Introduzione a MATLAB
Bytes 64 64
Grand total is 16 elements using 128 bytes Come si pu` o notare una variabile reale occupa 8 byte di memoria. Per rimuovere le variabili dalla memoria lavoro di MATLAB si utilizza listruzione clear >> clear x A Un operatore di fondamentale importanza per costruire vettori equispaziati e per operare con insiemi di indici ` e la notazione due punti . Il vettore x utilizzato in precedenza, x = [1 3 5 7 9 11 13 15], potrebbe essere generato come >> x = 1:2:15; Altri esempi sono i seguenti >> y=1:9 y = 1 2 >> z=10:-2:2 z = 10 8
3 6
4 4
5 2
Se il valore iniziale ` e maggiore di quello nale e il passo ` e positivo viene creato un vettore vuoto >> x=7:1 x = [] Si noti che il vettore vuoto (tabella vuota) si denota in MATLAB con []. Il vettore vuoto ha lunghezza zero, dimensione 0 0. La notazione due punti funziona anche con valori non interi, per esempio >> x=0:0.2:1 x = 0 0.2000
0.4000
0.6000
0.8000
1.0000
Nel caso in cui il passo non sia intero pu` o risultare dicile luso delloperatore due punti. Per esempio se vogliamo creare un vettore con un numero pressato di punti equispaziati allinterno di un dato intervallo. In questo caso ` e preferibile utilizzare il comando linspace. Per esempio >> a = 0; b=1; n=8; >> x = linspace(a,b,n) x = Columns 1 through 7 0 0.1429 0.2857 Column 8 1.0000
0.4286
0.5714
0.7143
0.8571
restituisce un vettore riga x di lunghezza n con la propriet` a che lelemento di indice i vale x(i) = a + (i 1) (b a)/(n 1). Un uso particolarmente ecace della notazione due punti si ha nella gestione di indici di vettori e matrici. Per esempio utilizzare i due punti : singolarmente signica selezionare ogni elemento di una data riga o colonna
Introduzione a MATLAB
>> A = [1 2 3; 4 5 6; 7 8 9]; >> A(:,1) ans = 1 4 7 >> A(3,:) ans = 7 8 9 Naturalmente ` e possibile specicare un intervallo di indici ed estrarre cos` parti di vettori (o matrici) >> x=0:0.2:1.0; >> x(2:5) ans = 0.2000 0.4000 0.6000 >> A = [1 2 3 ; 4 5 6 ; 7 8 9]; >> A(:,1:2) ans = 1 2 4 5 7 8
0.8000
o parti di righe e colonne in matrici e sottomatrici >> A = [1 2 3; 4 5 6; 7 8 9]; >> A(3,1:2) ans = 7 8 >> A(2:3,1:2) ans = 4 5 7 8 La notazione due punti pu` o essere usata anche per assegnare in modo rapido nuovi valori a righe e colonne di matrici >> A = [1 2 3; 4 >> A(2,:)=2:2:6 A = 1 2 2 4 7 8 5 6; 7 8 9]; 3 6 9
Esistono molte funzioni MATLAB che consentono di costruire particolari matrici e vettori, alcune di queste sono riportate per convenienza nella Tabella 2.7. Queste funzioni MATLAB possono essere utilizzate con un diverso numero di parametri. Per esempio abbiamo >> B=zeros(2,3) B = 0 0 0 0 >> Z = zeros(2) Z = 0 0 0 0
0 0
Analogamente per altre funzioni quali ones, rand, eye. Attenzione, nel caso la matrice abbia elementi complessi la trasposizione non si limita a scambiare righe con colonne, ma applica loperazione di coniugazione a ogni componente
Introduzione a MATLAB
Azione vettore riga di elementi equispaziati vettore riga di elementi equispaziati in scala logaritmica matrice contenente solo elementi uguali a zero matrice contenente solo elementi uguali a uno matrice contenente numeri pseudo-casuali in [0,1] matrice identit` a matrice diagonale
Tabella 2.7 Alcune funzioni predenite per la costruzione di particolari matrici in MATLAB.
>> A=[1+3i 2+5i ; 6+7i 1-4i] A = 1.0000 + 3.0000i 2.0000 6.0000 + 7.0000i 1.0000 >> A ans = 1.0000 - 3.0000i 6.0000 2.0000 - 5.0000i 1.0000 >> I3 = I3 = 1 0 0 eye(3) 0 1 0 0 0 1
Listruzione c=cos(x) applicata a un vettore x restituisce un vettore c di uguali dimensioni e tipo con la propriet` a che lelemento di indice i vale c(i) = cos(x(i)). Listruzione [x c s] crea una matrice le cui colonne sono i vettori trasposti x, c e s. Uno dei vantaggi principali delluso di funzioni vettoriali si ha in termini di velocit` a di esecuzione delle operazioni rispetto alla corrispondente esecuzione in forma scalare. Consideriamo alcune operazioni che coinvolgono array a pi` u indici e che agiscono simultaneamente su tutte le componenti dellarray stesso (si veda la Tabella 2.5). Vediamo subito degli esempi,
10
Introduzione a MATLAB
>> x = [1 3 5 7 9]; >> y = [50 40 20 30 10]; >> 4*x ans = 4 12 20 28 >> x+y ans = 51 43 25 37 >> y-x ans = 49 37 15 23
36 19 1
Le tre operazioni appartengono allalgebra lineare e sono la moltiplicazione di un vettore per uno scalare, la somma e la dierenza tra vettori. In maniera del tutto analoga le precedenti operazioni agiscono su matrici >> A = [ 1 2 3 ; 4 5 6 ; 7 8 9]; >> B = [ 1 1 1 ; 2 2 2 ; 3 3 3]; >> C = A+B C = 2 3 4 6 7 8 10 11 12 >> 2*B ans = 2 4 6 2 4 6 2 4 6
Al contrario le operazioni puntuali sono tipiche di MATLAB e non hanno necessariamente un corrispondente dal punto di vista dellalgebra lineare. Per esempio >> x.*y ans = 50 120 >> y./x ans = 50.0000 >> x.^2 ans = 1 9 100 13.3333 25 49 210 90 4.0000 81 4.2857 1.1111
Listruzione x.*y eettua la moltiplicazione puntuale tra vettori e fornisce un vettore con la propriet` a che ogni sua componente ` e uguale al prodotto delle corrispondenti componenti dei singoli vettori x e y. Allo stesso modo agisce la divisione puntuale y./x restituendo un vettore le cui componenti sono il risultato della divisione delle corrispondenti componenti di y per quelle di x. Inne lespressione x. 2 eleva ogni componente del vettore x al quadrato. Per vettori x, y con le stesse dimensioni ` e anche possibile loperazione puntuale y. x, ogni componente del vettore y ` e elevato alla potenza determinata dalla corrispondente componente del vettore x >> y.^x ans = 1.0e+010 * 0.0000
0.0000
0.0003
2.1870
0.1000
Le stesse operazioni possono essere applicate nel caso di vettori colonna o pi` u in generale ` essenziale che gli operandi siano dello stesso tipo e abbiano le nel caso di matrici. E stesse dimensioni. Le uniche eccezioni a questa regola si vericano quando le precedenti operazioni vengono applicate coinvolgendo una matrice e una costante. In tal caso MATLAB considerer` a la costante come un vettore di pari dimensioni avente tutte componenti costanti
Introduzione a MATLAB
11
>> x = 1:7; >> x+2 ans = 3 4 >> 2-x ans = 1 0 >> 2./x ans = 2.0000
5 -1 1.0000
6 -2
7 -3
8 -4 0.5000
0.6667
Consideriamo ora il problema del calcolo di una tabella di valori di una funzione non predenita in MATLAB, per esempio la funzione razionale f (x) = 120 60x + 12x2 x3 120 + 60x + 12x2 + x3
sullintervallo [0,1]. Per costruire una tabella di 5 valori possiamo utilizzare la sequenza di istruzioni >> x = linspace(0,1,5); >> y = (120-60*x+12*x.^2-x.^3)./(120+60*x+12*x.^2+x.^3); >> [x y] ans = 0 1.0000 0.2500 0.7788 0.5000 0.6065 0.7500 0.4724 1.0000 0.3679 Utilizzando le operazioni vettoriali, i valori della funzione in corrispondenza della successione di punti denita dal vettore x sono creati con una singola istruzione vettoriale e assegnati al vettore y.
Funzioni avanzate
MATLAB ` e molto pi` u di un semplice software in grado di eseguire calcoli numerici (anche se in forma molto sosticata come abbiamo visto nei paragra precedenti). Con MATLAB ` e possibile realizzare graci di funzioni anche in pi` u dimensioni e realizzare veri e propri programmi. Non solo, tramite il Symbolic Toolbox con MATLAB ` e possibile anche eseguire calcoli simbolici.
Cenni di graca
Uno dei punti di forza di MATLAB ` e la sua capacit` a graca che consente di rappresentare dati memorizzati in vettori e matrici in molti modi dierenti. Graci bidimensionali vengono utilizzati per visualizzare la variazione di una variabile rispetto a unaltra, per esempio il graco di una funzione y = f (x). Se vogliamo visualizzare in forma graca la funzione sin(x) sullintervallo [0,2 ], possiamo per esempio scrivere >> ezplot(sin(x),[0,2*pi]); Ma come ha fatto MATLAB a realizzare il graco della funzione? Se procediamo in modo diverso possiamo capire quale automatismo sia insito nella funzione ezplot. Costruiamo prima una successione di valori della funzione del tipo
12
Introduzione a MATLAB
>> n = 31; >> x = linspace(0,2*pi,n); >> y = sin(x); dove in questo caso abbiamo scelto 31 punti equispaziati. Per realizzare il graco basta aggiungere listruzione >> plot(x,y) In questo modo otteniamo una rappresentazione graca della tabella di valori ottenuta semplicemente raccordando con segmenti di retta nel piano cartesiano (x,y ) i vertici (x(i),y (i)) in modo ordinato al variare di i da 1 a 31. La scelta della scala di visualizzazione ` e automatica. Se vogliamo evidenziare i vertici della poligonale cos` costruita possiamo utilizzare listruzione >> plot(x,y,-o) che disegna una linea con un circoletto in corrispondenza dei vertici. Non cambia la funzione ma i parametri in ingresso, in questo caso i parametri aggiunti specicano lo stile della linea del graco.
Esistono molte possibilit` a per personalizzare un graco come quello creato nellesempio precedente, nella Tabella 2.8 riportiamo le opzioni principali. Possiamo inoltre commentare il graco aggiungendo delle scritte sugli assi coordinati e mettendo un titolo >> title(Grafico della funzione sin(x)) >> xlabel(asse x) >> ylabel(asse y) Se vogliamo produrre un risultato visivamente privo di spigoli, sar` a suciente aumentare il numero di punti n in modo tale che i segmenti di raccordo siano cos` piccoli da fornire limpressione di una curva continua (vedi la Figura 2.5). ` possibile cambiare scala nei graci tramite la funzione axis che permette di stabilire E la grandezza della nestra in cui vedere il graco. Per esempio >> x = linspace(0,2*pi); >> y = sin(x); >> plot(x,y); >> a = axis a = 0 7 -1 1 >> axis([a(1) pi a(3) a(4)]);
Introduzione a MATLAB
13
0.8
0.6
0.6
0.4
0.4
asse y
asse y
0.2
0.2
0.2
0.2
0.4
0.4
0.6
0.6
0.8
0.8
1 0 1 2
asse x
asse x
Figura 2.5 Rappresentazione graca dei valori della funzione sin(x) in [0,2 ] con 31 punti e 101 punti.
per ottenere solo la parte di graco sullintervallo [0, ]. La funzione axis([xmin xmax ymin ymax]) impone che lintervallo di valori di x sia compreso tra xmin e xmax e quello di y tra ymin e ymax. Il comando axis usato da solo fornisce un vettore contenete i valori ` possibile inoltre sovrapporre graci di pi` attuali della nestra graca. E u funzioni nella stessa nestra graca. Per esempio se vogliamo realizzare i graci delle funzioni seno e coseno sullintervallo [0,2 ] nella stessa nestra graca dobbiamo costruire i vettori di valori per le due funzioni: >> x = linspace(0,2*pi); >> y1 = cos(x); >> y2 = sin(x); Per disegnarne i graci sovrapposti possiamo scrivere (utilizzando due tratti di linea diversi) >> >> >> >> plot(x,y1,-) hold on plot(x,y2,--) hold off
Il comando hold on mantiene lattuale contenuto della nestra graca in modo tale che i graci successivi si sovrappongano nellattuale nestra graca. Il comando hold off ritorna allimpostazione originale. Lo stesso risultato pu` o essere ottenuto in forma pi` u compatta tramite la singola funzione plot per graci multipli >> plot(x,y1,x,y2) che utilizza in modo automatico linee di colore dierente per i diversi graci. Inne se vogliamo realizzare i due graci evidenziando per esempio i punti di intersezione delle due curve possiamo scrivere >> plot(x,y1,-,x,y2,--,[1 5]*pi/4,[1 -1]/sqrt(2),o); Per aggiungere una legenda allinterno del graco possiamo inne utilizzare la funzione legend >> legend(Coseno, Seno, Intersezione)
14
Introduzione a MATLAB
0.8
0.6
0.4
0.2
0.2
0.4
0.6
0.8
Figura 2.6 Sovrapposizione dei graci delle funzioni seno e coseno con una legenda.
Nella Figura 2.6 si mostra il risultato. Per aggiungere la griglia grid on, per toglierla grid off. Come per la funzione hold, scrivere solo grid permette di passare da on a off e viceversa. Nella Tabella 2.9 riportiamo le principali funzioni che consentono di aggiungere commenti a un graco. Ulteriori funzioni possono essere sperimentate utilizzando il comando help graph2d.
Signicato prescrive i valori minimi e massimi sugli assi x e y inserisce un titolo nel graco inserisce un nome per lasse x inserisce un nome per lasse y inserisce una griglia sugli assi x e y inserisce una legenda per identicare i diversi graci inserisce una stringa di testo in una posizione specicata
M-les
Le successioni di comandi viste negli esempi precedenti possono essere memorizzate di` possibile rettamente in un le di testo. In questo modo si crea un M-le MATLAB. E creare un M-le tramite un editor di testi qualunque. Lambiente di sviluppo MATLAB fornisce un editor orientato alla scrittura di M-le. Per attivare tale editor ` e suciente selezionare il menu File nella nestra principale di MATLAB e poi New e quindi Mle. In alternativa, una rapida scorciatoia consiste nellutilizzare il comando edit dalla nestra principale di MATLAB. Supponiamo di aver scritto uno script M-le di nome esempio.m allinterno del quale abbiamo posto in successione i comandi MATLAB per generare il graco della funzione sin(x), ossia
Introduzione a MATLAB
15
n = 31; x = linspace(0,2*pi,n); y = sin(x); plot(x,y,-o) Per salvare il nostro script e assegnargli il nome prestabilito, ` e suciente selezionare il menu Save as... allinterno del menu File dalla nestra delleditor di MATLAB. Digitando il nome assegnato allo script nella nestra principale di MATLAB, scrivendo quindi esempio, si richiama e si esegue questo M-le, ottenendo lo stesso risultato che si sarebbe avuto scrivendo uno a uno i comandi elencati nello script. Per una minima manipolazione dei le su disco, MATLAB mette a disposizione alcuni comandi, i principali sono riassunti nella Tabella 2.10.
Il calcolo simbolico
Molti linguaggi di programmazione consentono di eettuare calcoli numerici analoghi a quelli visti nora. Tali linguaggi dispongono di librerie numeriche opportune che consentono di eseguire in modo semplicato operazioni molto complesse. Al contrario calcoli simbolici (ossia calcoli analoghi a quelli che noi eseguiamo con carta e penna quando sviluppiamo il quadrato di un binomio (a + b)2 = a2 + b2 + 2ab) possono essere eettuati da pochi programmi specici quali per esempio Maple, Mathematica, MATLAB, Scilab e Octave. In particolare MATLAB pu` o eseguire calcoli simbolici attraverso il Symbolic Mathematics toolbox che utilizza le routine di calcolo simbolico di Maple. Il calcolo simbolico non comporta le approssimazioni introdotte dal calcolo numerico. Il prezzo da pagare per ottenere questo ricade sulla velocit` a desecuzione e sulla necessit` a di particolari strutture dati. In generale i risultati numerici possono essere ottenuti molto pi` u velocemente tramite un calcolo numerico invece di una valutazione numerica di un calcolo simbolico. La parola chiave principale ` e syms che consente di dichiarare quali variabili sono simboliche. Luso risulta poi estremamente intuitivo >> syms a b >> expand((a+b)^2) ans = a^2+2*a*b+b^2 Abbiamo usato il comando expand che forza MATLAB ad espandere lespressione simbolica. Ritroviamo la nota formula per il calcolo di radici di equazioni di secondo grado tramite >> syms a b x >> solve(a*x^2+b*x+c=0)
16
Introduzione a MATLAB
ans = [ 1/2/a*(-b+(b^2-4*a*c)^(1/2))] [ 1/2/a*(-b-(b^2-4*a*c)^(1/2))] Nel corso del presente testo si ` e fatto largo uso del calcolo simbolico in quanto consente sostanzialmente di risolvere la maggior parte dei problemi analitici che vengono arontati. Per esempio il calcolo di limiti, di integrali e di derivate. Si considerino i seguenti esempi (rinviamo ai rispettivi capitoli per una trattazione pi` u approfondita) >> syms x >> limit(1/x,x,0,right) ans = inf >> limit(1/x,x,0,left) ans = -inf >> limit(1/x,x,inf) ans = 0 >> syms a b >> int(x^2,a,b) ans = 1/3*b^3-1/3*a^3 >> diff(exp(-x^2)) ans = -2*x*exp(-x^2)
0
Preliminari
dove ` e la base (per esempio = 2), linsieme delle t cifre d1 d2 . . . dt si chiama mantissa e lesponente p ` e un intero. Ogni cifra soddisfa 0 dk 1, k = 1,. . . ,t, e lesponente p [L,U ]. Il numero di cifre t ` e ssato per ogni insieme di numeri macchina che stiamo considerando. Per vedere il pi` u grande numero macchina e il pi` u piccolo numero macchina, >> realmax , realmin ans = 1.7977e+308 ans = 2.2251e-308 In generale dato un numero reale z dobbiamo trovare un suo rappresentante tra i numeri macchina, lo indicheremo con (z). A meno che z sia gi` a un numero macchina si incorre in un errore. Per z = 0 e arrotondando al numero macchina pi` u vicino lerrore relativo (ovvero lerrore z f l(z ) valutato rispetto a una quantit` a di riferimento, noi considereremo lo stesso z ) che si commette ` e z f l(z ) 1 eps = 1t , z 2 dove la quantit` a eps ` e detta precisione macchina. La precisione macchina ` e legata allapprossimazione ottenibile con linsieme dei numeri macchina a disposizione. In MATLAB >> eps ans = 2.2204e-016 e si pu` o vericare uninteressante propriet` a >> 1+eps > 1 ans =
18
Preliminari
1 >> 1+eps/2 > 1 ans = 0 ovvero eps ` e il pi` u piccolo numero sentito dallaritmetica dei numeri macchina (per quantit` a dellordine di 1). Ricordiamo che il risultato di un confronto, o di una espressione logica, ` e diverso da zero (uguale a 1 solitamente) se ` e vero, ` e nullo se ` e falso, per esempio >> 3>=5 ans =0 >>3<7 ans = 1 Riassumendo, bisogna prestare molta attenzione quando si eettuano operazioni di calcolo tramite un calcolatore o una semplice calcolatrice tascabile. Infatti sar` a inevitabile la presenza di errori nel risultato dovuta allapprossimazione numerica.
1
Funzioni
20
Funzioni
8 2
Per moltiplicare due polinomi si pu` o utilizzare conv mentre per dividere deconv, >> p=[1 -2 5]; q=[1 2 3]; >> c=conv(p,q) c = 1 0 4 4 >> [a,r]=deconv(c,p) a = 1 2 3 r = 0 0 0 0
15
Funzioni
21
sin(2 x)+cos(x) 2
1.5
0.5
0.5
1.5
0 x
>> log(0) Warning: Log of zero. ans = -Inf >> 1/sin(0) Warning: Divide by zero. ans = Inf Il valore predenito Inf equivale a + e potrebbe essere utilizzato formalmente nei calcoli, per esempio 1/Inf fornisce il valore zero. Nel caso di indeterminazione il valore associato ` e NaN (Not-a-Number), per esempio lespressione sin(0)/0 fornisce questo valore come esito. Esistono anche altre costanti predenite, per esempio le cifre disponibili di sone memorizzate in pi, lo stesso valore pu` o essere ottenuto in molti modi >> format long >> 4*atan(1) ans = 3.14159265358979 Possiamo vericare qualche propriet` a del logaritmo e delle funzioni trigometriche con qualche esempio >>l1= log(2.3 * 5.4) , l2=log(2.3)+log(5.4) l1 = 2.5193 l2 = 2.5193 >> 10^(log10(100)) ans = 100 >> acos(1) ans = 0 >> cos(2*pi/3)^2+sin(2*pi/3)^2 ans = 1.0000 Per le funzioni trigonometriche gli argomenti devono essere espresse in radianti. Nel caso si abbiano i gradi occorre convertirli in radianti, per esempio per il seno di 30 >> sin(30*pi/180) ans =
22
Funzioni
0.5000
2
Limiti e continuit` a
24
Limiti e continuit` a
ans = 1/4
La struttura for...end rappresenta un ciclo, ossia permette di ripetere un certo numero di volte un blocco di istruzioni nelle quali la variabile k parte da 2 e arriva a N con incrementi di uno. Le restanti istruzioni dovrebbero essere chiare, non ci soermeremo nel descriverle essendo chiaro il contesto. Il blocco di istruzioni precedenti potrebbe convenientemente essere memorizzato in un M-le. Nella Figura 2.1 mostriamo alcuni esempi di simulazione per dierenti valori del parametro r ma per il medesimo dato iniziale x0=0.5. Ogni graco ` e ottenuto tramite le istruzioni precedenti e utilizzando poi listruzione plot(x,-o). Come si vede al variare di r abbiamo dierenti comportamenti: da un valore limite positivo, r=1, ad un comportamento estremamente disordinato, r=3, passando per dinamiche di tipo periodico.
Limiti e continuit` a
25
r=1
r=2
2 1.5
1.5
0.5
0.5
20
40
60
20
40
60
r=2.5
2 2 1.5 1.5
r=3
0.5
0.5
20
40
60
20
40
60
Teorema degli zeri. Vediamo un esempio tratto dalla Meccanica Celeste. Nel XVII secolo Keplero ha descritto la cinematica dei pianeti in moto intorno al Sole, riassumendone le caratteristiche in tre leggi un pianeta descrive un orbita ellittica intorno al Sole, il Sole occupa uno dei due fuochi di tale ellisse; la linea che congiunge il pianeta al Sole descrive uguali aree in tempi uguali; esiste una correlazione tra il periodo T dellorbita di ciascun pianeta e il raggio 3 medio Rm dellorbita, Rm = k T 2 , dove k ` e una costante positiva. La seconda legge riguardante le aree ` e descritta nella Figura 2.2, i punti A, B descrivono la posizione del pianeta in due tempi successivi. Il medesimo intervallo di tempo viene impiegato dal pianeta per passare da C a D, le aree A1 e A2 sono uguali. Per disegnare lellisse con semiassi a e b basta descrivere lequazione in forma parametrica x(t) = a cos t, y (t) = b sin t, con t [0,2 ]. Dalle leggi di Keplero si deduce la relazione tra il tempo t e langolo al centro descritto dal pianeta, 2t = T ( e sin ()), dove T ` e il periodo di rivoluzione, e leccentricit` a dellorbita ellittica, e (0,1). Per trovare langolo in corrispondenza di un certo tempo t occorre risolvere lequazione scritta sopra. La funzione MATLAB utile allo scopo ` e la funzione fzero. Per esempio consideriamo un pianeta con T = 219 giorni ed eccentricit` a approssimativamente uguale a 0. 5 (il periodo corrisponde al periodo del pianeta Venere). Volendo conoscere langolo corrispondente al tempo t = 20 (giorni) possiamo operare come segue, >> f=inline(2*pi*20-219*theta+0.5*219*sin(theta)); >> fzero(f,0.1) Zero found in the interval: [-0.924, 1.124]. ans = 0.9925
26
Limiti e continuit` a
A2
A Sole C A1
Il valore 0.1 ` e il valore iniziale, essendo angoli esprime un valore in radianti, da cui iniziare la ricerca dello zero. Non abbiamo fatto unanalisi teorica per lunicit` a dello stesso zero, lesistenza discende direttamente dal Teorema dei valori intermedi. Variando il tempo t ` e possibile ricostruire la legge = (t), almeno per punti.
3
Derivata di una funzione
Abbiamo approssimato con un rapporto incrementale la derivata della funzione seno nellintervallo [0,2 pi]. Listruzione subplot consente di visualizzare graci multipli nella stessa nestra. Per visualizzare il graco dellerrore assoluto, dierenza tra valore approssimato e valore vero in modulo, possiamo scrivere >> xd=x(1:N-1); >> plot(xd,abs(ri-cos(xd))); Non bisogna essere troppo ottimisti pensando che basti un passo h molto piccolo. Vediamo un esempio per una approssimazione della derivata della funzione f (x) = sin 10x in x = 1 con un passo piccolo, il valore vero ` e 10 cos 10 8. 3907. >> h=eps/4; >> (sin(10*(1+h))-sin(10))/h ans = 0 Nellambito del calcolo simbolico la stessa funzione diff permette di calcolare la funzione derivata. Qualche esempio >> >> >> >> f1=sym(sin(10*x)); f2=sym(exp(x) * cos(2*x)); f3=sym(x^2+1/x); diff(f1)
28
sin(x)
0.5 0
0.5
0.5
diff(sin(x))/h
0.5
ans = 10*cos(10*x) >> diff(f2) ans = exp(x)*cos(2*x)-2*exp(x)*sin(2*x) >> diff(f3) ans = 2*x-1/x^2
29
vengono visualizzati i passi compiuti per calcolare una approssimazione di con 12 cifre signicative esatte. La colonna Procedure indica il tipo di algoritmo selezionato passo dopo passo, ovvero il tipo di strategia per la selezione del prossimo punto della successione approssimante.
30
0.7
0.6
r = mezzi /tempo
0.5
0.4
0.3
0.2
0.1
10
20
30
40
50
60
70
80
90
100
velocit
>> syms v a b x ; >> ra=sym(v / (v+a*v^2/20+b)); >> d=diff(ra,v) d = 1/(v+1/20*a*v^2+b)-v/(v+1/20*a*v^2+b)^2*(1+1/10*a*v) >> vm=solve(d,v) vm = [ 2/a*5^(1/2)*(a*b)^(1/2)] [ -2/a*5^(1/2)*(a*b)^(1/2)] La funzione solve risolve la corrispondente equazione, e a indica il parametro . Tra le due soluzioni selezioniamo solo quella positiva, p vm = (20b/). Per un ssato b ` e possibile generare una tabella con velocit` a per il usso massimo e la distanza minima permessa.
4
Graci di funzioni e approssimazioni
si ottengono i graci di Figura 4.1 che si riferiscono alla stessa funzione f (x) = cos xex ma con domini dierenti. Bisogna fare attenzione a come collezionare le varie informaziocos(x) exp(x)
2 60 40 0 20 1 0 2 20 3 40 6 4 2 x 0 2 4 30 20 10 x 0 10 1
9
x 10
10
15
Figura 4.1 Graci della funzione cos xex in vari intervalli. ni, i quattro graci nella gura non sembrano della stessa funzione se non parzialmente. Si possono comunque analizzare anche i graci delle derivate successive avvalendosi della funzione diff e ancora di ezplot. Proviamo a ripercorrere i passi suggeriti per lo studio di una funzione con lausilio del
32
Il dominio della funzione ` e determinato dai valori x tali che il denominatore non si annulli, (2x + 1) = 0 x = 1/2. La funzione non sembra presentare particolari simmetrie. Per le intersezioni con gli assi coordinati, f (0) = 0, il graco di f passa per lorigine (0,0). Valutiamo i limiti per x che tende agli estremi degli intervalli che compongono il dominio. Il limite sinistro e il limite destro per x 1/2 valgono rispettivamente >> syms x; >> f=sym(exp(-x)*x/(2*x+1)); >> limit(f,x,-1/2,left) ans = inf >> limit(f,x,-1/2,right) ans = -inf dove inf signica mentre -inf signica . La retta x = 1/2 risulta essere un asintoto verticale. Per i limiti per x abbiamo invece: >> limit(f,x,-inf,right) ans = inf >> limit(f,x,inf,left) ans = 0 quindi y = 0 risulta essere un asintoto orizzontale. Per la derivata prima abbiamo >> fd= simplify(diff(f)) fd = -exp(-x)*(2*x^2+x-1)/(2*x+1)^2 dove luso della funzione simplify eettua eventuali semplicazioni presenti dopo il calcolo della derivata. Tramite la funzione solve possiamo calcolare gli zeri della derivata, che risultano essere gli zeri del numeratore e quindi tramite root gli seri del polinomio (2x2 + x 1) >> solve(fd) ans = [ -1] [ 1/2] Il segno sar` a determinato dal segno del polinomio (2x2 + x 1), da cui f (x) > 0 x (1,1/2), f (x) x (, 1) (1/2, + ). Dal segno della derivata prima possiamo valutare gli intervalli in cui la funzione f cresce o decresce. Avremo inoltre che x = 1 risulta essere un punto di minimo locale mentre il punto x = 1/2 ` e un punto di massimo locale. Per stabilire se i punti stazionari sono punti di massimo o di minimo possiamo anche utilizzare la derivata seconda >> fd2=simplify(diff(fd)) fd2 = exp(-x)*(4*x^3+4*x^2-3*x-6)/(2*x+1)^3 >> x=-1; subs(fd2) ans = 8.1548 >>x=0.5; subs(fd2) ans = -0.4549 Per valutare il segno della derivata seconda occorre valutare il comportamento della funzione razionale che vi compare. Posto N (x) = (4x3 + 4x2 3x 6), D(x) = (2x + 1)3 , per il numeratore N abbiamo
33
>> roots([4 4 -3 -6]) ans = -1.0279 + 0.6034i -1.0279 - 0.6034i 1.0558 quindi essendoci ununica radice reale N (x) > 0 per x > 1. 0558, N (x) < 0 per x < 1. 0558. Per il denominatore D abbiamo semplicemente D(x) < 0 per x < 1/2, mentre D(x) > 0 per x > 1/2. Riassumendo N (x)/D(x) > 0 per x (, 1/2) (1. 0558, + ), mentre N (x)/D(x) < 0 per x (1/2,1. 0558). Nel primo caso, essendo ex > 0 per ogni x, la derivata seconda ` e positiva e la funzione f risulta essere convessa, nel secondo caso la funzione risulta essere concava. I punti con ascissa x = 1/2 e x = 1. 0558 risultano essere punti di esso. Il graco di f ` e schematizzato nella Figura 4.2.
14 12 10 8 6 4 2 0 2 4 6 3 2.5 2 1.5 1 0.5 0 0.5 1 1.5 2
34
Consideriamo, per esempio, i dati corrispondenti ai censimenti della popolazione degli Stati Uniti dal 1790 al 1990. I dati sono accessibili dallambiente MATLAB perch` e fanno parte di insiemi di dati utilizzabili come test. Per leggerli e memorizzarli >> load census ; A questo punto vengono creati due vettori, pop e cdate: il primo contiene i dati dei censimenti, il secondo gli anni corrispondenti. In tutto abbiamo 21 dati rappresentati in Figura 4.3. Possiamo trovare, con la funzione polyfit, il polinomio interpolatore e alcuni polinomi che tentano il tting. Sperimentiamo alcune possibilit` a e, per ogni modello polinomiale scelto, facciamo la previsione per il 2000, >> pi=polyfit(cdate,pop,20);prev(1)=polyval(pi,2000); >> pi=polyfit(cdate,pop,1);prev(2)=polyval(pi,2000); >> pi=polyfit(cdate,pop,2);prev(3)=polyval(pi,2000); >> pi=polyfit(cdate,pop,5);prev(4)=polyval(pi,2000); >> prev prev = 143.3750 219.4586 274.6221 281.0268
250
Censimenti
200
150
100
50
0 1750
1800
1850
1900
1950
2000
anni
Come si pu` o constatare le previsioni, indipendentemente dallunit` a di misura (qui sono milioni di persone), sono molto dierenti per i vari polinomi (di grado 20, 1, 2, 5). Trovare il modello corretto o fare previsioni attendibili ` e un compito piuttosto delicato. Per ottenere valori intermedi rispetto ad una tabella data possiamo utilizzare la funzione interp1. Per esempio generando alcuni valori con la funzione humps possiamo provare varie opzioni ed ottenere il graco di Figura 4.4, >> >> >> >> >> x=linspace(0,1,10); y=humps(x); xi=linspace(0,1,50); y1=interp1(x, y, xi, nearest); y2=interp1(x, y, xi, linear); y3=interp1(x, y, xi, spline); y4=interp1(x, y, xi, cubic);
Le etichette nearest, linear, spline, cubic stanno ad indicare il metodo con cui si ` e riempita la tabella partendo dai 10 valori iniziali. I primi due consistono nello scegliere il valore pi` u vicino o una media tra i valori pi` u vicini. Gli ultimi due metodi consistono in un
35
100 80 60 40 20 0
100
nearest
80 60 40 20 0
linear
0.2
0.4
0.6
0.8
0.2
0.4
0.6
0.8
100 80 60 40 20 0
100
spline
80 60 40 20 0
cubic
0.2
0.4
0.6
0.8
0.2
0.4
0.6
0.8
approccio interessante che consiste nel costruire un certo numero di polinomi consecutivi, in questo caso di grado 3, che si raccordano con una certa regolarit` a. Questa idea ` e stata pienamente sviluppata nellambito della progettazione assista dal calcolatore e nel disegno industriale. Le stesse idee si possono adottare in pi` u dimensioni e, per esempio, generando una prima tabella con la funzione MATLAB peaks, abbiamo >> >> >> >> >> >> [x,y,z]=peaks(10); [x1,y1]=meshgrid(linspace(-3,3,40),linspace(-3,3,40)); z1=interp2(x, y, z,x1,y1,nearest); z2=interp2(x, y, z,x1,y1, linear); z3=interp2(x, y, z,x1,y1,spline); z4=interp1(x, y, z,x1,y1,cubic);
e si possono ottenere i graci nella Figura 4.5. Nella gura ogni singolo graco ` e ottenuto
8 6 4 2
8 6 4 2
0 0 2 4 6 8 3 2 1 0 1 2 3 3 2 0 1 1 2 3 2 4 6 3 2 1 0 1 2 3 3 2 0 1 1 2 3
8 6 4 2 0 2 4 6 8 3 2 1 0 1 2 3 3 2 0 1 1 2 3
8 6 4 2 0 2 4 6 8 3 2 1 0 1 2 3 3 2 0 1 1 2 3
36
5
Integrali, aree, primitive
f (x)dx =
wk f (xk ),
dove la scelta dei punti xk e dei pesi wk > 0 caratterizza le varie formule di integrazione (formule di quadratura numerica). Per esempio >> f=inline(exp(-x).*sin(x)); >> quad(f,0,pi) ans = 0.5216 >> f=inline(sqrt(1+cos(x))); >> quad8(f,0,1) ans = 1.3560 dove le funzioni per lintegrazione numerica sono quad e quad8 (la seconda fornisce usualmente una migliore approssimazione anche se ` e pi` u costosa). Tramite il calcolo simbolico siamo in grado di calcolare integrali in modo esatto. Per esempio avremo >> syms x >> int(x^2) ans = 1/3*x^3 >> int(log(x),0,1) ans = -1 >> int(x*exp(-x)) ans = -x*exp(-x)-exp(-x) >> int(cos(x),0,pi/2) ans = 1
38
Per esempio consideriamo per la curva x(t) = sin(2t), y (t) = cos(3t), z (t) = t, t [0,2 ]. Un graco nello spazio tridimensionale della curva si ottiene tramite plot3 nella forma >> t=linspace(0,2*pi); >> plot3(sin(2*t),cos(3*t),t); ed ` e mostrato nella Figura 5.1. Per la valutazione dellintegrale
7 6 5 4 3 2 1 0 1 0.5 0
t=b
t=a
0.5 0 0.5 1 1 0.5
39
possiamo invece operare come segue. >> curva=inline(sqrt(4*cos(2*t).^2 +9 * sin(3*t).^2+1),t); >> lung=quad8(curva,0,2*pi) lung = 16.6635 Se la funzione ` e molto oscillante oppure se presenta delle singolarit` a, per esempio derivata innita, le funzioni di calcolo numerico possono incontrare delle dicolt` a che segnalano con una sequenza di avvertimenti, >> f=inline(sin(1./x)); >> quad8(f,0.01,1) Warning: Recursion level limit reached in quad8. Singularity likely. In C:\MATLABR11\toolbox\matlab\funfun\quad8.m (quad8stp) at line 123 In C:\MATLABR11\toolbox\matlab\funfun\quad8.m (quad8stp) at line 123 In C:\MATLABR11\toolbox\matlab\funfun\quad8.m (quad8stp) at line 123 ...
50
45
40
35
Ps
30
25
20
15
10
Pi
20 30 40 50 60 70 80 90
0 10
40
Alcuni dati sono rappresentati nella Figura 5.2, dove Ps e Pi indicano la pressione superiore e inferiore, V ` e il volume. I dati sono memorizzati prelevandoli dallesterno, ovvero utilizzando la funzione load. In ogni caso abbiamo >> V=[14 16.25 18.2 20.7 23 32.1 41.2 51 59 68 77 81.6 86.2]; >> PI=[15.1 11 9.6 8 7.2 4.5 3.0 2 1.5 1 1.5 1.6 3.5]; >> PS=[16.2 47 42.1 37.2 33 21 14.6 11.2 8.7 7.2 5. 4.5 3.5]; e il calcolo >> load dati PS PI V >> trapz(PS-PI) ans = 181.1500 dove ovviamente, dovendo calcolare unarea compresa tra due curve, abbiamo fatto la dierenza tra i valori di pressione.
6
Integrali impropri, serie ed equazioni dierenziali
TN(x) =
Figura 6.1 Un esempio di formula di Taylor. considera la somma parziale no a n = 7. Altre funzioni interessanti sono taylor (per il calcolo della serie di Taylor ma senza rappresentazione graca) e symsum che permette la somma di una serie in modo formale. Per esempio
42
>> s=sym(exp(-x)); >> taylor(s) ans = 1-x+1/2*x^2-1/6*x^3+1/24*x^4-1/120*x^5 Tra i molti modi per il calcolo di vi sono anche le serie di potenze. La scelta del tipo di rappresentazione inuisce notevolmente sulla velocit` a di convergenza ovvero sul numero di termini necessari per aver un certo numero di cifre esatte. Per esempio la serie di Leibniz 1 1/3 + 1/5 1/7. . . converge a /4 ma in modo estremamente lento. Abbiamo invece arctan(1/2) + arctan(1/3) = arctan(1) = /4, e, grazie alla rappresentazione in serie di Taylor della funzione arcotangente, si ottengono delle serie ecienti dal punto di vista del calcolo. >> t=sym(atan(x)); >> t1=taylor(t,10); >> p=4*(subs(t1,x,1/2)+subs(t1,x,1/3)) p = 498668825/158723712 >> sym(498668825/158723712,d) ans = 3.1417411974336890700953972554998
43
si ottiene uno dei graci nella Figura 6.2. La funzione ode45 necessita della funzione con cui descrivere lequazione dierenziale, il vettore [0 100] indica lintervallo di tempo t [0,100] in cui valutare la soluzione, lultimo argomento denota la condizione iniziale.
130
120
= 150
110
100
= 100
90
80
= 50
70
60
10
20
30
40
50
60
70
80
90
100
44
1.5
0.5
0.5
y
1
1.5
0.5
1.5
2.5
3.5
4.5
Figura 6.3 Soluzione di unequazione del secondo ordine tramite un sistema di equazioni dierenziali. >> [t,u]=ode45(lotka,[0 20],[80 100]); >> plot(t,u); dove siamo partiti con 80 prede e 100 predatori. Come si pu` o vedere nella gura abbiamo un comportamento di tipo periodico.
160
140
u2
120
100
80
60
40
20
10
12
14
16
18
20
7
Vettori e matrici algebrici
46
8 18 1
Dati ora i vettori colonna x e y >> x = [1; -1; 3 ; 7] x = 1 -1 3 7 >> y = [2; 4; -3; 9] y = 2 4 -3 9 Possiamo calcolare il prodotto scalare xT y ed il prodotto y T x tramite >> x*y ans = 52 >> x*y ans = 2 -2 6 14
4 -4 12 28
-3 3 -9 -21
9 -9 27 63
47
1.0000 0 1.0000
10 1 2 3 4 5 6 7 8 9 10
Figura 7.1 Matrice identit` a e immagini. la mappa di colori delle scale di grigio nella quale lo 0 corrisponde al nero ed il 255 al bianco. Loperazione di prodotto per uno scalare quindi corrisponde ad una variazione della luminosit` a dellimmagine (si provi con image(50*I)). Possiamo inne visualizzare come lazione di trasposizione corrisponda ad una riessione dellimmagine rispetto alla diagonale principale della matrice tramite le istruzioni >> >> >> >> >> >> colormap(gray); A=zeros(7); A(3,4)=1; A(4,3:5)=1; A(5,2:6)=1; image(255*A); figure; image(255*A);
48
7 1 2 3 4 5 6 7
7 1 2 3 4 5 6 7
Il risultato ` e riportato nella Figura 7.2. Si provi help image per esplorare ulteriori funzioni MATLAB per la gestione delle immagini.
8
Sistemi lineari
50
Sistemi lineari
-0.0000 La soluzione x di fatto non ` e quindi una soluzione. Infatti il sistema in esame risulta essere inconsistente e MATLAB automaticamente ne ha calcolato una soluzione nel senso dei minimi quadrati. La verica dellinconsistenza pu` o essere eettuata tramite il Teorema di Rouch e-Capelli e la funzione rank di MATLAB. Utilizzando i valori di A e b deniti in precedenza avremo infatti >> rank(A) ans = 3 >> rank([A b]) ans = 4 Nel caso di sistemi che ammettono innite soluzioni loperatore backslash si comporta in modo diverso a seconda delle situazioni. Se la matrice ` e quadrata ci segnala il fatto che il determinante ` e nullo e non calcola nessuna soluzione, se invece la matrice ` e rettangolare ci segnala uneventuale decienza del rango rispetto al rango massimo possibile e poi calcola una sola soluzione del sistema. >> A=[1 3 2; -1 1 2; 2 6 4]; >> b=[3;-3;6]; >> x1=A\b Warning: Matrix is singular to working precision. x1 = Inf Inf Inf >> A=[1 3 2; -1 1 2; 2 6 4; 4 12 8]; >> b=[3;-3;6;12]; >> x1=A\b Warning: Rank deficient, rank = 2 tol = 1.2243e-014. x1 = 3.0000 0.0000 0 La forma generale della soluzione pu` o essere calcolata sfruttando il Teorema di struttura (continuando lesempio precedente) >> x0=null(A,r) x0 = 1 -1 1 >> A*x0 ans = 0 0 0 0 Ogni vettore del tipo x = x1 + x0 ` e dunque soluzione del nostro problema. La funzione null applicata ad A calcola una soluzione del sistema Ax = 0. Lopzione r forza MATLAB a fornire una soluzione in formato razionale. Nel caso di matrice quadrata, dopo averne eventualmente vericato il rango, sar` a suciente risolvere il sistema caratterizzato dalle equazioni l.i. >> A=[1 3 2; -1 1 2; 2 6 4]; >> b=[3;-3;6]; >> rank(A) ans = 2
Sistemi lineari
51
>> rank([A b]) ans = 2 >> x1=A(1:2,:)\b(1:2) x1 = 3.0000 0.0000 0 e procedere come nel caso precedente. Tramite il calcolo simbolico possiamo risolvere anche sistemi nei quali la soluzione dipende da uno o pi` u parametri. Per esempio >> syms x alpha >> A=[alpha 1 1; 1 alpha 1; 1 1 alpha]; >> b=[1; 2; 3]; >> A\b x = [ (alpha-4)/(alpha-2+alpha^2)] [ [ 3/(alpha-2+alpha^2)*alpha]
2/(alpha+2)]
La soluzione quindi ` e unica per = 2,1. Possiamo esplorare i casi esclusi tramite il comando subs > A1=subs(A,alpha,-2) A1 = -2 1 1 1 -2 1 1 1 -2 >> A1\b Warning: System is inconsistent. Solution does not > In C:\MATLAB6p1\toolbox\symbolic\@sym\mldivide.m ans = [ Inf] [ Inf] [ Inf] >> A2=subs(A,alpha,1) A2 = 1 1 1 1 1 1 1 1 1 >> A2\b Warning: System is inconsistent. Solution does not > In C:\MATLAB6p1\toolbox\symbolic\@sym\mldivide.m ans = [ Inf] [ Inf] [ Inf] Quindi che per = 2,1 il sistema ` e inconsistente.
exist. at line 29
exist. at line 29
52
Sistemi lineari
>> syms a1 a2 a3 b1 b2 b3 c1 c2 c3 >> A=[a1 a2 a3; b1 b2 b3; c1 c2 c3]; >> det(A) ans = a1*b2*c3-a1*b3*c2-b1*a2*c3+b1*a3*c2+c1*a2*b3-c1*a3*b2 Inne possiamo calcolare linversa tramite la funzione inv. Avremo per esempio >> A=[2 1 1; 4 1 0; -2 2 1]; >> A1=inv(A) A1 = 0.1250 0.1250 -0.1250 -0.5000 0.5000 0.5000 1.2500 -0.7500 -0.2500 Concludiamo osservando che a volte pu` o essere conveniente forzare MATLAB alla visualizzazione tramite razionali utilizzando format rat. Linversa precedente risulta >> >> >> A1 format rat A=[2 1 1; 4 1 0; -2 2 1]; A1=inv(A) = 1/8 1/8 -1/2 1/2 5/4 -3/4
8.3 Interpolazione
La risoluzione di sistemi lineari ` e un problema che interviene in numerose applicazioni. Per esempio nel caso dellinterpolazione polinomiale che abbiamo gi` a arontato nel laboratorio Matlab del Capitolo 4. Consideriamo una funzione f incognita di cui conosciamo solo una serie di valori yi = f (xi ) in corrispondenza dei punti xi , i = 1, . . . ,n. Vogliamo ricostruire la funzione f utilizzando una sua approssimazione tramite un polinomio. Un esempio elementare ` e dato dal modo in cui MATLAB realizza il graco della funzione tramite plot. La funzione continua visualizzata da MATLAB raccordando tutti i punti con una retta ` e detta spline lineare e rappresenta un polinomio a tratti di grado 1. Nel caso generale cerchiamo un polinomio p(x) tale che p(xi ) = yi per ogni i = 1, . . . ,n. Si pu` o dimostrare che esiste unico un polinomio di grado n 1 che soddisfa alle condizioni precedenti. Infatti se p(x) = a0 + a1 x + . . . + an1 xn1 , dalle condizioni p(xi ) = yi , i = 1, . . . ,n otteniamo il sistema lineare di n equazioni nelle n incognite a0 , a1 , . . ., an1 8 9 8 9 n1 9 8 1 x1 x2 . . . x1 a0 > > y 1 > > > 1 > > > >> > > > > > > > > > n 1 2 y2 > > > > > a1 > 1 x2 x2 . . . x2 > > > > > > > > > > > > > > > > > > = > >> > . > > > > . > >. > > > . . . . > > > > > > . . >. > > > > > . . . . . > > > > > . . ... . > > : ; : > ; :. ; 2 n1 a y n 1 n 1 xn xn . . . xn La matrice del sistema, detta matrice di Vandermonde, ha determinante diverso da zero se i punti xi sono tutti distinti ed in tal caso esistono unici a0 , a1 , . . ., an1 , ossia esiste un unico polinomio interpolante. Vediamo un esempio in MATLAB. >> >> >> >> >> x=[-1 0 2 5]; y=[3 0 4 1]; V=[x.^0 x x.^2 x.^3]; a=V\y; xi=linspace(-1,5);
Sistemi lineari
53
>> yi=polyval(a(4:-1:1),xi); >> plot(x,y,-o,xi,yi,-); I risultati sono riportati nella Figura 8.1.
7
spline lineare
3
polinomio interpolante
1 1
54
9
Autovalori e autovettori
La matrice V ` e formata da autovettori unitari ed ` e tale che AV = V D. Tramite il calcolo simbolico possiamo per esempio calcolare la forma degli autovettori per una generica matrice di dimensione 2 >> syms a b c d >> A=[a b; c d]; >> eig(A) ans = [ 1/2*a+1/2*d+1/2*(a^2-2*a*d+d^2+4*b*c)^(1/2)] [ 1/2*a+1/2*d-1/2*(a^2-2*a*d+d^2+4*b*c)^(1/2)]
56
Autovalori e autovettori
allo spostamento orizzontale del piano. Questo p` o essere modellizzato tramite lazione su ogni piano di due forze elastiche indotte dai piani adiacenti del tipo F = kx dove x indica lo spostamento relativo del piano. Se indichiamo con xi (t) la coordinata della massa che rappresenta il piano i-esimo avremo che su ogni piano interno agiscono le due forze Fi
(1)
= k(xi xi1 ),
Fi
(2)
= k(xi xi+1 ),
i = 2, . . . ,n 1.
Sul primo piano agir` a la forza kx1 k(x1 x2 ) mentre sullultimo solo la forza k(xn xn1 ). Lapplicazione della legge di Newton F = ma = mx fornisce le equazioni del moto in forma matriciale M x = Kx, dove x = (x1 , . . . ,xn )T , M = mI con I matrice identit` a` e la matrice di massa n n e K ` e la matrice di stiness 8 9 2k k 0 ... 0 > > > > > k > > 2k k ... 0 > > > > > > > > > > > . . . > >. . . . K=> . . . 0 > > 0 > > > > > > 0 > > ... k 2k k > > > : ; 0 ... 0 k k A questo punto simuliamo lazione di un terremoto tramite unoscillazione orizzontale del terreno avente la legge E cos(t) con ampiezza E e pulsazione . Derivando due volte otteniamo la forza inerziale F = ma = mE 2 cos(t) che agisce su ogni piano delledicio. Il nostro modello nale sar` a quindi descritto dal seguente sistema di equazioni dierenziali ordinarie non omogeneo del secondo ordine x = Ax + E 2 cos(t)e, con A = M 1 K ed e = (1, . . . ,1). Gli autovalori della matrice A hanno un ruolo chiave nella risoluzione del precedente sistema. Infatti tale soluzione ha la forma x(t) = xp (t) + xc (t) dove xp (t) ` e una soluzione particolare del problema e xc (t) la soluzione del corrispondente sistema omogeneo. La soluzione del corrispondente sistema omogeneo pu` o essere eettuata tramite il calcolo degli autovalori i della matrice A e dei rispettivi autovettori vi , mentre una soluzione particolare ` e data da xp (t) = C cos(t) dove C ` e il vettore soluzione del sistema lineare (A + 2 I )C = E . Questultimo sistema ha soluzione se e solo se la matrice A + 2 I ` e non singolare, ossia se 2 = i per ogni autovalore di A. Nei sistemi meccanici tipicamente gli autovalori di A sono tutti negativi ed i valori i = i sono detti frequenze naturali del sistema. Nel caso in cui sia una delle frequenze naturali il sistema risulta singolare ed abbiamo il fenomeno cosiddetto della risonanza. Al ne di studiare il problema numericamente con MATLAB vediamo di calcolare le frequenze naturali del sistema. Supponiamo di avere un edicio a 10 piani e che la massa di ogni piano sia di 20 tonnellate. La forza elastica che tiene i piani legati tra loro sia caratterizzata da k = 100 tonnellate/metro. La matrice A assume quindi la forma 8 9 10 5 0 0 0 0 0 0 0 0 > > > > > > 5 > 10 5 0 0 0 0 0 0 0 > > > > > > > > > 0 5 10 5 0 0 0 0 0 0 > > > > > > > > > 0 0 5 10 5 0 0 0 0 0 > > > > > > > > > 0 0 0 5 10 5 0 0 0 0 > > > A=> > > > > > 0 0 0 0 5 10 5 0 0 0 > > > > > > 0 > > > 0 0 0 0 5 10 5 0 0 > > > > > > > 0 0 0 0 0 0 5 10 5 0 > > > > > > > > > > 0 0 0 0 0 0 0 5 10 5 > > > : ; 0 0 0 0 0 0 0 0 5 5
Autovalori e autovettori
57
Possiamo calcolare gli autovalori i della matrice A, le relative frequenze naturali i ed i periodi 2/i >> A=-10*eye(10,10)+5*diag(ones(1,9),-1)+5*diag(ones(1,9),1); >> A(10,10)=-5; >> lambda=eig(A); >> omega=sqrt(-lambda); >> [lambda omega 2*pi/omega] ans= -5.0000 2.2361 2.8099 -16.2349 4.0293 1.5594 -13.6534 3.6951 1.7004 -18.2624 4.2735 1.4703 -19.5557 4.4222 1.4208 -10.7473 3.2783 1.9166 -7.7748 2.7883 2.2534 -2.6695 1.6339 3.8456 -0.9903 0.9951 6.3138 -0.1117 0.3342 18.8005 Il modello quindi avr` a un comportamento critico se la frequenza di oscillazione del terreno risulta prossima ad una delle frequenze naturali del sistema. Nella Figura 9.1 mostriamo gli spostamenti nel tempo dellultimo piano delledicio nel caso di una frequenza naturale e di una frequenza non naturale.
20 20
15
15
10
10
x (t)
10
10
15
15
20
20
10
20
30
40
50 tempo
60
70
80
90
100
Figura 9.1 Vibrazioni di risonanza allultimo piano per 2/ = 3. 8456 (sinistra) e caso non risonante per 2/ = 5 (destra) in funzione del tempo nel modello di grattacielo a 10 piani.
58
Autovalori e autovettori
>> norm(x,inf) ans = 8 >> norm(x,2) ans = 9.6954 >> A=[1 2 4; -1 7 3; -11 2 0]; >> norm(A,1) ans = 13 >> norm(A,inf) ans = 13 >> norm(A,2) ans = 11.5506 Consideriamo un problema analogo a quello dellinterpolazione polinomiale visto nel laboratorio Matlab dei Capitoli 4 e 8. Data una funzione f di cui sono noti una serie di valori yi = f (xi ) nei nodi xi , i = 1, . . . ,n cerchiamo il polinomio di grado ssato che meglio approssima la funzione nel senso dei minimi quadrati. In altre parole dato p(x) = a0 + a1 x + a2 x2 + . . . + am xm , imponiamo le condizioni p(xi ) = yi , i = 1, . . . ,n. Sappiamo che se m = n 1 ed i nodi sono distinti abbiamo un sistema lineare con una unica soluzione. Se m < n 1 il sistema ` e sovradeterminato e non ammette soluzione, quindi ne cerchiamo una nel senso dei minimi quadrati. Possiamo riutilizzare i dati del Capitolo 8 con n = 4 e cercare la retta (m = 1) e la parabola (m = 2) dei minimi quadrati. Possiamo scrivere >> >> >> >> >> >> >> >> >> >> x=[-1 0 2 5]; y=[3 0 4 1]; V1=[x.^0 x]; a1=V1\y; V2=[x.^0 x x.^2]; a2=V2\y; xi=linspace(-1,5); y1i=polyval(a1(2:-1:1),xi); y2i=polyval(a2(3:-1:1),xi); plot(x,y,o,xi,y1i,xi,y2i);
Autovalori e autovettori
59
m=3
5
m=2
m=1
1
1 1
Figura 9.2 Retta dei minimi quadrati, parabola dei minimi quadrati e polinomio interpolante.
60
10
Vettori geometrici, rette e piani
A questo punto tramite le matrici bidimensionali che caratterizzano le trasformazioni lineari di 2 in 2 possiamo agire geometricamente sul disegno. Deniamo quindi le matrici di riessione rispetto lasse x, rispetto la retta y = x e di rotazione tramite i comandi
>> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
A1=[1 0; 0 -1]; A2=[0 1; 1 0]; theta=pi/2; c=cos(theta); s=sin(theta); A3=[c -s; s c]; D=[x;y]; D1=A1*D; D2=A2*D; D3=A3*D; x1=D1(1,:); y1=D1(2,:); x2=D2(1,:); y2=D2(2,:); x3=D3(1,:); y3=D3(2,:); plot(x,y,o-,x1,y1,o-); figure plot(x,y,o-,x2,y2,o-); figure
62
>> plot(x,y,o-,x3,y3,o-); Luso del comando figure consente lapertura di pi` u nestre grache. Nella Figura 10.1 riportiamo i risultati ottenuti.
1 1 1
0.8
0.8
0.8
0.6
0.6
0.6
0.4
0.4
0.4
0.2
0.2
0.2
0.2
0.2
0.2
0.4
0.4
0.4
0.6
0.6
0.6
0.8
0.8
0.8
1 1
0.8
0.6
0.4
0.2
0.2
0.4
0.6
0.8
1 1
0.8
0.6
0.4
0.2
0.2
0.4
0.6
0.8
1 1
0.8
0.6
0.4
0.2
0.2
0.4
0.6
0.8
Figura 10.1 Riessioni rispetto allasse delle x e alla retta y = x e rotazione di /2 in senso antiorario di un disegno.
Possiamo chiaramente eettuare le stesse operazioni anche su gure geometriche ben denite. Per esempio possiamo agire su un ellisse denendo la matrice di punti D come >> t = linspace(0,2*pi); >> x=1+3*cos(t); y=1+2*sin(t); >> D = [x;y]; Nella Figura 10.2 sono illustrate le diverse azioni delle trasformazioni.
4 4
4
4 4
4 6 4
4 4
Figura 10.2 Riessioni rispetto allasse delle x e alla retta y = x e rotazione di /2 in senso antiorario di un ellisse.
63
innanzitutto denire una matrice di punti in corrispondenza dei quali valutare la funzione. Per esempio consideriamo la funzione f (x,y ) = (x y ) sin(x2 + y 2 ), nellintervallo [2,2] [2,2]. Tramite i comandi >> >> >> >> m=40;n=40; x=linspace(-10,10,m); y=linspace(-10,10,n); [X,Y]=meshgrid(x,y);
generiamo due matrici X e Y di m n punti tali che lelemento xij = (xj ,xj ) e yij = (yi ,yi ). Per creare il graco della supercie ` e suciente aggiungere le istruzioni >> Z=Z=(X-Y).*sin(X.^2+Y.^2); >> mesh(X,Y,Z); La matrice Z avr` a la propriet` a Z (i,j ) = f (X (i,j ),Y (i,j )), i = 1, . . . ,m j = 1, . . . ,n. Il risultato ottenuto ` e riportato in Figura 10.3 assieme al graco delle curve di livello. Le curve di livello si possono ottenere tramite la funzione contour(X,Y,Z). La rappre2
1.5
4 3 2 1 0 1 2
0.5
0.5
3 4 2 1 0 0 1 2 2 1 1 2
1.5
2 2
1.5
0.5
0.5
1.5
Figura 10.3 Graco di supercie e curve di livello di f (x,y ) = (x y ) sin(x2 + y 2 ). sentazione graca realizzata da mesh ` e lanalogo in pi` u dimensioni del comando plot. In questo caso si raccordano i punti a quattro a quattro con pezze piane (parti di piano che passano per i quattro punti). Utilizzando invece la funzione surf le varie pezze vengono colorate opportunamente. In generale il graco di superci pu` o essere personalizzato in diversi modi. Le opzioni pi` u comuni sono date dai comandi axis, title, xlabel, ylabel e zlabel per il cui uso, analogo al caso bidimensionale, si rimanda allhelp in linea. Nel caso di campi vettoriali possiamo utilizzare le funzioni quiver in 2 e quiver3 in 3 . Per esempio con le istruzioni
64
1.5
0.5
0.5
1.5
2 2
1.5
0.5
0.5
1.5
11
Probabilit` a
66
Probabilit` a
0.5
0.4
0.3
0.2
0.1
Figura 11.1 Uso del comando bar per visualizzare la distribuzione di probabilit` a.
>> PR= sum ( P(ind_buo) ) PR = 0.7500 Calcoliamo ora il valore atteso di X . Poich e E (X ) = si tratter` a del prodotto scalare xT px , ossia >> EX = X * P EX = 4.7500
P
i
Grazie al Teorema del valore atteso di g (X ), per calcolare ad esempio E (sin(X )), possiamo scrivere >> EsinX = ( sin(X) ) * P EsinX = -0.0958 Calcoliamo la varianza di X >> VAR_X = ( ( X - EX ).^2 ) * P VAR_X = 3.6875 e attraverso la formula della varianza V ar(X ) = E (X 2 ) (E (X ))2 >> Var_X = ( X.^2 ) * P - ( EX ).^2 Var_X = 3.6875 Avremmo anche potuto usare la funzione MATLAB var nella forma var(X,P) ed ottenere lo stesso risultato. Ricordiamo come tramite il Symbolic Toolbox sia possibile utilizzare anche simboli al posto di numeri. >> syms x1 x2 >> syms p1 p2 >> x=[x1; x2; x = [ x1] [ x2] [ x3] >> p=[p1; p2; p = x3 real positive x3]
1-(p1+p2)]
Probabilit` a
67
[ p1] [ p2] [ 1-p1-p2] Abbiamo inserito p3 = 1 (p1 + p2 ) in modo da garantire che p1 + p2 + p3 = 1. Ora, controlliamo la formula della varianza
z
Var X VAR X }| { z }| { 2 2 E (X ) ( E (X ) ) = E ((X E (X )2 ) = V ar(X ) | {z } | {z } EX2 EX %calcola EX %calcola EX2 %calcola Var_X %calcola VAR_X %calcola-semplifica i conti VAR_X-Var_X
>> EX = x * p; >> EX2= (x.^2) * p; >> Var_X = EX2 - (EX).^2; >> VAR_X=( (x-EX).^2 ) *p; >> simplify(VAR_X - Var_X) ans = 0
Queste due matrici P P rappresenta una legge congiunta. Infatti i suoi elementi sono non negativi ma i j p(X,Y ) (xi ,yj ) > 1 >> find( (P<0) ) ans = Empty matrix: 0-by-1 >> sum( sum( P ) ) ans = 1.2000 Inseriamo la buona matrice P >> P(3,3:4)= 0 P = 0.1000 0.1000 0.1000 0.1000 0.1000 0.1000
0.1000 0.1000 0
0.1000 0.1000 0
68
Probabilit` a
>> sum( sum ( P ) ) ans = 1 Ricordando che il comando sum somma per colonne, troviamo le distribuzioni marginali >> P_Y = ( sum ( P ) ) P_Y = 0.3000 0.3000 0.2000 0.2000 >> P_X = ( sum ( P ) ) P_X = 0.4000 0.4000 0.2000 >> P_X * ( P_Y ) ans = 0.1200 0.1200 0.1200 0.1200 0.0600 0.0600 %distribuzione marginale di Y
%distribuzione marginale di X
Verichiamo se X e Y sono indipendenti, ossia %matrice con fenomeni X e Y indipendenti 0.0800 0.0800 0.0400 0.0800 0.0800 0.0400
Per il criterio di indipendenza, i due eventi X e Y non sono indipendenti, essendo questultima matrice diversa da P. Costruiamo ora le due matrici XX e YY tramite il comando meshgrid >> [XX,YY]=meshgrid(X,Y) XX = 3 4 8 3 4 8 3 4 8 3 4 8 YY = -1 -1 -1 0 0 0 3 3 3 4 4 4 Queste matrici servono per il calcolo di una funzione g (X,Y ). Se vogliamo avere ad esempio la matrice Sij = sin(xi + 3yj ), baster` a scrivere >> S = sin( XX + 3 * YY ) S = 0 0.8415 -0.9589 0.1411 -0.7568 0.9894 -0.5366 0.4202 -0.9614 0.6503 -0.2879 0.9129 Calcoliamo, il valore atteso di g (X,Y ) >> sum( sum( S .* P ) ) ans = 0.0502 Calcoliamo ora E (X + Y ) e mostriamo che ` e uguale a E (X ) + E (Y ) >> sum( sum( ( XX + YY ) .* P ) ) ans = 5.5000
Probabilit` a
69
>> EX = sum( X * P_X ) EX = 4.4000 >> EY = sum( Y * P_Y ) EY = 1.1000 >> EX + EY ans = 5.5000
n 0.
La variabile n caratterizza una successione temporale discreta. In sostanza lo stato del sistema al passo n + 1 dipende solo dallo stato del sistema al passo n. Tale propriet` a` e soddisfatta da quasi tutti i sistemi nellambito della sica e della scienza dei calcolatori1 . Si noti che anche P n ` e una matrice di transizione avente righe a somma 1, un suo generico elemento di indici i e j rappresenta quindi la probabilit` a che il sistema si trovi dopo n passi nello stato j trovandosi nello stato i allistante iniziale. Si ` e interessati a sapere cosa succede per n crescente. Cosa possiamo dire sul comportamento della matrice P n e di pn ? Si pu` o dimostrare che matrici del tipo di P hanno un autovalore uguale a 1 (si veda il Capitolo 9). Vediamo un esempio numerico con lausilio di MATLAB. Supponiamo che gli stati rappresentino delle stanze di un labirinto. Un topolino inizialmente in una stanza si muove in questo labirinto in maniera casuale attraverso le altre stanze collegate tra loro. Supponiamo inoltre che se una stanza ha m collegamenti il topolino possa scegliere ognuna di esse con uguale probabilit` a 1/m. Una matrice che rappresenta una possibile dinamica dei cammini del topolino nel caso di 9 stanze ` e la seguente matrice di transizione P 0 1 0 1/2 0 0 0 1 /2 0 0 0 1 / 3 0 1 / 3 0 1 / 3 0 0 0 0 C B B 0 1/2 0 0 0 1 /2 0 0 0 C B C B 1/2 0 0 0 1/2 0 0 0 0 C C B B 1/4 0 1/4 0 1 /4 0 1 /4 0 C P =B 0 C 0 1/3 0 1/3 0 0 0 1 /3 C B 0 C B 0 0 0 0 0 0 0 1 0 C B C B 0 0 0 0 1 / 2 0 1 / 2 0 0 A @ 0 0 1/2 0 0 1 /2 0 0 0 in cui ogni elemento pij della matrice stessa rappresenta la probabilit` a di andare dalla stanza i alla stanza j (pij = 0 signica che le stanze non sono collegate). Supponiamo che il topolino inizialmente si trovi nella prima stanza, ossia p0 = {1,0,0,0,0,0,0,0,0}. Calcoliamo il valore assoluto degli autovalori di P
1 Nella realt` a la dimensione di questi sistemi ` e cos` elevata da rendere lanalisi impossibile, per cui spesso si preferiscono modelli alternativi.
70
Probabilit` a
>> [V,D]=eig(P); >> abs(D) ans = 0.9384 1.0000 0.6855 0.7430 0.2864 0.2864 0.2954 0.0000 0.1499 A parte lautovalore uguale ad 1, indichiamo con il pi` u grande modulo dei restanti autovalori. Si ottiene = 0. 9384 < 1. Ricordando il Capitolo 9, da P V = V D segue 1 n n 1 P = V DV e quindi P = V D V . Dunque poich` e < 1 per n si conserva solo lelemento diagonale uguale ad 1 nella matrice D. In altre parole limn Dn = diag{0,1,0,0,0,0,0,0,0}. Quindi se < 1 la matrice di transizione converge ad una matrice stazionaria P . In tal caso esiste un unico vettore di probabilit` a stazionaria p = P p0 tale che pn = P n p0 p per ogni vettore di probabilit` a degli stati iniziale p0 . Otteniamo >> p0=[1 0 0 0 0 0 0 0 0]; >> Dinf=diag([0 1 0 0 0 0 0 0 0]); >> Pinf=real(V*Dinf*inv(V)); >> Pinf(1,:) % La matrice ha righe tutte uguali ans = 0.0755 0.1572 0.1468 0.0461 0.1845 0.1887 0.0461 >> pinf=Pinf*p0; >> pinf(1) % Il vettore ha componenti tutte uguali ans = 0.0755
0.0922
0.0629
Essendo la matrice P reale, lestrazione della parte reale tramite real ` e di fatto superua. Tale comando migliora per` o la visualizzazione dei risultati nali (si provi senza). Indipendentemente dallo stato iniziale la stanza pi` u probabile in cui trovare il topolino ` e la numero 6 con probabilit` a 0. 1887, mentre la probabilit` a che il topolino sia ancora nella prima stanza ` e 0. 0755. Nella Figura 11.2 ` e visualizzato il comportamento delle componenti del vettore pn per n = 1, . . . ,50.
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
10
15
20
25
30
35
40
45
50
12
Modelli probabilistici
0 1 0
La funzione rand(m,n) genera una matrice m n di numeri pseudo-casuali indipendenti compresi tra 0 e 1. Un computer non pu` o produrre caso ma solo pseudo-caso. Infatti il calcolatore genera numeri con algoritmi numerici deterministici in grado di superare una serie di test statistici che conferiscono a tali numeri una apparente casualit` a. Torneremo su questo aspetto nel laboratorio Matlab del prossimo capitolo. Il comando rand simula una v.a. continua con risultati tra 0 e 1 e con densit` a 1 costante. Il risultato che si avr` a dando pi` u volte il comando sar` a quindi diverso e indipendente dal precedente. Loperatore logico (A>B) restituisce 1 quando il predicato ` e vero, 0 se ` e falso. Nel nostro caso la probabilit` a che esca 1 ` e la probabilit` a che una legge uniforme su [0,1] sia maggiore di 0. 75, ossia 1/4. In generale (rand(m,n)>(1-p)) restituisce quindi una matrice m n di v.a. di Bernoulli di parametro p. Se sommo le colonne della matrice, ottengo un vettore di n colonne distribuite come una binomiale di parametri m e p. Nellesempio >> B=sum(A) B = 1 2
abbiamo che B ` e un vettore di 4 elementi, ciascuno dei quali ha legge binomiale Xi B (3,1/4). Per generare un vettore X di 4 elementi, ciascuno dei quali ha legge di Poisson di parametro 3, utilizzeremo lapprossimazione binomiale X B (1000,3/1000) >> X=sum( (rand(1000,4) > ( 1 - 3/1000 ) ) ) X = 3 1 2 3 Digitiamo ora >> X= floor(log(rand(1,1))/log(1-1/4))+1 X = 6
72
Modelli probabilistici
dove abbiamo usato la funzione floor che restituisce la parte intera dellargomento. Avremo che X = k se e solo se log(rand(1,1)) k1 <k log(1 1/4) ossia se e solo se (si ricordi che 3/4 < 1),
) (3 4
P ({X = k}) = P 3 ({( 4 )
k 1
rand(1,1) >
(3 ) 4
Poich e rand(1,1) genera una v.a. uniforme U , la probabilit` a con cui X = k accade ` e
k1
U >
3 (4 ) }) = ( 3 ) 4
k
k1
3 (4 )
1 3 4 4
( )
k1
ossia la legge di X ` e una geometrica di parametro 1/4. Per generare G vettore 1 4 di v.a. indipendenti con legge geometrica di parametro 1/25 >> X = floor(log(rand(1,4))/log(1-1/25))+1 X = 8 29 5 14
La probabilit` a con cui X > t accade ` e quindi e2t ossia la legge di X ` e una esponenziale di parametro 2. Per generare E vettore 1 4 di v.a. indipendenti esponenziali di parametro 1/25 >> E = -log(rand(1,4))/(1/25) E = 31.7329 16.0619 49.2324
14.3825
Per generare una v.a. di legge gaussiana possiamo operare in due modi: 1. utilizzare la funzione randn(m,n) che genera una matrice m n di numeri pseudocasuali indipendenti distribuiti come una normale standard (con parametri 0 e 1). Avremo dunque che >> A =randn(1,4) A = -0.5883 2.1832
-0.1364
0.1139
` e un vettore di 4 elementi distribuiti come una normale standard. A questo punto, per generare un vettore N di 4 elementi distribuiti come una normale di media 3 e varianza 5
Modelli probabilistici
73
2.6950
3.2548
(s)
2. utilizzare il Teorema Limite Centrale: Mn N (0,1). La standardizzata della media di n leggi bernoulliane di parametro 1/2 ` e
(s) = Mn X1 ++Xn n
1/2
1/(4n)
2 = (X1 + + Xn n/2). n
Utilizziamo n = 1000. Avremo dunque che >> X = 2 / sqrt(1000) * ( sum((rand(1000,1) > 1/2 )) - 1000/2 ) X = 0.8854 ` e distribuito come una normale standard (per generare un vettore di m elementi, avremmo scritto rand(1000,m) invece di rand(1000,1)). A questo punto, per generare N distribuito come una normale di media 3 e varianza 5 >> N = 3 + sqrt(5)*X N = 4.9799
12.3 La funzione
Rx 2 MATLAB calcola lapprossimazione numerica di erf(x) = 0 2/ es ds con la funzione erf(x). Attraverso questa funzione vogliamo calcolare (x) = P ({X x}) (la funzione delle tavole di una distribuzione normale standard). Abbiamo che Rx R0 Rx (x) = fX (t) dt = fX (t) dt + 0 fX (t) dt
1 = + 2
Z
0
1 t2 e 2 dt 2
x/ 2
(t=s/ 2)
1 + 2
Z
0
x/ 2
2 1 es ds
1 1 = + 2 2
Z
0
2 2 1 1 es ds = + erf 2 2
x 2
Possiamo quindi far disegnare il graco la funzione (x) (si veda la Figura 12.1) o calcolare P ({X 1. 25}), scrivendo >> x= [-4:.01:4]; >> y= 1/2 + 1/2 * erf( x/sqrt(2) ); >> plot(x,y) >> >> 1/2 + 1/2 * erf( -1.25/sqrt(2) ) ans = 0.1056 %ascisse per il grafico %ordinate per il grafico %disegna grafico %calcola P({ X <= 1.25 })
74
Modelli probabilistici
0.8
0.6
0.4
0.2
0 4
13
Campionamento statistico e descrizione dei dati
In questultima riga si ` e usata la funzione bar (che disegna un bar-chart) con lopzione hist (che indica che in Y vi sono gli estremi delle barre e non i punti medi). Costruiamo listogramma di densit` a della Tabella 13.5. Prima di proseguire, notiamo che
76
0 1.6
1.7
1.8
1.9
2 1.6
1.7
1.8
1.9
Figura 13.1 Istogrammi dei dati dellEsempio 13.7, ottenuti con barre assegnate da MATLAB e imponendo gli estremi delle barre.
hist restituisce i dati per il graco con una barra in pi` u dellampiezza pari allultima assegnata.1 >> Y=[1.60 1.72 1.81 1.87 1.95 2]; >> num_oss= histc(A,Y); >> ser_stat= num_oss / 20; >> G=diag(ones(5,1),1)-diag(ones(6,1)); >> G(6,:)=G(5,:); >> amp_int= (G*Y); >> alt_bar= (ser_stat./amp_int) alt_bar = 2.0833 3.3333 4.1667 2.5000 0 >> bar(Y,alt_bar,histc) >> sum(alt_bar.*amp_int) %controllo area=1 ans = 1
>> Eta=[ 36; 48; 51; 54; 57; 60]; >> Alt=[ 86; 90; 91; 93; 94; 95]; >> MnX= mean(Eta) MnX = 51 >> MnY= mean(Alt) MnY = 91.5000 >> S_X= std(Eta) S_X = 8.4853 >> S_Y= std(Alt) S_Y = 3.2711
1 Questo perch` e MATLAB assegna i valori allintervallo di sinistra e quindi si riserva una barra per i valori uguali al massimo valore che abbiamo inserito.
77
>> M=corrcoef([ Eta Alt ]) M = 1.0000 0.9944 0.9944 1.0000 La matrice M di correlazione va letta nel seguente modo 9 8 > r(X,X ) r(X,Y ) > > M => ; : r(Y,X ) r(Y,Y ) Calcoliamo quindi a e b per la retta dei minimi quadrati. Abbiamo che >> a=M(1,2)*S_Y/S_X a = 0.3833 >> b= MnY - a * MnX b = 71.9500 e quindi disegniamo la Figura 13.3. >> >> >> >> plot(Eta,Alt,.) hold on xx=[35 65]; plot(xx, a*xx + b) %scatterplot %per una retta bastano due punti... %disegna la retta dei minimi quadrati
78
casuali distribuiti uniformemente in [1,6]). Ci limiteremo in questo breve paragrafo ad accennare alcune idee di base. Supponiamo di volere generare un numero casuale di 4 cifre, ossia un numero tra 0000 e 9999. Ldea del metodo middle-square, ideato da John von Neumann nel 1946, ` e la seguente. Si parte da un valore iniziale, detto seme a c cifre, per esempio 1234, lo si eleva al quadrato ottenendo un numero con il doppio 2c di cifre, nel nostro caso 01522756, di queste teniamo solamente le c cifre di mezzo, ossia 5227. Ripetendo il procedimento otteniamo 27321529 e quindi 3215 e cos` via. In MATLAB per esempio >> n=10; >> seme=1234; >> x=zeros(1,n); x(1)=seme; >> for i=1:n-1, st=num2str(x(i)^2,%08d); x(i+1)=str2double(st(3:6)); end >> x x = Columns 1 through 7 1234 5227 3215 3362 3030 1809 2724 Columns 8 through 10 4201 6484 422 Ogni nuovo numero nella successione ` e determinato univocamente dal suo predecessore. La successione generata quindi non potr` a essere casuale ma avr` a solo il carattere di apparente casualit` a. Dal punto di vista MATLAB abbiamo usato la funzione num2str che consente di convertire un numero in una stringa, e la funzione str2double che esegue il procedimento inverso. Ogni successione di numeri generati da questo algoritmo inizier` a a ripetersi prima o poi. Il numero di numeri della sequenza prima che intervenga una ripetizione ` e detto periodo della sequenza. La lunghezza di tale periodo pu` o essere considerata una misura della bont` a del generatore di numeri pseudo-casuali. Sfortunatamente questo metodo pu` o degenerare in sequenze con periodi molto brevi, ad esempio a partire dal valore 0 la sequenza ha sempre periodo 1, oppure partendo con 43 e numeri a 2 cifre otteniamo la sequenza 43, 84, 05, 02, 00, 00, . . .. Nel 1948 per la prima volta venne proposto un generatore di numeri casuali distribuiti uniformemente detto generatore lineare congruenziale o pi` u brevemente LCG. Il metodo LCG, analogamente al metodo middle-square, ha bisogno di un seme per inizializzare la sequenza di numeri secondo la seguente regola deterministica xn+1 = (axn + c)mod m, n 0, dove a, c ed m sono opportuni numeri interi costanti. La notazione mod m, ossia modulo m, signica che axn + c viene diviso per m e xn+1 posto uguale al resto intero della divisione. Quindi xn+1 assume valori interi tra 0,1,2, . . . ,m 1. Il problema della scelta dei migliori valori per a, c ed m ` e il punto cruciale del metodo. Cosa si intende per` o per migliori? Un aspetto importante ` e la lunghezza del periodo dalla quale si vede subito che m dovr` a essere molto grande. Un secondo aspetto consiste nel garantirsi che per un dato m i valori di a e c siano tali che la successione abbia periodo massimo. Una delle scelte pi` u popolari2 ` e m = 231 1, a = 75 , c = 0. Da un punto di vista pratico i generatori di numeri casuali restituiscono invece di xn+1 il suo valore diviso per m, questo al ne di evitare numeri troppo grandi. Per esempio il metodo LCG in MATLAB potr` a essere realizzato come >> >> >> >> >> >> n=10000; m=2147483647; a=16807; c=0; seme = 1234; x=zeros(1,n); x(1)=seme; for i=1:n-1, x(i+1)=mod(a*x(i)+c,m); end x=x./m;
2 Il metodo LCG con questa scelta era alla base dellalgoritmo utilizzato da MATLAB per la generazione di numeri casuali distribuiti uniformemente no alla versione 4.0.
79
dove abbiamo utilizzato la funzione MATLAB mod dallovvio signicato. Il valore massimo generato sar` a quindi 0,99999999953434 ed il minimo 0,00000000046566. Dopo avere generato una tabella di 100 valori pseudo-casuali compresi tra 0 ed 1 possiamo vericarne luniforme distribuzione tramite >> N=50; >> hist(x,N); Nel caso della distribuzione uniforme tale valore teorico dovrebbe essere esattamente pari a n/N ossia 10000/50 = 200 nellesempio specico. Nella gura 13.2 confrontiamo il metodo LCG con il generatore rand di MATLAB.
LCG
250 250
rand
200
200
150
150
100
100
50
50
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
Figura 13.2 Istogramma di frequenza dei generatori uniformi di numeri casuali. Una richiesta pi` u importante nel valutare la bont` a di un generatore uniforme di numeri pseudo-casuali ` e lassenza di correlazione tra i numeri generati dallalgoritmo. In altre parole non deve emergere nessuna relazione funzionale tra xn e xn+1 per n > 0. Questa propriet` a pu` o essere vericata gracamente realizzando il graco bidimensionale dei punti (xn ,xn+j ) per j > 0. In tale graco non dovranno comparire linee, forme o altre strutture regolari. In gura 13.3 riportiamo il risultato per j = 1 con 1000 punti ottenuto con il generatore LCG con le scelte ottimali di a, b e c e modicato scegliendo come valori m = 31, a = 13 e c = 0.
1 1
0.9
0.9
0.8
0.8
0.7
0.7
0.6
0.6
0.5
0.5
0.4
0.4
0.3
0.3
0.2
0.2
0.1
0.1
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
Figura 13.3 Assenza di correlazione (sinistra) e forte correlazione (destra) nel graco dei punti (xn ,xn+1 ) in un generatore uniforme di numeri pseudo-casuali.
80
14
Metodi statistici inferenziali
0.8288
0.3637
0.0351
0.6318
0.4423
Disegniamo listogramma con i dati che abbiamo >> B=histc(A,[0:1/10:1]); >> bar([0:1/10:1]+1/20,B,histc) ottenendo, a meno della casualit` a, un istogramma simile a quello nella Figura 14.1.
140 120 100 80 60 40 20 0 0
0.2
0.4
0.6
0.8
Figura 14.1 Istogramma delle mille simulazioni da distribuzione uniforme. Costruiamo un intervallo di condenza con adabilit` a 95% per il valore atteso della distribuzione simulata, che sappiamo essere 1/2.
82
Ora, costruiamo 20 simulazioni di intervalli di condenza e confrontiamoli sul graco col valore vero del parametro, ossia 1/2, come mostrato nella Figura 14.2. >> >> >> >> >> >> >> >> >> >> A=rand(1000,20); MA=mean(A); SA=std(A); ES=MA-1.96*SA/sqrt(1000); ED=MA+1.96*SA/sqrt(1000); alt=[1:20]; figure hold on for i=1:20, plot([ES(i) ED(i)],[i i]), end plot([1/2 1/2],[0 21],--), hold off
20
15
10
0 0.45
0.5
0.55
Figura 14.2 Venti intervalli di condenza a confronto col parametro vero. Il valore vero non appartiene a tutti gli intervalli, infatti dalla denizione di intervallo di condenza P ( [a,b]) = segue che prima di eettuare le simulazioni, avevamo P (1/2 [a,b]) = 0.95. Qual ` e la probabilit` a che tutte e 20 le simulazioni contengano il valore vero? Dalla legge binomiale, se Y B (20,0.95), P ({Y = 20}) 0.36.
83
in 10 classi, ognuna di ampiezza 1/10. Avremo quindi N = 10, p0 k = 1/10 (distribuzione uniforme), n = 1000. Per ogni intervallo, mi aspetto 100 simulazioni, come si verica 0 semplicemente dalla relazione n0 k = n pk . >> VO=histc(A,[0:1/10:1]); >> VO=VO(1:10,:); >> VA=100*ones(10,20); %numero di osservazioni in ogni intervallo
Il nostro test, a priori, rigetter` a lipotesi di adattamento se D > d1 , con D 2 N 1 . Dalle tavole, d0.99 21. 666. Impostiamo quindi i 20 test (abbiamo in memoria 20 simulazioni). >> D=sum((VO-VA).^2./VA) %distanza pivotale per i test Chi Quadro D = Columns 1 through 7 2.4600 8.4200 2.3200 4.8600 2.3200 4.9600 6.6000 Columns 8 through 14 3.7400 6.0400 13.5000 10.7000 13.2600 7.9800 11.2600 Columns 15 through 20 5.0800 10.1400 3.7800 5.0200 5.3000 2.8000 Per questa simulazione, in nessun caso possiamo riutare lipotesi di adattamento, come si pu` o pi` u facilmente osservare con loperatore logico > >> (D > 21.666) ans = Columns 1 through 12 0 0 0 0 Columns 13 through 20 0 0 0 0
0 0
0 0
0 0
0 0
Questultimo fatto dipende chiaramente dallesperimento eseguito. Va notato comunque che su 20 test a livello = 0.99, la probabilit` a che nessuno dia come risultato di rigettare lipotesi nulla ` e circa 0.82. Eseguiamo ora un test 2 di indipendenza con i dati dellEsercizio 14.11. >> A=[30 40; 58 67; 37 18] A = 30 40 58 67 37 18 Ricordando che sum somma i dati per colonne, calcoliamo SR (somme righe) e SC (somma colonne) per mezzo delloperatore (trasposta di una matrice). >> SR=sum(A), SC=sum(A), SR = 70 125 55 SC = 125 125 Calcoliamo quindi NT il numero totale di osservazioni e quindi la matrice del numero atteso di osservazioni stimato sotto lipotesi nulla. Il calcolo diviene in MATLAB algebricamente semplice, moltiplicando il vettore colonna SR per il vettore riga SC e divendo il totale per NT. NT = 250 >> VA=SR*SC/NT VA =
84
Il nostro test di indipendenza, a priori, rigetter` a lipotesi di adattamento se D > d1 , con D 2 (r 1)(c1) . Scegliamo = 0. 95 Dalle tavole, d0.95 5. 991. >> D=sum(sum((A-VA).^2./VA)) D = 8.6402 Riutiamo lipotesi di indipendenza, come si pu` o pi` u facilmente osservare con loperatore logico > >> (D > 5.991) ans = 1
Indice Analitico
MATLAB backslash, 49 comandi abs, 5 acos, 5 asin, 5 atan, 5 axis, 12, 14, 63 bar, 65, 75 cd, 15 clear, 7 colormap, 47 compose, 22 conv, 20 copyfile, 15 cos, 4, 5 deconv, 20 delete, 15 det, 51 diag, 9 diff, 27 dir, 15 dsolve, 42 eig, 55 erf, 73 expand, 15 exp, 5 eye, 9 ezplot, 11, 20 figure, 62 find, 65 finverse, 22 floor, 72 fminbnd, 28 fmin, 28 for...end, 24 format, 4 fplot, 20
fzero, 25 ginput, 61 grid, 14 histc, 75 hist, 75 hold off, 13 hold on, 13 image, 47 inline, 20 inv, 52 legend, 13, 14 length, 6 limit, 23 linspace, 7, 9 log10, 5 log2, 5 logspace, 9 log, 5 mean, 75 median, 75 meshgrid, 68 mesh, 63 mkdir, 15 mod, 79 norm, 57 null, 50 num2str, 78 ode45, 43 ones, 9 plot3, 38 plot, 12 polyval, 19 pwd, 15 quad8, 37 quad, 37 quiver3, 63 quiver, 63 randn, 72 rand, 9, 71 rank, 50 real, 70 root, 32 sign, 5 simplify, 32 sin, 4, 5 solve, 30, 32 sqrt, 5 std, 75
86
Indice Analitico
str2double, 78 subplot, 27 subs, 22, 51 surf, 63 symsum, 41 syms, 15 tan, 5 taylor, 41 text, 14 title, 14, 63 trapz, 39 type, 15 var, 66, 75 whos, 6 who, 6 xlabel, 14, 63 ylabel, 14, 63 zeros, 9 zlabel, 63 funzioni vettoriali, 9 M-le, 14 notazione due punti, 7 numeri complessi, 3 operatori \, 49 *, 4 +, 4 -, 4 .*, 4 ./, 4 ., 4 /, 4 , 4 operazioni puntuali, 10 Symbolic Mathematics Toolbox, 15 variabili Inf, 3 NaN, 3 ans, 2, 3 computer, 3 i,j, 3 pi, 3 realmax, 3 realmin, 3 version, 3 matrice di stiness, 56 di transizione, 69 di Vandermonde, 52 probabilit` a di transizione, 69 risonanza, 56