Sei sulla pagina 1di 86

Laboratorio Matlab

Matematica I:

Calcolo dierenziale, Algebra lineare, Probabilit` a e Statistica

G.Aletti, G.Naldi, L.Pareschi

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

Tabella 2.4 Le principali variabili predenite in 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

Tabella 2.5 Le principali operazioni denite in MATLAB.

>> 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

Tabella 2.6 Alcune funzioni matematiche predenite in MATLAB.

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

>> whos Name A x

Size 2x4 1x8

Bytes 64 64

Class double array double array

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

Funzione linspace logspace zeros ones rand eye diag

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

+ 5.0000i - 4.0000i - 7.0000i + 4.0000i

La funzione eye genera invece la matrice identit` a

Operazioni tra matrici


La maggior parte delle funzioni predenite in MATLAB accettano come argomenti array a pi` u indici. Per esempio >> n = >> x = >> c = >> [x ans = 7; linspace(0,pi,n); cos(x); c] 1.0000 0.8660 0.5000 0.0000 -0.5000 -0.8660 -1.0000

0 0.5236 1.0472 1.5708 2.0944 2.6180 3.1416

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

9 -5 0.4000 0.3333 0.2857

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.

Colore y m c r g b w k giallo magenta ciano rosso verde blu bianco nero . o x + * s d v

Simbolo punto circoletto per pi` u asterisco quadratino diamante triangolo : -. --

Linea linea linea linea linea continua punteggiata punto tratteggiata

Tabella 2.8 Principali opzioni del comando plot in MATLAB.

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

Grafico della funzione sin(x)


1

Grafico della funzione sin(x)


1 0.8

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

1 Coseno Seno Intersezione

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.

Funzione axis title xlabel ylabel grid legend text

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

Tabella 2.9 Funzioni per perfezionare i graci in MATLAB.

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.

MATLAB dir type delete cd pwd mkdir copyfile

MS-DOS dir type del cd chdir mkdir copy

UNIX ls cat rm cd pwd mkdir cp

Tabella 2.10 Alcuni comandi per la gestione del le system.

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

0.1 Numeri macchina


Una approssimazione inevitabile che si incontra in MATLAB o in ambienti di calcolo simili ` e dovuta alla rappresentazione dei numeri reali in un calcolatore. In particolare abbiamo a disposizione solo un numero nito di cifre. I numeri macchina sono rappresentati usualmente considerando lidea della notazione scientica dove un numero ` e espresso come il prodotto di una quantit` a per una opportuna potenza di una assegnata base. Il numero macchina x ` e quindi nella forma x=s d1 1 + d2 2 + . . . + dt t p ,

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.

0.2 Calcoli simbolici


Va precisato che MATLAB ` e in grado di eseguire anche calcoli esatti, trattando i numeri come simboli. Per fare ci` o abbiamo bisogno del Symbolic Toolbox. Abbiamo che il numero >> t=0.1 t = 0.1000 pu` o essere rappresentato nella sua forma razionale tramite >> sym(t) ans = 1/10 Utilizzando lopzione e otteniamo la forma razionale del numero pi` u la dierenza tra la rappresentazione razionale teorica e lattuale rappresentazione in termini di numeri macchina >> sym(t,e) ans = 1/10+eps/40 Utilizzando lopzione d visualizziamo la sua rappresentazione decimale con 32 cifre >> sym(t,d) ans = .10000000000000000555111512312578 Interessante inne ` e anche luso dellistruzione format rat che visualizza lapprossimazione tramite razionali di un qualunque numero inserito. Per esempio >> format rat >> sqrt(2) ans = 1393/985

1
Funzioni

1.1 Calcolo di polinomi


Tra le funzioni elementari le funzioni polinomiali sono tra quelle pi` u utilizzate in vari algoritmi numerici. In MATLAB un polinomio ` e rappresentato come un vettore che contiene i coecienti ordinati dal coeciente del monomio di grado massimo al monomio di grado minore. Per esempio la funzione p(x) = x3 2x 5 si pu` o rappresentare come p=[1 -2 -5] (se il polinomio ha alcuni coecienti nulli essi vanno sempre inseriti nel vettore per non alterare il grado del polinomio). Per calcolare una funzione polinomiale in corrispondenza di un valore x occorre utilizzare la funzione polyval. Per esempio con >> p=[1 -3 -5]; >> x=3; >> y=polyval(p,x) y = -5 Si ricorda che luso del punto e virgola esegue un comando senza visualizzare il risultato. Se vogliamo realizzare il graco del polinomio, dobbiamo innanzitutto creare una griglia di valori. Un calcolatore infatti per realizzare il graco di una qualunque funzione f (x) utilizza in generale una griglia equispaziata di valori {xk } nei quali valuta la funzione yk = f (xk ), individuando cos` un insieme di punti del piano caratterizzati dalle coppie (xk ,yk ). Tali punti sono poi raccordati gracamente in modo da creare leetto di una linea continua. Una serie di 200 valori nellintervallo [2,5] e le corrispondenti valutazioni del polinomio vengono costruiti in MATLAB tramite >> x=linspace(-2,5,200); >> y=polyval(p,x); Per disegnare, per punti, il graco in tale intervallo basta utilizzare plot(x,y) (si veda la Figura 1.1). Per il calcolo delle radici di un polinomio, continuando lultimo esempio1 >> roots(p) ans = 4.1926 -1.1926
1 Occorre fare attenzione. Non ` e detto che tutte le radici di un polinomio appartengano allinsieme dei numeri reali. In generale la radice di un polinomio appartiene allinsieme dei numeri complessi (insieme estensione dellinsieme che permette di avere un ambiente adatto per le radici di tutti i polinomi).

