250 likes | 366 Views
Diagrammi 2D e 3D Funzioni di ordine superiore. Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 13 Agosto 2014. Obiettivi. Diagrammi 2D e 3D Funzioni di ordine superiore. Diagrammi 2D. Diagramma = insieme di coppie rappresentanti le coordinate dei suoi punti
E N D
Diagrammi 2D e 3DFunzioni di ordine superiore Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 13 Agosto 2014
Obiettivi • Diagrammi 2D e 3D • Funzioni di ordine superiore
Diagrammi 2D • Diagramma = insieme di coppie rappresentanti le coordinate dei suoi punti • Si usano vettori per contenere sequenze ordinate dei valori di ognuna delle coordinate • plot(x,y) disegna diagramma cartesiano dei punti che hanno • valori delle ascisse in x, delle ordinate in y • e li congiunge con una linea, per dare continuità al grafico • funzioni xlabel per visualizzare nome asse ascisse, ylabel per ordinate, title per il titolo
Diagrammi 2D: 1mo esempio >> x = -10:0.1:10; >> y=x.^3; >> plot(x,y); >> xlabel('ascisse'); >> ylabel('ordinate'); >> title('cubica');
Diaggrami 2D: 2do esempio >> x=[-8:0.1:8]; >> y= sin (x) ./ x; >> plot(x, y); >> xlabel('ascisse'); >> ylabel('ordinate');
Particolarità • plot(x,y) • x non contiene necessariamente un intervallo lineare uniforme di valori • y non è necessariamente funzione di x • Sia x sia y possono essere funzioni di qualche altro parametro
Particolarità: esempio 1 >> t=[0:pi/100:2*pi]; >> x=cos(t); >> y=sin(t); >> plot(x,y); >> xlabel('ascisse-x'); >> ylabel('ordinate-y');
Particolarità: esempio 2 >> t=[0:pi/100:10*pi]; >> x=t .* cos(t); >> y=t .* sin(t); >> plot(x,y); >> xlabel('ascisse-x'); >> ylabel('ordinate-y'); 10*pi 5 giri t10*pi dist.max da origine 31,4
Diagrammi lineare a 3 dimensioni • Generalizzazione di quello a due: insieme di terne etc… • plot3(x,y,z) per digramma cartesiano con x ascisse, y ordinate, z quote • funzioni xlabel, ylabel, zlabel, title … >> t = 0:0.1:10*pi; >> plot3 (t.*sin(t), t.*cos(t), t); >> xlabel('ascisse'); >> ylabel('ordinate'); >> zlabel('quote');
Diagrammi lineare a 3 dimensioni: funzione di mesh • Funzione reale di due variabili reali z = f (x, y) • rappresentata in uno spazio cartesiano tridimensionale è una superficie • funzione mesh genera superficie, a partire da tre argomenti: matrici xx, yy, zz che contengono ascissa (valore di x), ordinata (y) e quota (z) • per ogni punto di una griglia corrispondente a un rettangolo del piano xy • ll rettangolo è identificato dalla coppia di matrici xx e yy • Le due matrici, xx, e yy, si ottengono, mediante la funzione meshgrid(x,y), a partire da vettori, x e y, che contengono i valori delle ascisse e delle ordinate • il rettangolo nel piano è determinato da x e y • l’insieme delle coordinate dei suoi punti è il prodotto cartesiano di x e y
meshgrid: come funziona • A partire da vettori, x e y, che contengono i valori delle ascisse e delle ordinate [xx,yy]=meshgrid(x,y) • genera due matrici entrambe di legth(y) righe × length(x) colonne • la prima, xx, contiene, ripetuti in ogni riga, i valori di x • la seconda, yy, contiene, ripetuti in ogni colonna, i valori di y’ (y trasposta)
meshgrid: un esempio • funzionez = x + y • grafico in 6 punti di ascisse {1, 3, 5} e ordinate {2, 4} >> x=[1, 3, 5]; >> y=[2, 4]; >> [xx,yy]=meshgrid(x,y); >> zz=xx+yy; >> mesh(xx,yy,zz); >> xlabel('ascisse-x'); >> ylabel('ordinate-y'); >> xx xx = 1 3 5 1 3 5 >> yy yy = 2 2 2 4 4 4 Punti di coordinate (x,y)… (1,2) (3,2) (5,2) (1,4) (3,4) (5,4) >> zz zz = 3 5 7 5 7 9 …hanno coordinate (x,y,z) (1,2,3) (3,2,5) (5,2,7) (1,4,5) (3,4,7) (5,4,9) (NB: z=x+y)
Vantaggi • Il vettore con le z ottenuto con espressione uguale alla forma algebrica della funzione • I vettori x e y da dare in pasto a meshgrid non si producono “a mano” • si ottengono con costrutto [vmin : : vmax] o altri simili… • tipicamente si adotta una spaziatura uniforme tra i valori • attenzione a non usare valore troppo piccolo, altrimenti memoria insuffciente…
meshgrid: un secondo esempio >> x=[1:1:3]; >> y=x; >> [xx,yy]=meshgrid(x,y); >> zz=xx+yy; >> mesh(xx,yy,zz); >> xlabel('x'); >> ylabel('y'); >> zlabel('z');
meshgrid: un paraboloide >> x=[-4:0.05:4]; >> y=x; >> [xx,yy]=meshgrid(x,y); >> zz=xx .^ 2 + yy .^ 2; >> mesh(xx,yy,zz); >> xlabel('ascisse-x'); >> ylabel('ordinate-y'); >> zlabel('quote-z');
meshgrid: il Sombrero! >> tx=[-8:0.1:8]; >> ty=tx; >> [xx, yy] = meshgrid (tx, ty); >> r = sqrt (xx .^ 2 + yy .^ 2); >> tz = sin (r) ./ r; >> mesh (tx, ty, tz); >> xlabel('ascisse'); >> ylabel('ordinate'); >> zlabel('quote');
Pausa 15’… non di più! :)
Variabili e funzioni di ordine superiore • Versioni recenti di Matlab definiscono in modo pieno il tipo “funzione”, permettendo di • assegnare a variabili valori di tipo “funzione” • definire funzioni che ricevono parametri di tipo “funzione” • Cosa si può fare con un valore di tipo funzione? • assegnarlo a una variabile (quindi passarlo come parametro) • applicarlo a opportuni argomenti: si ottiene una invocazione della funzione
handle: esempi • Valori di tipo funzione denotati da variabili dette handle (riferimento / maniglia) • A una handle possono essere assegnati valori di tipo funzione in due modi • indicando il nome di una funzione esistente (definita dall’utente o predefinita) • mediante la definizione ex novo di una funzione anonima
handle (1) • Indicando il nome di una funzione esistente (definita dall’utente o predefinita) • È semplice: nome della funzione (posto dopo ‘@’) denota la funzione stessa >> seno=@sin seno = @sin >> seno(pi/2) ans = 1 >> f=@fact f = @fact >> f(4) ans = 24
handle (2) • Mediante la definizione ex novo di una funzione anonima • Espressione di tipo funzione: • simbolo @ • lista dei parametri di ingresso, tra parentesi tonde • espressione che dà il risultato come funzione degli ingressi >> sq=@(x)x^2 sq = @(x)x^2 >> sq(8) ans = 64
Funzioni di ordine superiore • Se il parametro attuale di una funzione F è di tipo funzione allora il parametro formale f • è una handle • può essere usato per invocare la funzione passata tramite il parametro • La funzione F è una funzione di ordine superiore • È possibile realizzare funzioni di ordine superiore per realizzare funzioni • parametriche rispetto a un’operazione • rappresentata a sua volta da una funzione
Esempio di funzione di ordine superiore • funzione di ordine superiore maxDiFunzione • Riceve come parametri • f funzione di una variabile reale • gli estremi a e b di un intervallo • valore d (da usare come passo di incremento) • Trova il valore massimo M e la sua ascissa (approssimati) della funzione f in [a..b] • applicandola in tutti i punti tra a e b, con un intervallo di scansione d
maxDiFunzione function [M,xM]=maxDiFunzione(f, a, b, d) xM=a; M=f(xM); for x = a+d:d:b if f(x)>M xM=x; M=f(x); end; end; end >> f=@(x)x^3-3*x; >> maxDiFunzione(f, -2, 2, 0.01) ans = 2
Fonti per lo studio + Credits • Fonti per lo studio • Introduzioneallaprogrammazione in MATLAB, A.Campi, E.Di Nitto, D.Loiacono, A.Morzenti, P.Spoletini, Ed.Esculapio • Capitolo4 • Credits • Prof. A. Morzenti