La grafica. Il Matlab possiede un ambiente grafico abbastanza

Transcript

La grafica. Il Matlab possiede un ambiente grafico abbastanza
La grafica.
Il Matlab possiede un ambiente grafico abbastanza potente paragonabile a software grafici
operanti in altri contesti. In questo corso ci limiteremo ad illustrare solo una funzione grafica, per
visualizzare grafici di una o più funzioni di una sola variabile.
La built-in funzione grafica plot.
Siano assegnati due vettori reali x e y di uguale lunghezza. Allora la funzione plot con
argomenti nell’ordine x e y, congiunge con un segmento (x1, y1) e (x2, y2), (x2, y2) e (x3, y3), (x3, y3)
e (x4, y4)…(xn-1, yn-1) e (xn, yn), se n è la dimensione comune dei due vettori.
Ne risulta una spezzata cioè una figura composta da tratti lineari. Se x1 < x2 <….xn, la figura è il
grafico di una funzione poligonale.
La sintassi del comando è
>>plot(x,y)
Viene attivata la pagina grafica con la figura prodotta dal comando.
Il Matlab inquadra la figura in un rettangolo in cui si vedono anche opportune tacche sul’asse delle
ascisse e l’asse delle ordinate. Questo per una ottima visibilità dell’immagine. Naturalmente
esistono comandi per cambiare a desiderio dell’utente l’inquadramento del disegno ( comandi del
tipo axes) ma per gli scopi che ci proponiamo non discuteremo di queste possibilità.
Se si è interessati a tutte le possibilità grafiche rimandiamo alla consultazione di manuali appositi
associati alla licenza in uso.
Per esempio, sia
>>x=[-1 0 2];y=[0 1 4];
>>plot(x,y)
Il Matlab ha deciso di inquadrare la figura tra le rette
x=-1, x=2, y=0, y=4, e ha diviso ogni lato del rettangolo in punti equidistanziati con ampiezza ½. Il
punto ( -1 0) è collegato con un tratto di retta al punto (0,1) e queste è collegato con un tratto di retta
al punto (2,4).
Che cosa succede se il vettore x ha componenti x1 <x2<…xn, con xi+1-xi, molto piccole, per ogni i ?.
L’occhio dell’uomo non è in grado di distinguere i tratti lineari tra una coppia (xi,yi) e la successiva
(xi+1, yi+1). Ne segue che si ha l’immagine di una curva continua, e possiamo approfittare per
disegnare grafici di funzioni.
Per esempio,se vogliamo il grafico della funzione seno in [0 π/2], possiamo operare in questo modo
>>x=0:.00001:pi/2;
>>plot(x,sin(x))
L’intervallo [0 π/2] viene, col primo comando, discretizzato in punti di ampiezza 10-4, e sin(x) è un
vettore con le stesse componenti di x
Si raccomanda di mettere il punto e virgola dopo ogni operazione di discretizzazione, per non
visualizzare tutte le componenti del vettore creato.
Tracciamo, ora, il grafico della funzione f(x) = 1/(1+x2), in [ -1 1].
>>x=0:.0001:1;
>>plot(x,1./(1+x.*x))
Da notare che 1./ fa la divisione di 1 per ogni elemento del denominatore. Poi, x.*x moltiplica
elemento per elemento x per x. Si viene così a creare il vettore delle ordinate, di lunghezza uguale a
quello delle ascisse.
Il Matlab ha deciso di inquadrare la figura tra le rette x = 0 e x =1, y = ½, e y=1. Due lati paralleli
sono divisi in parti di ampiezza 1/10, e gli altri due lati paralleli sono divisi in parti di ampiezza
1/20.
Col comando
>>clf
si cancella la figura attuale nella pagina grafica. Ma, ogni volta che si traccia un nuovo grafico,
viene cancellato quello esistente. Per evitare questo basta digitate il comando
>>hold on
In questo caso il nuovo grafico viene messo nello stesso rettangolo di quello precedente senza
cancellare quest’ultimo. Col comando
>>hold off
si ritorna alla situazione standard.
Per tracciare su una stessa pagina più grafici è possibile non cambiare lo stato di >>hold off, ma
creare direttamente tutti i grafici con un solo comando. Basta eseguire un comando del tipo
>>plot(x,y,w,z,u,v….)
Allora viene tracciato il grafico prodotto dalla prima coppia (x,y), poi quello relativo alla seconda
coppia (w,z), quello relativo alla terza coppia (u,v), ecc.
Per esempio tracciamo il grafico di seno e coseno nell’intervallo [0 π ].
>>x=0:.0001:pi
>>plot(x,sin(x),x,cos(x))
Per esempio tracciamo il grafico di seno e coseno nell’intervallo [0 π ].
>>x=0:.0001:pi
>>plot(x,sin(x),x,cos(x))
Esiste poi la possibilità di dare un titolo alla figura, scrivere righe di testo in zone della figura,
colorare diversamente i grafici, ecc. Per chi è interessato basta digitare
>>help plot
o consultare i manuali.
La curva di Gauss
Esiste una funzione che gioca un ruolo fondamentale in chimica, fisica, biologia, scienze
economiche, ecc., sia negli aspetti teorici che in quelli più applicativi. Questa funzione nasce
nell’ambito della Probabilità e Statistica, nella quale trae significato, e va sotto il nome di curva o
campana di Gauss, ma in linguaggio scientifico più rigoroso è la distribuzione normale standard.
Si tratta della funzione
1  x2 / 2
f ( x) 
e
,   x  
2
Questa funzione è una funzione pari, vale a dire
f(x) = f(-x),
per ogni x, positiva e di integrale uguale uno ( esteso a tutto l’asse reale). Però, decade rapidamente
a zero ( per la presenza di –x2/2 come argomento dell’esponenziale), quando ci allontaniamo
dall’origina, per cui è sufficiente studiarla nell’ intervallo [-4 4].
Tracciamo il suo grafico.
>>x=-4:.00001:4;
plot(x,exp(-x.*x/2)/sqrt(2*pi))
La distribuzione normale standard è un caso particolare della distribuzione normale. Nella prima la
media è zero e la deviazione standard è uno. In generale la media può essere un reale μ qualsiasi e la
deviazione standard può essere un reale positivo σ qualsiasi.
In questo caso la distribuzione diventa
1 x
f ( x) 
exp(  
 )