20

Funzioni

8 2

Figura 1.1 Graco di p(x) = x2 3x 5 con plot.

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

dove nellultima espressione r rappresenta il resto della divisione di c con p.

1.2 Altre funzioni elementari


Molte altre funzioni elementari sono elencate in Appendice B. Ulteriori funzioni si possono ottenere componendo le funzioni elementari, per esempio la funzione lx=log(abs(x)) calcola il logaritmo del valore assoluto di x. Abbiamo detto che per disegnare per punti il graco di una data funzione occorre preparare linsieme dei punti x in cui calcolare la funzione in esame e poi considerare istruzioni per la graca. In alternativa ` e possibile utilizzare fplot, o ezplot per esempio >> ezplot(sin(2*x)+cos(x),[-2*pi 2*pi -2 2]); disegna il graco della funzione f (x) = sin 2x + cos x, per x [2, 2 ] e considerando una nestra graca con ordinate y comprese tra 2 e 2 (si veda la Figura 1.2). Pu` o risultare utile denire un oggetto che contenga una funzione in modo tale da poterla utilizzare in pi` u contesti, nellesempio precedente si poteva procedere utilizzando inline nella forma >> f=inline(sin(2*x)+cos(x)); >> ezplot(f,[-2*pi 2*pi -1 1]); ed ottenere lo stesso risultato. Nel caso si esplorino regioni non appartenenti al dominio delle funzioni in uso vi sar` a un segnale di avvertimento, warning

Funzioni

21

sin(2 x)+cos(x) 2

1.5

0.5

0.5

1.5

0 x

Figura 1.2 Graco di f (x) = sin 2x + cos x con ezplot.

>> 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

1.3 Funzioni e calcolo simbolico


Nellambiente di calcolo simbolico possiamo avvalerci di un calcolatore funzionale ovvero possiamo lavorare in modo analogo a quanto potremmo fare con carta e penna. Per esempio ritroviamo >> syms s t >> expand(cos(s+t)) ans = cos(s)*cos(t)-sin(s)*sin(t) oppure >> syms a x y >> expand(a^(x+y)) ans = a^x*a^y Se consideriamo invece le operazioni tra funzioni osserviamo che tramite il comando sym(f (x)) possiamo creare funzioni astratte. Per esempio >> f=sym(x^2-1) ; g=sym(exp(x)); >> f+g ans = x^2-1+exp(x) >> f*g ans = (x^2-1)*exp(x) >> f/g ans = (x^2-1)/exp(x) Per valutare una funzione astratta in un punto possiamo utilizzare subs e scrivere con le denizione precedenti >> syms x >> subs(f,x,3) ans = 8 >> subs(g,x,2) ans = 7.3891 Per la composizione di funzioni, utilizzando le due funzioni f e g denite sopra si usa il comando compose >> compose(g,f) ans = exp(x^2-1) >> compose(f,g) ans = exp(x)^2-1 mentre per determinare la funzione inversa il comando finverse >> f=sym((exp(x)-exp(-x))/(exp(x)+exp(-x))); >> finverse(f) ans = log(1/(-1+x)*(-(-1+x)*(1+x))^(1/2))

2
Limiti e continuit` a

2.1 Calcolo di limiti


Arontare il calcolo di un limite dal punto di vista numerico pu` o portare a brutte sorprese dovute allapprossimazione del mondo dei numeri reali con i numeri macchina. Per esempio non possiamo arontare il calcolo del limite  n 1 , lim 1+ n+ n semplicemente aumentando il valore di n sperando di avvicinarci al valore limite, il numero e. Infatti, se il valore n ` e troppo grande segue che 1/n ` e minore della precisione macchina e non viene pi` u sentito nelle operazioni, quindi (1 + 1/n) = 1. Da quel valore di n in avanti la somma (1+1/n) resta uguale a uno e il limite numerico sembra attestarsi proprio su 1. Per esempio >> n=10^16; >> (1+1/n)^n ans = 1 Fenomeni simili possono avvenire anche per altre anomalie dovute alla necessit` a di ricorrere ai numeri macchina e alle operazioni tra questi, per esempio si possono perdere cifre signicative o avere errori detti di cancellazione. Dal punto di vista del calcolo simbolico abbiamo a disposizione la funzione limit, qualche esempio ` e pi` u chiaro di qualsiasi descrizione formale >> syms x t ; >> limit(sin(x)/x,x,0) ans = 1 >> limit((x+1)/(x-1),x,1,right) ans = inf >> limit((x+1)/(x-1),x,1,left) ans = -inf >> limit((3*x^2+1)/(-5*x^2+x+2),x,Inf) ans = -3/5 >> limit((1+1/t)^t,t,Inf) ans = exp(1) >> limit((t-2)/(t^2-4),t,2)

24

