matlab3
Transcript
matlab3
Corso di Laurea in Ingegneria Meccanica Trasmissione del calore con applicazioni numeriche: informatica applicata a.a.. 15/16 a.a Parte III Prof. Nicola Forgione Dipartimento di Ingegneria Civile e Industriale E-mail: [email protected] [email protected];; tel. 0502218057 Input ed output • La funzione input mostra un messaggio e permette di leggere il valore di una variabile (array array)) da tastiera tastiera:: var = input('Inserire il numero di iterazioni iterazioni: : ') '); ; Per la sola lettura di una stringa di caratteri si pone invece invece:: cha = input( input('What 'What is your name', name','s') 's'); ; La stringa di messaggio può contenere uno o più sequenze di escape '\n' che consente di saltare alla linea successiva successiva.. • Per generare un menu di scelte per l'input dell'utilizzatore si può impiegare la funzione:: funzione k = menu(' menu('mtitle mtitle','opt ','opt1 1','opt ','opt2 2', ',... ...,'optn') ,'optn'); ; che visualizza un menu il cui titolo è definito dalla variabile stringa 'mtitle mtitle' ' e le cui scelte sono le variabili stringhe 'opt 'opt1 1', 'opt 'opt2 2', …. Il valore scelto dall'utilizzatore viene assegnato alla variabile k. • Per visualizzare stringhe (messaggi) oppure array si adopera la funzione disp disp:: disp('Premere disp ('Premere un tasto'); • La funzione error quando viene eseguita mostra un messaggio di errore ed interrompe l'esecuzione di un file file..m: error('A error ('A deve essere invertibile') invertibile'); ; Apertura e chiusura di file • La prima operazione da eseguire prima di poter scrivere o leggere da file è l'apertura l' apertura del file file:: fid = fopen fopen( (filename filename, ,permission permission); ); La funzione fopen apre il file di nome filename nella modalità specificata da permission.. permission • L'operazione di apertura serve ad associare un identificator identificatoree (scalare intero intero:: fid fid)) al file di nome filename filename.. Dopo che il file è stato aperto, il programmatore dovrà utilizzare l'identificatore fid per poter scrivere e/o leggere le informazioni memorizzate al suo interno interno.. • La modalità di apertura del file è specificata da permission che può assumere i valori riportati nella tabella successiva successiva.. • Dopo avere terminato le operazioni di lettura e/o scrittura è necessario eseguire l'operazione di chiusura del file file:: fclose( fclose (fid fid); ); a = -3; b = 2; c = a*b a*b; ; fid = fopen fopen(' ('prova.txt prova.txt', ', 'w'); fprintf( fprintf (fid fid,'a ,'a = %5.2f b = %5.2f c = %5.2f \n',a,b,c); fclose( fclose (fid fid); ); Apertura e chiusura di file Modalità Descrizione 'r' sola lettura - sul file sarà possibile eseguire soltanto operazioni di lettura e quindi non sarà possibile effettuarvi la scrittura scrittura.. Se il file non esiste la funzione fopen ritornerà il codice di errore NULL NULL.. 'w' sola scrittura - sul file sarà possibile eseguire solamente operazioni di scrittura, quindi non operazioni di lettura lettura.. Se il file al momento dell'apertura non esiste sarà automaticamente creato, in caso contrario il contenuto del file preesistente sarà perso.. perso 'a' solo scrittura a fine file sul file sarà possibile eseguire soltanto operazioni di scrittura a fine file file:: tutte le scritture verranno sempre eseguite in coda al contenuto attuale del file file.. Se il file non esiste verrà creato automaticamente, in caso contrario il contenuto del file preesistente verrà mantenuto mantenuto.. 'r+' lettura e scrittura sul file sarà possibile eseguire operazioni sia di lettura sia di scrittura.. Se il file non esiste, la funzione fopen ritornerà il codice di errore NULL scrittura NULL.. 'w+' scrittura e lettura - sul file sarà possibile eseguire operazioni sia di scrittura sia di lettura.. Se il file non esiste verrà automaticamente creato, in caso contrario il lettura contenuto del file preesistente verrà perso perso.. 'a+' lettura e scrittura a fine file - sul file sarà possibile eseguire operazioni sia di lettura sia di scrittura a fine file file.. Se il file non esiste verrà automaticamente creato, in caso contrario il contenuto del file preesistente verrà mantenuto mantenuto.. Scrittura formattata su file • Per scrivere su un file in modo formattato si usa la funzione fprintf fprintf:: fprintf( fprintf (fid fid,format,A, ,format,A, …); dove fid è l' l'identificatore identificatore del file che viene passato da fopen (esso può inoltre essere 1 per lo “standard output” (il monitor)) monitor));; se fid viene omesso allora viene assunto automaticamente uguale ad 1 e la stampa avviene sulla command window window.. • L'argomento format è una stringa di formato contenente contenente:: sequenze di caratteri da stampare sul file (opzionale), delle specifiche di conversione in linguaggio C e delle sequenze di escape (opzionali) (opzionali).. • Le specifiche di conversione controllano il tipo di notazione notazione,, l' l'allineamento allineamento,, le cifre significative,, l' significative l'ampiezza ampiezza del campo campo,, ed altre caratteristiche del formato di output output.. • Le specifiche di conversione iniziano con il caratttere % e contengono i seguenti elementi obbligatori ed opzionali opzionali:: flags (opzionale) (opzionale);; width and precision fields (opzionale);; a subtype specifier (opzionale) (opzionale) (opzionale);; conversion character (obbligatorio) (obbligatorio).. Questi elementi devono essere specificati nel seguente ordine ordine:: Specifiche di conversione Scrittura formattata su file • Conversion character Specificatore Descrizione %c Carattere singolo %d Notazione intera decimale con segno %e Notazione esponenziale (usando una e come in 3.1415e+00) %E Notazione esponenziale (usando una E come in 3.1415E+00) %f Notazione decimale secondo il formato [-]mmm ]mmm..nnnn dove la lunghezza della stringa di n è specificata dalla precisione %g Stampa la rappresentazione più breve tra %f e %e, eliminando eventualmente gli zeri non significativi %G Lo stesso di %g, ma usando la lettera maiuscola E al posto di e %s Stringa di caratteri %x Notazione esadecimale (usando lettere minuscole aa-f) %X Notazione esadecimale (usando lettere maiuscole AA-F) • Flags Si può controllare l'allineamento dell'output usando uno di questi optional flags flags:: un segno meno (-) significa che il numero verrà scritto allineato a sinistra sinistra;; un segno più (+) significa che il numero verrà stampato con il segno (+ o -). Scrittura formattata su file o su stringa • La stringa di formato può contenere alcune sequenze di caratteri di escape (dette sequenze di escape escape)) che non verranno visualizzate esattamente così come sono scritte poiché hanno lo scopo di formattare il testo testo.. Tali sequenze iniziano con il simbolo \ (backslash) (backslash).. Esempi di sequenze di escape sono sono:: \b ritorna di un carattere indietro (backspace) \n va a capo linea \t tabulazione orizzontale \\ stampa il carattere \ \" stampa il carattere " %% stampa il carattere % • Per scrivere dati formattati su una stringa si usa la funzione sprintf sprintf:: s = sprintf sprintf(format,A,…) (format,A,…) dove A è la matrice contenente i dati il cui formato è specificato da format format.. Esempio: a = -3/2; disp( disp (sprintf sprintf('a ('a = %5.2f \n',a)) n',a)); ; l’istruzione precedente è equivalente a: fprintf('a fprintf ('a = %5.2f \n',a) Lettura formattata da file o da stringa • Per leggere da un file in modo formattato si usa la funzione fscanf fscanf:: A = fscanf fscanf( (fid fid,format, ,format,size size); ); dove fid è l'identificatore del file su cui leggere i dati dati.. La funzione fscanf legge tutti i dati dal file specificato dall'identificatore fid fid,, li converte in accordo al formato di stringa specificato in format e immagazzina questi dati nella matrice A. • size può essere essere:: legge al più n elementi all'interno di un vettore colonna colonna;; legge fino alla fine del file, fornendo in un vettore colonna contenente gli stessi numeri di elementi che si trovano sul file file;; [m,n] legge una quantità di elementi sufficienti a riempire una matrice mxn, riempendo la matrice per colonne colonne;; n può essere inf inf,, mentre m no no.. n inf • Il format contiene la specifica di conversione conversione;; generalmente in questo caso viene utilizzato il solo carattere di conversione (ad es es.. %f) anche se può essere inoltre specificato la massima ampiezza del campo campo.. • In alternativa dal menu File si seleziona Import Data e poi si sceglie la directory e il nome del file da importare importare.. • Per leggere da una stringa in modo formattato si usa la funzione sscanf sscanf:: A = sscanf sscanf(s,format, (s,format,size size); ); dove s è una variabile stringa. Scrittura/lettura file in formato ASCII e scrittura/lettura non formattata • Per scrivere dati in un file in formato ASCII si usa la funzione dlmwrite dlmwrite:: dlmwrite( dlmwrite (filename,A,dlm filename,A,dlm); ); Nel file “filename filename” ” vengono scritti gli elementi della matrice A in formato ASCII usando il carattere dlm come delimitatore (es (es.: .: '\t'). • Per leggere dati da un file in formato ASCII si usa la funzione dlmread dlmread:: A = dlmread dlmread( (filename,dlm filename,dlm); ); • Per scrivere in un file in modo non formattato (dati binari) si usa la funzione fwrite fwrite:: fwrite( fwrite (fid fid,A, ,A,precision precision); ); dove precision è una stringa che specifica il formato dei dati dati.. Ad esempio 'float32 'float 32' ' specifica che i dati sono numeri reali scritti in singola precisione, mentre 'double double' ' specifica che i dati sono numeri reali scritti in doppia precisione precisione.. • Per leggere da un file in modo non formattato (dati binari) si usa la funzione fread fread:: A = fread fread( (fid,size,precision fid,size,precision); ); Interpolazione • E' spesso necessario stimare valori intermedi tra due dati noti con precisione precisione.. Questo processo si chiama interpolazione interpolazione.. • L'interpolazione lineare in MATLAB è svolta dalle funzioni interp interp1 1 (1D) e interp2 interp 2 (2D) D).. Supponiamo che il vettore x contenga i dati della variabile indipendente e che il vettore y contenga i dati della variabile dipendente dipendente.. Allora scrivendo:: scrivendo y_int = interp interp1 1(x,y, (x,y,x_int x_int) ); si ottiene un vettore della stessa dimensione di x_int che contiene i valori interpolati linearmente di y che corrispondono a x_int x_int.. • E' da notare che i valori della variabile indipendente del vettore x devono essere in ordine crescente e i valori del vettore di interpolazione x_int devono essere compresi all'interno dell'intervallo dei valori di x. • Esempio: Esempio: i vettori x e y contengono, rispettivamente i tempi e le temperature x = [7, 9, 11 11, , 12 12] ]; % tempi y = [15 15, , 18 18, , 25 25, , 28 28] ]; % temperature x_int = [8, 10 10] ]; % ore 8.00 e ore 10 10. .00 temperatura= temperatura=? ? y_int = interp interp1 1(x, y, x_int x_int) ) Interpolazione • In alternativa, è possibile eseguire l'interpolazione del tipo spline cubica che nel caso 1D si concretizza attraverso il seguente comando comando:: y_int = spline(x,y,x_int) spline(x,y,x_int); ; • La funzione interp interp2 2 di MATLAB consente di interpolare una funzione di due variabili, z = f(x,y). Se vogliamo stimare il valore di z per x=xi e y=yi, la sintassi è: interp2 interp 2(x,y,z,x_i,y_i) (x,y,z,x_i,y_i); ; • Supponiamo di avere a disposizione le temperature misurate in uno stesso istante in quattro differenti località disposte come riportato in figura figura.. Si voglia stimare la temperatura in una località interna nel punto di coordinate xi=0.6 e yi=1.5. La sessione di lavoro è la seguente seguente:: x = [0,1]; 15 17 y = [0,2]; z = [15 15, ,17 17; ;18 18, ,14 14] ]; % temperature x_i = 0.6; y_i = 1.5; z_int = interp interp2 2(x, y, z, x_i, y_i) 18 14 Diagrammi sovrapposti • Le seguenti varianti dei comandi plot(y) e plot(x,y) possono essere utilizzati per generare diagrammi sovrapposti sovrapposti:: • plot(A) rappresenta in un diagramma le colonne di A in funzione dei loro indici, generando n curve curve;; A è una matrice con m righe ed n colonne colonne.. • plot(x,A) rappresenta in un diagramma la matrice A in funzione del vettore x; x è un vettore riga o un vettore colonna ed A è una matrice con m righe ed n colonne.. Se la dimensione di x è pari ad m, ogni colonna di A viene colonne rappresentata in funzione del vettore x. Il diagramma conterrà tante curve quante sono le colonne di A. Se la dimensione di x è pari ad n, ogni riga di A viene rappresentata in funzione del vettore x. Il diagramma conterrà tante curve quante sono le righe di A. • plot(A,y) rappresenta in un diagramma il vettore y in funzione della matrice A. Se la dimensione di y è pari ad m, y sarà rappresentato in funzione delle colonne di A. Il diagramma conterrà tante curve quante sono le colonne di A. Se la dimensione di y è pari ad n, y sarà rappresentato in funzione delle righe di A. ogni riga di A viene rappresentata in funzione del vettore x. Il diagramma conterrà tante curve quante sono le righe di A. • plot(A,B) rappresenta in un diagramma le colonne della matrice B in funzione delle colonne della matrice A. Tipi di linee e simboli dei dati • Per rappresentare il vettore y in funzione del vettore x e indicare ogni punto con un determinato simbolo, basta racchiudere il simbolo tra due apici nella funzione plot.. plot • Ad esempio per rappresentare i punti di un diagramma con un cerchio basta digitare:: plot(x,y,'o') digitare plot(x,y,'o').. Per collegare i vari simboli con un segmento occorre rappresentare due volte i dati digitando digitando:: plot(x,y,x,y,'o') plot(x,y,x,y,'o').. • Per rappresentare y in funzione di x con degli asterischi verdi collegati ad una linea tratteggiata rossa, basta digitare digitare:: plot(x,y,'g*',x,y,'r plot(x,y,'g*',x,y,'r---') ').. Simbolo Marcatore Tipo linea Marcatore Punto . Linea cont. (default) - Nero k Asterisco * Tratteggio -- Blu b Segno per x Tratto e punto -. Azzurro c Cerchio o Linea punteggiata Verde g Segno più + Rosa m Quadrato s Rosso r Rombo d Bianco w Stella p Giallo y : Colore Marcatore Etichette per linee e dati • E' possibile creare titoli ed etichette che contengono simboli matematici, lettere greche ed altri attributi grafici (caratteristiche basate sul linguaggio TeX TeX)). seno e coseno • Se un diagramma è formato da più curve è possibile inserire una legenda per distinguerle, utilizzando il comando legend legend.. La sintassi di base è: legend('stringa legend ('stringa1 1','stringa ','stringa2 2', ',... ...) ); Ad esempio il seguente file script genera il diagramma mostrato in figura figura.. x=[ x= [0:0.01 01: :2*pi] *pi]; ; y=sin(x) y=sin (x); ; z=cos(x) z=cos (x); ; 1 plot(x,y,x,z,'-plot(x,y,x,z,' --') '); ; s in(x) 0.8 c os (x) xlabel('x') xlabel ('x'); ; 0.6 ylabel('seno ylabel ('seno e coseno') coseno'); ; legend('sin(x)','cos(x)') legend ('sin(x)','cos(x)'); ; 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 0 1 2 3 4 x 5 6 7 Principali simboli e caratteri speciali Diagrammi multipli • Il comando subplot consente di generare nello stesso grafico più diagrammi di dimensioni ridotte ridotte.. La sintassi è: subplot(m,n,p) subplot (m,n,p); ; Questo comando divide la finestra grafica di MATLAB in una serie di pannelli rettangolari disposti su m righe e n colonne colonne.. La variabile p indica a MATLAB di porre l'output del comando plot che segue il comando subplot nel p-esimo pannello.. pannello • Per esempio, subplot subplot( (3,2,5) crea un array di sei pannelli (tre righe e due colonne di pannelli) e indica a MATLAB di visualizzare il successivo diagramma nel quinto pannello pannello.. • Il seguente file script crea la figura riportata nella pagina successiva che contiene i diagrammi delle funzioni y=e-1.2x sin( sin(10 10x+ x+55) per 0≤ x≤5 e y=|x3-100 100|| per -6≤ x≤ x≤66. x = [0:0.01 01: :5]; y = exp exp( (-1.2*x) *x). .*sin *sin( (10 10*x+ *x+5 5); subplot( subplot (1,2,1); plot(x,y),xlabel plot(x,y), xlabel('x'), ('x'),ylabel ylabel('y'), ('y'),axis axis([ ([0 0 5 -1 1]) x = [-6:0.01 01: :6]; y = abs abs(x (x. .^3-100 100) ); subplot( subplot (1,2,2); plot(x,y),xlabel plot(x,y), xlabel('x'), ('x'),ylabel ylabel('y'), ('y'),axis axis([ ([-6 6 0 350 350]) ]) Diagrammi multipli 1 350 0.8 300 0.6 250 0.4 200 0 y y 0.2 150 -0.2 -0.4 100 -0.6 50 -0.8 -1 0 2 4 x 0 -5 0 x 5 Diagrammi bidimensionali speciali Comando Descrizione semilogx(x,y) Crea un diagramma semilogaritmico di y in funzione di x con l'asse x in scala logaritmica. semilogy(x,y) Crea un diagramma semilogaritmico di y in funzione di x con l'asse y in scala logaritmica. loglog(x,y) Crea un diagramma bilogaritmico di y in funzione di x. bar(x,y) Crea un diagramma a barre di y in funzione di x. polar(teta,r, 'tipo') Crea un diagramma polare di coordinate teta e r, utilizzando il tipo di linea, simbolo e colore specificati nella stringa tipo tipo.. stairs(x,y) Crea un diagramma a gradini di y in funzione di x. stem(x,y) Crea un diagramma a steli di y in funzione di x. plotyy(x1,y1, x2,y2) Crea un diagramma con due assi delle ordinate. ordinate. Diagrammi tridimensionali a linea • Le linee nello spazio tridimensionale possono essere rappresentate con il comando plot3 plot 3, la cui sintassi è plot plot3 3(x,y,z) (x,y,z).. Per esempio consideriamo la linea 3D caratterizzata dalla seguente equazione parametrica parametrica:: x = e -0.05t sin(t) y = e -0.05t cos(t) z=t 40 30 z • La curva generata è la spirale riportata in figura generata con le seguenti istruzioni istruzioni:: t = [0:pi/ pi/50 50: :10 10*pi] *pi]; ; plot3 plot 3(exp exp( (-0.05 05*t) *t). .*sin *sin(t), (t),... ... exp( exp (-0.05 05*t) *t). .*cos *cos(t), (t),t t); xlabel('x') xlabel ('x'); ; ylabel('y') ylabel ('y'); ; zlabel('z') zlabel ('z'); ; grid; grid ; 20 10 0 1 1 0.5 0 y 0 -1 -0.5 -1 x Diagrammi tridimensionali a superficie • La funzione z=f(x,y) rappresenta una superficie quando viene riprodotta nel sistema di assi x,y,z. La funzione mesh permette di generare un diagramma a superficie nello spazio 3D. Prima di utilizzare la funzione mesh mesh,, occorre generare una griglia di punti nel piano xy mediante la funzione meshgrid e poi calcolare la funzione f(x,y) in corrispondenza di questi punti punti.. • Se x= x=[ [xmin xmin: :xstep xstep: :xmax xmax] ] e y= y=[ [ymin ymin: :ystep ystep: :ymax ymax] ], allora il comando [X,Y]=meshgrid [X,Y] =meshgrid(x,y) (x,y) genererà le coordinate di una griglia rettangolare rettangolare.. Le matrici risultanti X e Y conterranno le coppie di coordinate di ogni punto della griglia.. Queste coppie sono utilizzate per calcolare la funzione griglia funzione.. • La funzione [X,Y] [X,Y]=meshgrid =meshgrid(x) (x) è equivalente a [X,Y] [X,Y]=meshgrid =meshgrid(x, (x,x x) e può essere utilizzata se x e y hanno gli stessi minimi e massimi e le stesse spaziature spaziature.. In questo caso per generare la griglia è possibile digitare digitare:: [X,Y] = meshgrid meshgrid(min (min: :step step: :max max) ). • Nel seguito viene mostrato come generare il diagramma a superficie della funzione y^22)^ )^22+y^ +y^22] per -2 ≤ x ≤ 2 e -2 ≤ y ≤ 2 con una spaziatura di 0.1. z=xe-[([(xx-y^ [X,Y] = meshgrid meshgrid( (-2:0.1:2); 2 2 Z = X.*exp( *exp(-((X ((X-Y.^2).^2+Y +Y. .^2)) )); ; - x- y y 2 mesh(X,Y,Z) mesh (X,Y,Z); ; f (x, y ) = x e xlabel('x'), xlabel ('x'),ylabel ylabel('y'), ('y'),zlabel zlabel('z') ('z'); ; Diagrammi tridimensionali a superficie z 0.5 0 -0.5 2 2 1 0 0 y -2 -1 -2 x Diagrammi a contorno (contour plot) • I diagrammi a contorno possono essere creati con la funzione contour la cui sintassi è contour(X,Y,Z) contour(X,Y,Z).. Anche in questo caso bisogna prima creare una griglia di punti con la funzione meshgrid e generare la funzione funzione.. [X,Y] = meshgrid( meshgrid(-2:0.1:2); Z = X.*exp( *exp(-((X ((X-Y.^2).^2+Y +Y. .^2)) )); ; contour(X,Y,Z),xlabel('x'),ylabel('y'); contour(X,Y,Z),xlabel('x'),ylabel('y') ; 2 1.5 1 y 0.5 0 -0.5 -1 -1.5 -2 -2 -1.5 -1 -0.5 0 x 0.5 1 1.5 2 Diagrammi vettoriali del gradiente di una funzione • I diagrammi vettoriali possono essere creati con la funzione quiver la cui sintassi è quiver quiver(X,Y, (X,Y,px px, ,py py) ). Anche in questo caso bisogna prima creare una griglia di punti con la funzione meshgrid e generare la funzione funzione.. [X,Y] = meshgrid meshgrid( (-2:0.1:2); Z = X.*exp( *exp(-((X ((X-Y.^2).^2+Y +Y. .^2)) )); ; [px px, ,py py] ] = gradient gradient(Z, (Z,0 0.1,0.1); quiver(X,Y, quiver (X,Y,px px, ,py py) ) 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 Funzioni per diagrammi tridimensionali Funzione Descrizione contour(X,Y,Z) Crea un diagramma a contorno (curve di livello). mesh(X,Y,Z) Crea un diagramma tridimensionale a superficie. meshc(X,Y,Z) Come mesh mesh,, in più traccia un diagramma a contorno sotto la superficie. meshz(X,Y,Z) Come mesh mesh,, in più traccia una serie di linee di riferimento verticali sotto la superficie. surf(X,Y,Z) Crea un diagramma tridimensionale a superficie la cui griglia ha pannelli opachi. surfc(X,Y,Z) Come surf surf,, in più traccia un diagramma a contorno sotto la superficie. Crea le matrici X e Y dai vettori x e y per definire una griglia [X,Y]=meshgrid(x,y) rettangolare. [X,Y]=meshgrid(x) Equivale a [X,Y]=meshgrid(x,x) waterfall(X,Y,Z) Come mesh mesh,, con la differenza che genera linee di griglia in una sola direzione.
Documenti analoghi
Mini Manuale Matlab
Nella Parte 4 verranno esposte alcune caratteristiche del Control System Toolbox, un
Toolbox che implementa potenti strumenti per l'analisi e la sintesi di sistemi dinamici
lineari e non lineari.
N...