Plotting

Tracciamento del diagramma di funzioni

>> x=linspace(0,100,512);
>> plot(x,sqrt(x))

Mostra il diagramma

Ma la funzione plot può tracciare più di una funzione alla volta

>> x=linspace(0,2*pi,100)';
>> s=[sin(x) sin(2*x) sin(3*x) cos(x) cos(2*x) cos(3*x)];
>> plot(x,s)

Notare che linspace viene trasposta con l'operatore x in un vettore. Quindi le funzioni sin sono tutti vettori e vanno a comporre una matrice, la funzione plot lavora per colonne e traccia la tutte le colonne della matrice s

Qual'è la dimensione della matrice? Usate la funzione size e interpretate la risposta

plot(x,s) funziona anche se il primo argomento x è una matrice di uguale dimensione di s. Anche in questo caso plot lavora 'per colonne' disegnando il grafico prendendo i punti da ogni colonna corrispondente. Costruite una matrice
xm=[cos(3*x+alfa) cos(x+alfa) cos(2*x+alfa)...
sin(3*x+alfa) sin(x+alfa) sin(2*x+alfa)]
scegliendo un valore per alfa tracciate
plot(xm,s)
Il risultato sono alcune figure di Lissajou.

Plot 3D

Il plot in 3 dimensioni richiede che si costruisca un dataset costituito da terne di coordinate nello spazio cartesiano 3-dimensionale.

Il tracciamento di superfici è un caso importante di plot 3D nella nostra prospettiva perchè un immagine è costruita da punti luminosi (pixel) rappresentati secondo il modello RGB o grayscale . Un immagine è quindi una sorta di rappresentazione del valore di una funzione che dipende dalle coordinate dei pixel (u,v) dell'immagine.

In analogia a quanto mostrato per il caso del diagramma 2-D costruiamo delle superfici d'esempio a partire da espressioni analitiche per poter chiarire il ruolo delle funzioni che intervengono nel plotting 3-dimensionale

Le operazioni necessarie sono nella costruzione di 2 matrici con la funzione meshgrid

  • La prima contiene il valore di X per ogni punto da tracciare
  • La seconda contiene il valore di Y per ogni punto da tracciare

Prendiamo il caso di tracciare la funzione x2 +y2 per i valori di x e y nella porzione di piano [-1...1,-1...1]

>> x=linspace(-1,1,100); y = x;
>> [xx,yy]=meshgrid(x,y);

Usiamo quindi l'operatore di prodotto elemento per elemento di 2 matrici e calcoliamo il valore della superficie (asse z )

>> z=(xx.*xx + yy.*yy);

Infine combiniamo tra loro queste matrici per tracciare la superficie

>> mesh(xx,yy,z)

Oppure

>> surf(xx,yy,z)

sapreste prevedere il valore contenuto nelle matrici xx e yy ? Stampando il valore di queste matrici ne sapete interpretare il significato? E' possibile costruirle in altro modo?

Eseguite questo esercizio per la funzione

$$ e^{\frac{-(x^2+y^2)}{d}} \cdot cos(2 \pi \omega \cdot (x^2+y^2))$$

assegnando a omega e d valori di volta in volta diversi (suggerimento: partite con i valori omega=2 e d=0.5 per poi cambiarli). Prestate attenzione al significato e alla rappresentazione degli elementi e operazioni che compaiono nell'espressione data. Il risultato dovrebbe essere come quello raffigurato qui a fianco. E' in generale utile esaminare separatamente le due funzioni che vengono moltiplicate tra loro e comunque è importante:
  • Prestare attenzione alla priorità degli operatori
  • Nel caso si debba modificare la priorità degli operatori e raggruppare tra loro termini si deve osservare il bilanciamento delle parentesi. Comunque sia il numero di parentesi aperte deve sempre essere uguali alle parentesi chiuse presenti nell'espressione.
  • Considerare se una funzione o operatore si applica elemento per elemento
  • Se ci sono espressioni ricorrenti o speciali è utile calcolarle separatemente e memorizzarle in una matrice separata. In questo caso può essere utile salvare in una matrice l'espressione \(x^2+y^2\) che appare in 2 punti. Questo aiuta a ridurre gli errori e rende i comandi più leggibili

Cambiando i valori di d e omega cambiano il numero sombrero.png di oscillazioni e la loro distribuzione. E' importante notare il rapporto tra il valore dei parametri che controllano la superficie e il dominio della superficie le cui coordinate sono memorizzate nelle matrici xx e yy . Si può cambiare la dimensione della matrice aumentando il numero di righe e colonne variando il valore del terzo parametro della funzione linspace : la matrice avrà una dimensione diversa, ma l'output manterrà lo stesso aspetto

Plot di una superficie come immagine

Suppomiamo di memorizzare la superficie nella variabile zz . Un'immagine a scala di grigi è rappresentabile come superficie e viceversa. Una volta osservato l'aspetto della superficie di prova dovrebbe essere naturale intepretare l'output del comando imshow applicato alla matrice zz . Prima di tutto però questa matrice va riadattata in modo che i valori contenuti possano essere interpretati come un'immagine grayscale . Per praticità prendiamo un'immagine a scala di grigi come una distribuzione bidimensionale di valori compresi nell'intervallo [0,1] . Octave offre la funzione mat2gray che converte una matrice data in una nuova matrice i cui valori sono compresi tra 0 e 1 (se non viene specificato un intevallo tramite il secondo argomento), fissando a zero il valore minimo della matrice ad uno il valore massimo e calcolando i nuovi valori intermedi mantenendo la proporzionalità delle differenze rispetto al minimo.

I valori minimo e massimo nella matrice zz sono

>> min(min(zz))
ans = -0.61422
>> max(max(zz))
ans =  0.99959

Una volta convertita in un'immagine grayscale

>> zz=mat2gray(zz);
>> min(min(zz))
ans = 0
>> max(max(zz))
ans =  1