Limiti e continuit` a

ans = 1/4

2.2 Sistemi dinamici discreti


Un interessante applicazione del concetto di limite si ha nel caso di simulazione di semplici modelli rappresentabili come successioni numeriche. In particolare possiamo pensare a modelli a tempo discreto ovverosia a successioni {xk }kN dove lindice k indica un certo istante, si immagini una specie di cronometro che segni il tempo (secondi, mesi, anni) k = 0, 1, 2,. . ., mentre xk indica una certa quantit` a al tempo k. Tipico ` e il caso in cui il valore xk+1 ` e legato a uno o pi` u valori passati. Ci limitiamo al solo caso xk+1 = g (xk ), ovverosia a successioni denite per ricorrenza (utilizzando una dierente terminologia, abbiamo un sistema dinamico discreto ). Un esempio di carattere ecologico riguarda la dinamica di una popolazione di salmoni ed ` e dovuto al biologo W. Ricker. Levoluzione della popolazione (studiata da Ricker sul ume Fraser in Canada) pu` o essere scritta nel modo seguente xk+1 = xk er(1xk ) , dove xk indica il numero di salmoni (normalizzato rispetto a una popolazione di riferimento), r ` e un parametro del modello legato alla modalit` a di riproduzione e di spostamento della popolazione di salmoni, lindice k conta il tempo (di solito in anni). La domanda sul modello essenzialmente ` e: come cambia la dinamica della popolazione al variare del parametro r e del numero inziale di salmoni x0 ? Abbiamo estinzione, xk 0, oppure crescita illimitata, xk +, o un valore stazionario, xk L > 0, o altro ancora? Per esempio, la popolazione pu` o diventare periodica? La risposta a queste domande potrebbe essere una prima indicazione sulla gestione della popolazione, per esempio su quale quantit` a di salmoni sia permesso pescare in un certo tempo. Non analizzeremo dal punto di vista teorico il modello ma alcuni esperimenti numerici si possono facilmente fare. Di seguito scriviamo le istruzioni MATLAB per generare un vettore x con N valori, per un ssato valore del parametro r e un dato iniziale x0. >> >> >> >> N=50; x=zeros(N,1); x0=0.5; x(1)=x0; xk=x0; r=1; %parametri for k = 2:N, xk = xk * exp(r * (1-xk)); x(k) = xk; end

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.

2.3 Metodi iterativi