2  
 2
sempre in tutto l’asse reale. In realtà la funzione decade rapidamente quando ci allontaniamo dalle
media μ, ed è sufficiente considerare la funzione nell’intervallo
[μ-4 σ, μ-4 σ,]
Tracciamo il grafico con media 2 e deviazione standard 1.5.
>>mu=2;sigma=1.5;
>>x=mu-4*sigma:.0001:mu+4*sigma;
>>a=sqrt(2*pi)*sigma;
>>y=(x-mu)/sigma ;y=exp(-y.*y/2);y=y/a ;
plot(x,y)
1
2
In ogni caso il ruolo della distribuzione normale standard è sempre fondamentale, perché tutti
calcoli relativi ad una tale distribuzione si possono eseguire riportandosi al caso standard.
Altri esempi.
Consideriamo alcune funzioni positive in un certo intervallo [ a b] e vediamo graficamente
come viene approssimata l’area del rettangoloide
a≤x≤b
0 ≤ y ≤ f(x)
Per esempio la funzione f(x) = sin(exp(x)) è positiva e convessa in [ 0 1]. Per tracciarne il grafico
discretizziamo l’intervallo [ 0 1] con un passo 10-6. Cioè formiamo il vettore
>> x=0:1e-06:1;
Quindi il vettore
>> y=sin(exp(x));
Poi
>> plot(x,y)
Senza formare il vettore y si poteva dare il commando
>> plot(x,sin(exp(x))
1
0.9
0.8
0.7
0.6
0.5
0.4
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Il Matlab ha deciso di inquadrare il grafico della funzione tra le rette y = 0.4 e y =1 e x = e x = 1.
Questo perché il minimo di f è sin(e) = .4108 e il massimo è uno. L’area del rettangoloide è l’area
compresa tra il grafico e la retta x = .4 a cui aggiungere 1 .4 = .4. Pare che la funzione sia
concava. Con opportuni comandi axes si può inquadrare la figura in modo differente.
Ora per visualizzare il comportamento della formula composta del trapezio dividiamo in cinque
parti uguali l’intervallo [ 0 1]. Il passo sia
>> h=1/5
h=
0.2000
Quindi i nodi sono
>> x=0+h*(0:5)
x=
0
0.2000
0.4000
0.6000
0.8000
1.0000
In realtà si poteva calcolare >> x = h*(1:5) e quindi concatenare orizzontalmente 0 a x.
In generale per dividere un intervallo in n parti uguali, si calcola il passo >> h = (b-a)/n; Poi >> x =
a+h*(0:n). Naturalmente occorre avere nel workspace a, b, n. Altrimenti se, per esempio, a = -3, b=
2, n = 20, si digita il comando >> h=(2 –(-3))/20, x = -2+h*(0:20), ecc.
Per evitare due moltiplicazioni e due addizioni si può anche dare il comando >> x = a+h*(1:n-1), e
poi l’altro >> x=[a x b]. Allora
>> hold on
>> y = sin(exp(x);
>> plot(x,y)
1
0.9
0.8
0.7
0.6
0.5
0.4
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
L’approssimazione è per difetto.
Sia, infine, f(x) = log(1+exp(x2)) in [ 0 1]. Per tracciare il grafico di questa funzione in [ 0 1 ]
abbiamo già la discretizzazione di tale intervallo. Il nuovo vettore y è
>> y = log(1+exp(x.*x));
Quindi
>> plot(x,y)
1.4
1.3
1.2
1.1
1
0.9
0.8
0.7
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
La funzione pare convessa. Dividiamo in cinque parti uguali l’intervallo [ 0 1 ]
>> x=h*(0:5)
x=
0 0.2000 0.4000
>>y=log(1+exp(x.*x));
>>plot(x,y)
0.6000
0.8000
1.0000
1.4
1.3
1.2
1.1
1
0.9
0.8
0.7
0
L’approssimazione è per eccesso.
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1