Metodi iterativi, ovverosia metodi che generano successioni {xk }kN con opportune propriet` a, sono utilizzati in MATLAB per la ricerca degli zeri di equazioni. Vengono generalizzate procedure simili a quella adottata nel Metodo di bisezione per la dimostrazione del

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

Figura 2.1 Alcuni esempi di simulazione del Modello di Ricker.

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

Figura 2.2 Illustrazione della seconda legge di Keplero.

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

3.1 Calcolo di derivate


Anche per le derivate il calcolo numerico tramite opportuni rapporti incrementali ` e una questione piuttosto delicata (sempre per via della necessit` a di basarsi sullinsieme dei numeri macchina e sul fatto che possiamo incappare in errori di cancellazione o altro). Memorizzati i valori di una funzione in un vettore y la funzione diff permette di calcolare le dierenze tra due valori successivi del vettore. Assegnato il passo h il rapporto incrementale approssimato si pu` o quindi valutare come ri=diff(y)/h. Il vettore ri ha una componente in meno rispetto al vettore y. Con le seguenti istruzioni (a parte le scritte) si ottiene il disegno nella Figura 3.1. >> >> >> >> >> >> >> N=120; x=linspace(0,2*pi,N); h=x(2)-x(1); y=sin(x); ri=diff(y)/h; subplot(211),plot(x,y); subplot(212),plot(x(1:N-1),ri);

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

Derivata di una funzione

sin(x)
0.5 0

0.5

0.5

diff(sin(x))/h

0.5

Figura 3.1 Approssimazione di sin (x).

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

3.2 Ricerca di massimi e minimi


Per la ricerca dei massimi e dei minimi di una funzione ` e possibile utilizzare la funzione fmin o fminbnd. Tali funzioni calcolano il punto di minimo (globale) in un certo intervallo di una funzione specicata. Si noti che per il calcolo del massimo di una funzione f basta considerare il problema del minimo della funzione f . Per esempio con >> fminbnd(cos,3,4) ans = 3.1416 calcoliamo il punto di minimo della funzione coseno nellintervallo [3,4] ovverosia una approssimazione di . I metodi per la ricerca del punto di minimo costruiscono una successione di valori che sotto opportune ipotesi tende verso il punto di minimo. Con >> fminbnd(cos,3,4,optimset(TolX,1e-12,Display,iter)) Func-count x f(x) Procedure 1 3.38197 -0.971249 initial 2 3.61803 -0.888633 golden 3 3.23607 -0.995541 golden 4 3.13571 -0.999983 parabolic 5 3.1413 -1 parabolic 6 3.14159 -1 parabolic 7 3.14159 -1 parabolic 8 3.14159 -1 parabolic 9 3.14159 -1 parabolic Optimization terminated successfully: the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-012 ans = 3.1416

Derivata di una funzione

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.

3.3 Problemi di ottimizzazione


Arontiamo un problema di ottimizzazione. Supponiamo di dover gestire il traco per un tratto di strada, per esempio un tratto di galleria. Tasso di usso delle macchine ` e denito come il numero di mezzi che passano in un posto ssato nellunit` a di tempo. Il usso dei mezzi dipender` a da vari fattori tra cui: (i) velocit` a del traco; (ii) distanza tra due mezzi consecutivi; (iii) lunghezza dei mezzi. Consideriamo una velocit` a media v e una media delle distanze tra mezzo e mezzo denotata con d, inoltre sia b la lunghezza media dei mezzi. Se ci mettiamo in un dato punto di osservazione, quando passa un mezzo il tempo medio che dobbiamo aspettare per vederne un altro ` e uguale a d+b T = . v Il tasso r di usso ` e uguale a 1 v r= = . T d+b Assumiamo come parametri v e d, ovviamente la velocit` a v inuisce sulla distanza d. Consideriamo la distanza minima d (per evitare incidenti) che dividiamo in due parti con relazioni empiriche legate alla velocit` a (i valori sono comunque nellunit` a di misura scelta per le distanze). Abbiamo la distanza pensata dal conduttore, d p = |v |, e la distanza utile per la fermata df = |v |2 /20. Posto d = dp + df , il tasso di usso ` e dato da v , (|v | + |v |2 /20 + b) visto che la velocit` a sar` a considerata positiva possiamo togliere il modulo nei termini al denominatore. Il graco di r ` e mostrato nella Figura 3.2. Vogliamo trovare il punto di massimo ovvero il massimo usso ottenibile e valutare la corrispondente velocit` a media da suggerire. Con una lunghezza media di b = 4 (metri) abbiamo, r= >> rm=inline(-v / (v+v^2/20+4)); >> fminbnd(rm,0,100) ans = 8.9443 dove si considera la funzione rm = r perch` e cerchiamo il massimo con un algoritmo che seleziona solo punti di minimo. Evidentemente la risposta, se pensata come chilometri allora, non sembra molto realistica. Possiamo rilassare i vincoli e considerare la distanza d = dp + df , con (0,1) parametro. Possiamo utilizzare il calcolo simbolico per trovare il punto stazionario, che sar` a anche il punto di massimo per come ` e landamento del graco del usso.

30

Derivata di una funzione

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

Figura 3.2 Andamento usso del traco.

>> 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

4.1 Graci di funzioni


Per disegnare il graco di una funzione abbiamo gi` a visto che possiamo utilizzare la funzione ezplot. Con le seguenti istruzioni >> >> >> >> subplot(221),ezplot(cos(x)*exp(-x)); subplot(222),ezplot(cos(x)*exp(-x),[-10*pi 4*pi]); subplot(223),ezplot(cos(x)*exp(-x),[-3*pi 3*pi]); subplot(224),ezplot(cos(x)*exp(-x),[-pi pi]);

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

300 0 200 100 0 100 200 5 0 x 5 2 0 x 2 5

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

Graci di funzioni e approssimazioni

calcolo simbolico. Consideriamo la funzione f (x) = x ex . 2x + 1

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

Graci di funzioni e approssimazioni

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

exp(x) x/(2 x+1)

Figura 4.2 Graco qualitativo della funzione f (x) = ex x/(2x + 1).

4.2 Approssimare dati e funzioni


Il polinomio di Taylor rappresenta solo una delle svariate possibilit` a a disposizione. Avendo a disposizione dei dati, che rappresentano solo alcuni valori di una funzione oppure che rappresentano misure di un fenomeno di cui stiamo cercando un modello, possiamo considerare una approssimazione con un polinomio di un certo grado. A grandi linee abbiamo a disposizione due strade pretendere che il polinomio passi esattamente per tutti i punti; lasciare che il polinomio indichi solo landamento qualitativo e parzialmente quantitativo dei dati. Nel primo caso si parla di interpolazione e il polinomio deve essere di grado opportuno (il grado deve essere uguale al numero di punti meno uno), inoltre tutte le ascisse dei punti devono essere dierenti per punti diversi altrimenti non stiamo parlando di una funzione p(x) (in corrispondenza di una ascissa non possiamo pretendere che il polinomio p assuma due valori dierenti). Nel secondo caso si parla di tting e le ricadute dal punto di vista statistico saranno considerate nel seguito di questo libro.

34

Graci di funzioni e approssimazioni

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

Figura 4.3 Dati censimento USA.

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

Graci di funzioni e approssimazioni

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

Figura 4.4 Varie possibilit` a per interpolare una tabella.

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

Figura 4.5 Interpolazione di una tabella bidimensionale.

36

Graci di funzioni e approssimazioni

tramite la funzione mesh, per esempio mesh(x1,y1,z1).

5
Integrali, aree, primitive

5.1 Calcolo numerico di integrali


Anche nellambito dellintegrazione possiamo sfruttare le potenzialit` a del calcolo simbolico oppure utilizzare approssimazione numeriche. Questultime si basano soprattutto sulla possibilit` a di considerare lintegrale come limite di una opportuna somma nita. In particolare si approssima un integrale denito come somma pesata
Z
a b

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

Integrali, aree, primitive

5.2 Periodi e lunghezze


Vogliamo determinare il periodo di un pendolo semplice. Questo periodo ` e legato allintegrale ellittico di prima specie denito come Z /2 d p K= , 1 x2 sin2 () 0 dove x2 < 1 ` e un parametro reale. Per esempio con x2 = 0. 4 possiamo valutare >> f=inline(1./sqrt(1-0.4*sin(t)),t); >> quad8(f,0,pi/2) ans = 1.8374 dove il risultato deve essere interpretato in base allunit` a di misura del tempo stabilite. Una interessante applicazione dellintegrale denito consiste nel calcolo della lunghezza di una curva espressa in forma parametrica. In generale per una curva nello spazio parametrizzata tramite le funzioni, supposte derivabili, x(t), y (t), z (t), t [a,b], il calcolo della lunghezza della curva stessa misurata dal punto (x(a),y (a),z (a)) al punto (x(b),y (b),z (b)) vale Z bp (x (t))2 + (y (t))2 + (z (t))2 dt.
a

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

Figura 5.1 Qual` e la lunghezza di questa curva?.

Integrali, aree, primitive


Z
0

39

4 cos2 (2t) + 9 sin2 (3t) + 1 dt,

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

Figura 5.2 Calcolo di pressione media eettiva.

5.3 Integrali partendo da una tabella


Se abbiamo a disposizione una tabella di valori e non una funzione con la sua espressione analitica possiamo utilizzare formule che approssimano la tabella di valori con funzioni lineari a tratti, funzione trapz. Per esempio da un diagramma sperimentale di volume V e pressione P vogliamo ricavare larea racchiusa in un ciclo (si pensi ad un ciclo di un motore per esempio), Z W = P dV.

40

Integrali, aree, primitive

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

6.1 Serie di Taylor


Tramite le possibilit` a del calcolo simbolico possiamo valutare le somme parziali della serie di Taylor di una data funzione. Per esempio con >> taylortool(atan(x)) si ottiene il disegno mostrato nella Figura 6.1. Non avendo specicato altro, MATLAB
Taylor Series Approximation 3 2 1 0 1 2 3 6 4 2 0 2 4 6

TN(x) =

x1/3 x3+1/5 x51/7 x7

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

Integrali impropri, serie ed equazioni dierenziali

>> 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

6.2 Un primo modello di crescita


Grande attenzione ` e dedicata alla soluzione di equazioni dierenziali sia dal punto numerico che dal punto di vista simbolico. Le equazioni dierenziali costituiscono infatti uno strumento importante nella modellizzazione matematica. Per laspetto simbolico ` e possibile utilizzare dsolve, per esempio >> dsolve(Dx = -a*x) ans = exp(-a*t)*C1 >> x = dsolve(Dx = -a*x,x(0) = 1) x = exp(-a*t) Dal punto di vista numerico esistono diverse funzioni perch` e vi sono dierenti dicolt` a numeriche per lapprossimazione di equazioni dierenziali (o sistemi di equazioni dierenziali). Consideriamo, per esempio, la simulazione del seguente modello di crescita tumorale     u u u (t) = 1 , dove u(t) rappresenta il numero di celle tumorali presenti al tempo t, ` e un fattore di crescita, e sono dei parametri determinati dalle caratteristiche del tumore che stiamo analizzando. Lequazione scritta si pu` o analizzare dal punto di vista analitico, vogliamo fare una simulazione numerica. Modelli simili sono importanti, una volta che si siano determinati i parametri, per simulare il comportamento del tumore nel caso di dierenti terapie. Consideriamo il caso = 0. 5, = 0. 01, = 5 e u(0) = 100. Stiamo normalizzando le quantit` a in gioco, valori realistici, per esempio per la popolazione iniziale, potrebbero essere dellordine di 1011 . Dobbiamo denire una funzione che riceva in ingresso il tempo t e il valore u e ritorni il valore della derivata prime u >> f=inline(0.02*u*(1-(u/50)^0.5),t,u) f = Inline function: f(t,u) = 0.02*u*(1-(u/50)^0.5) Con >> [t,u]=ode45(f,[0 100],100); >> plot(t,u);

Integrali impropri, serie ed equazioni dierenziali

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

Figura 6.2 Un esempio di formula di simulazione di un modello di crescita tumorale.

6.3 Sistemi e modelli


Abbiamo gi` a accennato nel paragrafo sulle equazioni dierenziali che unequazione del secondo ordine pu` o essere trasformata in un sistema di equazioni lineari. Per esempio, posto u = y , lequazione u (t) + 4u (t) + 13u(t) = 0 pu` o essere riscritta come ( u (t) = y (t) y (t) = 4y (t) 13u(t). Risolviamo il problema di Cauchy per questa equazione con u(0) = 1, u (0) = y (0) = 1. Abbiamo >> f=inline([0 1 ; -13 -4]*u,t,u); >> [t,u]=ode45(f,[0 5],[1 1]); >> plot(t,u); e il risultato ` e mostrato in Figura 6.3. Inne un esempio storico, il modello preda predatore di Lotka-Volterra. Abbiamo due specie in competizione, u1 e u2 , la cui dinamica ` e governata dal sistema ( u1 (t) = ku1 (t) au1 (t)u2 (t) u2 (t) = ru1 (t) + bu1 (t)u2 (t) dove a,b,k,r sono costanti positive. La variabile u1 rappresenta le prede mentre la variabile u2 i predatori. I termini presenti nel sistema riguardano levolversi delle due popolazioni in base ai propri tassi di accrescimento e agli eventuali incontri preda-predatore. In MATLAB ` e gi` a disponibile una funzione lotka per la simulazione di questo sistema. I parametri scelti sono k = 1, r = 1, a = 0. 01, b = 0. 02. Un esempio di simulazione ` e mostrato in Figura 6.4 e ottenuto tramite

44

Integrali impropri, serie ed equazioni dierenziali

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

Figura 6.4 Un esempio di simulazione di un sistema preda-predatore.

7
Vettori e matrici algebrici

7.1 Operazioni con matrici e vettori


Una delle caratteristiche principali di MATLAB ` e la sua abilit` a nelloperare con matrici. In Appendice B abbiamo descritto alcune di queste possibilit` a. Nel seguito vedremo alcuni semplici esempi. Inseriamo in MATLAB le seguenti matrici A e B >> A = [3 5 7 ; 9 11 15; -2 1 5] A = 3 5 7 9 11 15 -2 1 5 >> B = [1 3 ; 5 7 ; -1 0] B = 1 3 5 7 -1 0 Possiamo calcolare direttamente il prodotto 2B , AB e A3 A2 + 3I tramite le istruzioni >> 2*B ans = 2 6 10 14 -2 0 >> A*B ans = 21 44 49 104 -2 1 >>A^3-A^2+3*eye(3) ans = 514 1215 -12 >> C = A(:,1:2) C = 3 5 9 11 -2 1 1101 2596 51 1959 4599 148

Se deniamo la matrice C data dalle prime due colonne di A possiamo sommarla a B

46

Vettori e matrici algebrici

>> C+B ans = 4 14 -3

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

7.2 Alcune funzioni avanzate


Ricordiamo come tramite il Symbolic Toolbox sia possibile utilizzare anche simboli al posto di numeri. Ad esempio abbiamo >> syms a >> a*A ans = [ 3*a, 5*a, 7*a] [ 9*a, 11*a, 15*a] [ -2*a, a, 5*a] >> syms x1 x2 x3 >> x=[x1; x2; x3] x = [ x1] [ x2] [ x3] >> A*x ans = [ 3*x1+5*x2+7*x3] [ 9*x1+11*x2+15*x3] [ -2*x1+x2+5*x3] Inoltre il calcolo dellinversa pu` o essere eettuato tramite listruzione MATLAB inv. Le basi teoriche dellalgoritmo utilizzato saranno presentate nel prossimo capitolo. Abbiamo quindi >> A=[1 2; 3 4]; >> A1=inv(A) A1 = -2.0000 1.0000 1.5000 -0.5000 >> A1*A ans = 1.0000 0

Vettori e matrici algebrici

47

0.0000 >> A*A1 ans = 1.0000 0.0000

1.0000 0 1.0000

7.3 Matrici e immagini


Una delle applicazioni principali delle matrici la si deve alle immagini digitali. Unimmagine digitale infatti non ` e altro che una matrice (o pi` u matrici) nella quale ogni elemento rappresenta uninformazione sulla luminosit` a (o sul colore) della stessa. Ogni elemento della matrice viene detto pixel. In MATLAB una immagine monocromatica di m n pixels ` e memorizzata in una matrice con le medesime dimensioni, mentre una immagine a colori ` e memorizzata in una matrice multidimensionale m n 3 (ossia tramite tre matrici ognuna delle quali contiene informazioni relativamente ad una delle tre componenti di colore fondamentali: rosso, verde e blu). Vediamo un semplice esempio di immagine monocromatica. La successione di istruzioni >> colormap(gray); >> I=eye(10); >> image(255*I); realizza tramite il comando image che associa ad ogni elemento della matrice un colore limmagine nella Figura 7.1. Listruzione colormap consente di associare allimmagine

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

Vettori e matrici algebrici

7 1 2 3 4 5 6 7

7 1 2 3 4 5 6 7

Figura 7.2 Trasposizione e immagini.

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

8.1 Sistemi lineari


La risoluzione di sistemi lineari pu` o essere arontata in MATLAB in modo estremamente eciente (originariamente MATLAB ` e stato progettato proprio per svolgere questo compito). Non deve stupire quindi il fatto che MATLAB riservi addirittura uno specico operatore, indicato con \ e detto backslash, per la risoluzione di un sistema. Vediamo un esempio >> A=[1 3 2; -1 1 2; 2 4 -2]; >> b=[3;-3;10]; >> x=A\b x = 2 1 -1 Luso come si vede ` e immediato ma bisogna fare attenzione che non stiamo dividendo A per b ma stiamo risolvendo il sistema lineare Ax = b. Abbiamo gi` a osservato come il metodo di eliminazione di Gauss rappresenti un algoritmo applicabile direttamente al calcolatore. Loperatore backslash nel caso di matrici quadrate si basa su questo algoritmo. Uno degli aspetti importanti nellambito della risoluzione di un sistema lineare ` e lecienza di un metodo risolutivo, ossia quanto paghiamo in termini di costo computazionale per ottenere il risultato. Un metodo per misurare il costo computazionale ` e quello di valutare il numero di operazioni necessarie al calcolatore per ottenere la soluzione. Per leliminazione di Gauss applicata ad una matrice quadrata di dimensione n il numero di operazioni ` e n3 /3. Nel caso di sistemi inconsistenti MATLAB risolve comunque il problema approssimando la soluzione nel senso dei minimi quadrati. Parleremo di questo nel prossimo capitolo, ma ` e importante ricordare da subito che loperatore backslash fornisce sempre qualcosa che non e detto sia il risultato cercato. Per esempio >> A=[1 3 2; -1 1 2; 2 4 -2; 1 3 2]; >> b=[3;-3;10; -3]; >> x=A\b x = 0.1250 1.3750 -2.1250 >> A*x ans = -0.0000 -3.0000 10.0000

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

8.2 Determinante e inversa


Il calcolo del determinante pu` o essere eettuato tramite il comando det. Per esempio >> A=[0 1 3; 2 4 1; 1 -1 0]; >> det(A) ans = -17 Ritroviamo le regole delle diagonali per matrici 2 2 e pe rmatrici 3 3 tramite il calcolo simbolico >> syms a b c d >> A=[a b; c d]; >> det(A) ans = a*d-b*c

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

-1/8 1/2 -1/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

Figura 8.1 Interpolazione lineare a tratti e polinomiale.

54

9
Autovalori e autovettori

9.1 Calcolo di autovalori


La funzione principale per il calcolo degli autovalori in MATLAB ` e la funzione eig. Luso ` e abbastanza immediato >> A=[4 -3 1; 2 -1 1; 0 0 2]; >> eig(A) ans = 2.0000 1.0000 2.0000 Possiamo inoltre calcolare gli autovettori tramite >> [V,D]=eig(A) V = 0.8321 0.7071 0.5547 0.7071 0 0 D = 2.0000 0 0 1.0000 0 0

0.2276 0.4411 0.8681 0 0 2.0000

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)]

9.2 Fenomeni di risonanza


Una dei risvolti sici di maggior rilievo degli autovalori lo si ha nellambito dello studio delle frequenze di risonanza. Consideriamo un semplice modello di edicio a n piani rappresentato da un sistema di n masse uguali sovrapposte. Supponiamo che ogni piano sia collegato ai piani adiacenti in modo elastico. Assumiamo che ogni massa possa scivolare senza frizione e che la tendenza a conservare la congurazione iniziale sia proporzionale

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)

x (t) 0 10 20 30 40 50 tempo 60 70 80 90 100

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.

9.3 Minimi quadrati e approssimazione di funzioni


Innanzitutto osserviamo che il calcolo delle norme di vettore e di matrice ` e implementato in MATLAB tramite la funzione norm. Per esempio >> x=[1 -2 3 4 -8]; >> norm(x,1) ans = 18

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);

I risultati sono riportati nella Figura 9.2.

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

10.1 Trasformazioni lineari


Abbiamo gi` a parlato di immagini digitali e della loro rappresentazione tramite matrici. Vediamo a questo punto come sia possibile trasformare un immagine utilizzando opportune trasformazioni lineari o combinazioni di queste. In MATLAB ` e possibile disegnare a mano libera tramite il mouse una gura per punti. Per fare ci` o utilizziamo il comando ginput nella forma >>[x,y]=ginput; >> plot(x,y,o); La raccolta di punti terminer` a non appena avremo premuto il tasto Invio. In alternativa per un migliore inserimento di un numero pressato di n punti con visualizzazione dei dati si possono usare le istruzioni >> >> >> >> n=10; axis([-1 1 -1 1]) hold on for i=1:n [x(i),y(i)]=ginput(1); plot(x(i),y(i),o); end

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

Vediamo lazione delle trasformazioni lineari sul nostro disegno

62

Vettori geometrici, rette e piani

>> 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.

10.2 Graci in pi` u dimensioni


Vediamo come realizzare con MATLAB graci di funzioni di pi` u variabili. Va precisato che MATLAB fornisce numerose possibilit` a grache e che in questa sede ci limiteremo ad analizzare le principali. In modo analogo a quanto fatto in una dimensione bisogner` a

Vettori geometrici, rette e piani

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

>> >> >> >> >> >>

x=linspace(-2,2,20); y=linspace(-2,2,20); [X,Y]=meshgrid(x,y); px=X.*exp(-X.^2-Y.^2); py=-Y.*exp(-X.^2-Y.^2); quiver(X,Y,px,py)

otteniamo il graco della Figura 10.4.

64

Vettori geometrici, rette e piani

1.5

0.5

0.5

1.5

2 2

1.5

0.5

0.5

1.5

Figura 10.4 Campo vettoriale di F(x,y ) = (x exp(x2 y 2 ), y exp(x2 y 2 )).

11
Probabilit` a

11.1 Variabili aleatorie discrete


Sia X una v.a. discreta che pu` o assumere i valori 3,4,8 con probabilit` a 1/4,1/2,1/4 rispettivamente. Inseriamoli come vettori >> X = [3;4;8] X = 3 4 8 >> P=[1/4;1/2;1/4] P = 0.2500 0.5000 0.2500 Controlliamo che P possa essere una legge di probabilit` a. Possiamo vericare che non ci sono valori negativi tramite il comando find >> find( (P<0) ) ans = Empty matrix: 0-by-1 Inoltre la somma degli elementi di P deve dare 1 >> sum(P) ans = 1 Possiamo realizzare il graco a barre della distribuzione di probabilit` a con il comando bar nella forma >> bar(X,P) Sempre con il comando find possiamo calcolare P ({X > 3}). Infatti, troviamo gli indici buoni di X per cui X > 3 >> ind_buo = find( ( X > 3 ) ) ind_buo = 2 3 e quindi sommiamo le probabilit` a corrispondenti

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

xi pxi , in forma matriciale

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

11.2 Variabili aleatorie doppie X e Y


Analizziamo ora la coppia di v.a. discrete (X,Y ), dove X pu` o assumere i valori 3,4,8 e Y pu` o assumere i valori 1,0,3,4. Inseriamoli come vettori >> X = [ 3 ; 4 ; 8 ]; >> Y = [ -1 ; 0 ; 3 ; 4 ]; La legge congiunta verr` a assegnata mediante la matrice P = pij = p(X,Y ) (xi ,yj ), Inseriamo la matrice P >> P= 1/10*ones(3,4) P = 0.1000 0.1000 0.1000 0.1000 0.1000 0.1000 i = 1,2,3, j = 1,2,3,4.

0.1000 0.1000 0.1000

0.1000 0.1000 0.1000

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

Questa ` e una legge congiunta, poich e adesso

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

11.3 Catene di Markov


Nella dinamica delle catene di Markov abbiamo una matrice P , detta matrice di transizione, i cui elementi rappresentano delle probabilit` a di transizione tra diversi stati. Pi` u precisamente pij ` e la probabilit` a condizionata che il sistema si trovi domani nello stato j essendo oggi nello stato i. La somma di ogni riga di P ` e uguale ad 1. Indicato con p0 il vettore iniziale di probabilit` a degli stati si ` e interessati a sapere cosa succede al variare di n al vettore pn denito come
n pn+1 = P pn = P P | {z } p0 = P p0 , n volte

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

Figura 11.2 Comportamento delle componenti del vettore pn per n = 1, . . . ,50.

12
Modelli probabilistici

12.1 Generazione di leggi discrete


Generiamo una matrice di v.a. con legge di Bernoulli si parametro 1/4 >> A =(rand(3,4)>.75) A = 1 0 0 0 1 1 0 1 0

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

12.2 Generazione di leggi continue


Digitiamo ora >> X = -log(rand(1,1))/2 X = 0.2558 Avremo che X > t se e solo se ossia se, log(rand(1,1)) >t 2

rand(1,1) < e2t .

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

>> N = 3 + sqrt(5)*A N = 1.6845 7.8818

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

Figura 12.1 Graco della funzione .

13
Campionamento statistico e descrizione dei dati

13.1 Indici descrittivi e istogrammi


Carichiamo in un vettore A i dati dellEsempio 13.7 e calcoliamo qualche indice descrittivo tramite i comandi mean, var, std e median. >> A = [1.67 1.61 1.84 1.73 1.6 1.79 1.8 1.84 1.86 ... 1.71 1.77 1.8 1.9 1.94 1.77 1.85 1.84 1.88 1.7 1.91]; >> mean(A) %media ans = 1.7905 >> var(A) %varianza ans = 0.0092 >> std(A) %dev. standard ( =sqrt(var(A)) ) ans = 0.0960 >> median(A) %mediana ans = 1.8000 La funzione MATLAB hist(x,N) consente di realizzare listogramma di frequenza di x suddividendo lintervallo [min(X ), max(X )] in N sottointervalli (barre) di uguale ampiezza e calcolando quanti valori di x cadono in un dato intervallo. >> hist(A,8) MATLAB ha una sua formula per calcolare gli estremi delle barre. Per selezionare gli estremi delle barre, occorre utilizzare la funzione histc(X,Y), dove X ` e il vettore dei dati eY ` e il vettore con gli estremi delle barre. La funzione histc non disegna il graco, ma restituisce laltezza delle barre i cui estremi sono nel vettore Y . >> Y = [1.60:0.05:2.00]; >> alt= histc(A,Y) alt = 2 2 2 3 >> bar(Y,alt,histc)

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

Campionamento statistico e descrizione dei dati

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

13.2 Retta dei minimi quadrati


X Y Inseriamo i dati dellEsempio 13.8 e calcoliamo Mn , Mn , SX e SY .

>> 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.

Campionamento statistico e descrizione dei dati

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

13.3 Distribuzione statistica


Vediamo ora una simulazione per mostrare il Teorema 13.4. Simuliamo quindi molti dati (n = 10000) di una distribuzione gaussiana standard e vediamo se F (2) approssima bene P ({X 2}) = (2) 0. 9772. >> X=randn(10000,1); >> F_2= sum( ( X <=2 ) )/10000 F_2 = 0.9763 Loperatore logico ( X <=2 ) restituisce 1 se gli elementi sono minori o uguali a 2, 0 altrimenti. La loro somma sum conta quindi quanti elementi nelle colonne di X sono minori o uguali a 2. Ripetendo lesperimento con 4 simulazioni. >> X=randn(10000,4); >> F_2= sum( ( X <=2 ) )/10000 F_2 = 0.9787 0.9766 0.9765 0.9755 >> Phi_2=1/2 + 1/2 * erf( 2/sqrt(2) ); %Phi(2) (vedere Capitolo 12) >> F_2/Phi_2 %rapporto valore stimato/valore vero ans = 1.0015 0.9993 0.9992 0.9982

13.4 Generatori di numeri casuali


Il problema della generazione di sequenze di numeri pseudo-casuali distribuiti uniformemente al calcolatore ` e un problema estremamente complesso e aascinante. Ricordiamo che nella distribuzione uniforme ogni possibile numero in un determinato intervallo ` e ugualmente probabile (ad esempio il lancio di un dado genera una sequenza di numeri

78

Campionamento statistico e descrizione dei dati

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.

Campionamento statistico e descrizione dei dati

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

14.1 Intervalli di condenza


Costruiamo un intervallo di condenza per la media e per la varianza di un numero molto alto (n = 1000) di simulazioni di una X U (0,1). Le nostre simulazioni vengono raccolte nel vettore A. >> A=rand(1000,1); Avremo, per esempio, che le osservazioni tra la 45-esima e la 50-esima saranno >> A(45:50) ans = 0.7266

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

Metodi statistici inferenziali

>> >> >> ES

MA=mean(A); SA=std(A); ES=MA-1.96*SA/sqrt(1000) = 0.4942 >> ED=MA+1.96*SA/sqrt(1000) ED = 0.5295

%estremo sinistro intervallo %estremo destro intervallo

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.

14.2 Test dipotesi


Utilizziamo gli stessi dati per un test di adattamento alla legge uniforme, ossia controlliamo se il simulatore di MATLAB ` e uniforme, come dichiara. Dividiamo lintervallo [0,1]

Metodi statistici inferenziali

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

Metodi statistici inferenziali

35.0000 62.5000 27.5000

35.0000 62.5000 27.5000

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

catene di Markov, 69 frequenze naturali, 56 istogramma di frequenza, 75 leggi di Keplero, 25

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

Potrebbero piacerti anche