Sei sulla pagina 1di 26

CAPITOLO 2

IL LINGUAGGIO MATLAB
Introduzione Matlab un linguaggio ad alto livello e per la sua potenza particolarmente indicato per lanalisi numerica nel campo dellingegneria, ma soprattutto permette di adoperare uno strumento di simulazione notevolmente versatile che Simulink. Prima di introdurre questultimo bene avere qualche rudimento di programmazione in ambiente Matlab, in quanto servir sia per scrivere programmi di lancio per la simulazione, con le assegnazioni delle costanti e dei valori iniziali delle variabili utilizzate nel modello, sia per utilizzare la potente grafica 2D e 3D di Matlab per visualizzare meglio i risultati della simulazione. Sempre nellambito della simulazione, altre applicazioni sono la possibilit di scrivere funzioni da richiamare nel modello Simulink. La conoscenza di questo interessante linguaggio pu essere utile agli studenti ed ai futuri ingegneri anche solo come strumento di calcolo, tenendo presente che poche righe in Matlab corrispondono a decine od anche a centinaia di righe di programmi a pi basso livello, come il Fortran, il C/C++, il Basic, etc. Il linguaggio anche orientato agli oggetti (Object Oriented), anche se in queste lezioni ci si soffermer solo sui concetti base per poter utilizzare al meglio Simulink. Che cosa Matlab? Matlab un sofisticato ambiente matematico e di simulazione che pu essere usato per modellare ed analizzare sistemi dinamici. Pu manipolare sistemi continui, discreti, lineari e non lineari e possiede notevoli mezzi per il calcolo matriciale in quanto opera con variabili matrice, come dice lo stesso nome Matlab che deriva da Matrix Laboratory. L'ambiente MATLAB concepito per il calcolo interattivo o automatico. Le avanzate funzioni matematiche e grafiche integrate e gli strumenti di facile utilizzo consentono di analizzare e visualizzare i dati in tempo reale. L'ambiente MATLAB incorpora calcolo numerico, visualizzazione e strumenti per la creazione di GUI (Graphic User Interface) personalizzate. Le interfacce integrate consentono il rapido accesso e l'import di dati da strumenti, file, database e programmi esterni. Inoltre MATLAB consente di incorporare routine esterne scritte in C, C++, Fortran e Java nelle applicazioni MATLAB. Questo permette di utilizzare programmi scritti in questi linguaggi, risparmiando il tempo di riscrittura oppure permette di velocizzare l'esecuzione scrivendo routine con parti ricorsive, che sarebbero pi lente in Matlab, in linguaggi a pi basso livello, ma pi veloci. La versione di Matlab che stata usata per preparare il testo delle lezioni la 6.5. Le versioni pi recenti hanno apportato notevoli migliorie ma anche qualche lentezza, che si avverte sui PC non molto recenti, in particolare allavvio. Le componenti di Matlab Matlab consiste di cinque parti principali: Ambiente di sviluppo (Development Environment): l'insieme di strumenti che permettono di usare le funzioni Matlab ed i file. Molti di questi strumenti sono GUI, come l'interfaccia desktop e le sue finestre; La libreria di funzioni matematiche (Mathematical Function Library), una vasta collezione di algoritmi di calcolo; Il linguaggio Matlab: un linguaggio ad alto livello con istruzioni di controllo di flusso, funzioni, strutture dati, funzioni di I/O, programmazione orientata agli oggetti; La grafica: Matlab ha notevoli e potenti capacit grafiche 2D e 3D per la presentazione dei risultati, con possibilit di elaborazione di immagini ed animazioni; Le API (Application Program Interface) che permettono l'interazione di Matlab con programmi esterni che possono scambiare dati od utilizzare Matlab come motore di calcolo e grafica.

Funzioni matematiche e di calcolo numerico Con pi di 600 funzioni matematiche, statistiche e tecniche, MATLAB consente l'accesso immediato agli algoritmi matematici pi complessi. La matematica ottimizzata per le operazioni matriciali e vettoriali e pu essere utilizzata al posto di linguaggi di basso livello come C e C++ con meno programmazione, consentendo ad ingegneri e ricercatori di concentrarsi maggiormente sui loro obiettivi, evitando le tediose attivit di sviluppo, debugging e manutenzione di codici dedicati. MATLAB mette a disposizione numerose funzioni per l'esecuzione di operazioni matematiche e l'analisi dei dati, comprese funzioni che consentono di lavorare con: Matrici e algebra lineare, sistemi di equazioni lineari, autovalori, valori singolari e decomposizioni matriciali

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

Polinomi e interpolazione, operazioni standard sui polinomi come radici di un polinomio, valutazione, differenziazione, curve fitting ed espansione delle frazioni parziali Elaborazione dei segnali, filtri digitali, trasformata di Fourier (FFT) e convoluzione Analisi dei dati e statistica, regressione, curve fitting e filtraggio dei dati Funzioni di funzioni (funzioni MATLAB che operano con funzioni matematiche invece che con array numerici), compresa la graficizzazione, l'ottimizzazione, l'individuazione degli zeri e l'integrazione numerica (quadratura) Equazioni differenziali - risoluzione di problemi con equazioni differenziali tra cui: problemi ai valori iniziali per equazioni differenziali ordinarie (ODE) ed equazioni differenziali algebriche (DAE), problemi di valori ai limiti per ODE e problemi misti ai valori iniziali e/o al bordo per sistemi di equazioni alle derivate parziali (PDE) paraboliche ed ellittiche. Matrici sparse - comprendenti sia operazioni matematiche specifiche, sia le operazioni generiche, compresi i metodi iterativi per le equazioni lineari sparse

I Toolbox di MATLAB possibile aggiungere a MATLAB decine di toolbox, ossia pacchetti software opzionali costituiti da funzioni e programmi aggiuntivi per le pi diverse applicazioni, eccone alcuni esempi: Control System Toolbox: per lanalisi e la sintesi di regolatori, permette di analizzare le funzioni di trasferimento dei sistemi, di progettarne il regolatore e di vedere il comportamento dinamico. Signal Processing Toolbox: per lanalisi dei segnali nel dominio tempo e nel dominio frequenza e progettazione di filtraggio digitale. Data Acquisition Toolbox: permette di acquisire dati per mezzo delle schede di I/O pi comuni sul mercato. Symbolic Math: per il calcolo simbolico. L'interfaccia desktop Lanciando Matlab, appare la una finestra, detta desktop, simile a quella mostrata in fig.2. Il desktop consente l'accesso rapido ai file di dati, ai programmi, ai grafici, all'help in linea dei prodotti e a molte altre funzioni.

Fig.2.1- Desktop di Matlab possibile personalizzare il desktop in modo che esso contenga solo gli strumenti d'uso pi frequente. La configurazione standard (default desktop layout) del desktop comprende: la Command Window: la finestra principale di Matlab, essa permette di introdurre i comandi, eseguire funzioni, assegnare o visualizzare variabili, etc; la Command History, dove si pu visualizzare la storia degli ultimi comandi; il Launch Pad: visualizza l'elenco di tutti i prodotti installati nel sistema, da esso possibile visualizzare le demo dei prodotti, accedere all'help e agli esempi e attivare strumenti interattivi; il Workspace Browser: permette di visualizzare tutte le variabili contenute nell'area di lavoro Matlab che prende nome di "Workspace", cliccando su una variabile richiamato l'Array Editor che visualizza le matrici e permette anche di modificarne gli elementi; Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 2

la Current Directory: che la cartella che contiene i file di lavoro, di default essa la cartella "work", altrimenti occorre selezionarla dall'apposita finestra in alto a destra;

Scrittura dei programmi e debugging Matlab ha un programma di scrittura (editor) e di ricerca errori (debug) dei file sorgente di Matlab, detti anche Mfile in quanto hanno nomi con estensione "*.m". L'Editor/Debugger consente anche una rapida visualizzazione, facilitata con la colorazione differenziata del testo. Per richiamare l'editor basta cliccare con il mouse sul file selezionato nella current directory, oppure sulla icona relativa all'apertura di un file. Numerose routine di MATLAB sono state sviluppate e diffuse sotto forma di M-file leggibili, che consentono di visualizzare il codice sorgente, capirne il funzionamento e modificarlo per adattarlo alle proprie applicazioni. Con MATLAB facile aggiungere funzioni personalizzate e collegamenti a software esterni e fonti di dati.

INTRODUZIONE AL LINGUAGGIO MATLAB


Questa solo una descrizione molto essenziale di quelle che sono le funzioni pi comuni e pi utilizzate di Matlab, per ogni funzione esistono spesso molti modi di impiego, per cui si rimanda all'help in linea od alla letteratura in bibliografia per gli usi pi particolari. Per rendere pi chiare e distinguibili le istruzioni e le risposte di Matlab si usato per esse lo stesso font di default della Command Window, cio il Courier, mentre il font del testo in Times New Roman. Come introdurre una matrice Le matrici possono essere immesse in vari modi. Vengono usate le parentesi quadre [] come delimitatori ad indicare l'inizio e la fine della matrice. Gli elementi di ogni riga della matrice possono essere separate con spazi o virgole, le righe sono separate da ";". Ad esempio: A=[1,2,3;4 5 6;7 8 9] Un altro modo per immettere la matrice quello di scrivere le righe, andando a capo per ogni riga: A=[1 2 3 4 5 6 7 8 9] In entrambi i casi, Matlab risponde cos: A= 1 2 3 4 5 6 7 8 9 Se si chiude la riga con un ";" immettendo la riga: A=[1,2,3;4 5 6;7 8 9]; Matlab accetta l'assegnazione, ma non la visualizza. Nei programmi che si verranno a scrivere meglio chiudere ogni riga di programma (eccetto i commenti e le istruzioni grafiche) con un ";". Altrimenti verrebbero visualizzati, nella finestra di comando, tutti i valori ad ogni run. Gli elementi di una matrice possono anche essere costituiti da funzioni od espressioni MATLAB. Ad esempio: x=[-1.3 sqrt(3) (1+2+3)*4/5] produce: x= -1.3000 1.7321 4.8000 Per definire o per riferire elementi individuali di una matrice, si usa il nome della variabile e parentesi tonde, ad esempio: x(5)=abs(x(1)) produce: x= -1.3000 1.7321 4.8000 0.0000 1.3000

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

Notare che il vettore x ora costituito da 5 elementi. possibile costruire grandi matrici partendo da vettori o piccole matrici, ad esempio immettendo le seguenti due righe: r=[1 2 3 4 5]; y=[x;r] si ha il seguente risultato: y= -1.3000 1.7321 4.8000 0.0000 1.3000 1.0000 2.0000 3.0000 4.0000 5.0000 La seguente istruzione: w=[x,r] Produce un vettore riga dato da x e r di 10 elementi. anche possibile estrarre piccole matrici da grandi, usando il delimitatore ":", ad esempio: A=[2 4 6;8 10 12;14 16 18]; z=A(2:3,1:2) produce: z= 8 10 14 16 Il delimitatore ":" significa daa. Lo statement che definisce z pu essere inteso come: "poni z uguale alla seconda fino alla terza riga e dalla prima alla seconda colonna di A". Adesso si provi il seguente esempio: z=y(:,2:4) il risultato : z= 1.7321 4.8000 0.0000 2.0000 3.0000 4.0000 Il comando pu essere inteso come: "z uguale a tutte le righe di y e dalla seconda alla quarta colonna." Notare che il ":" pu essere usato per specificare un intervallo di righe o colonne oppure tutte, se non vengono specificati i limiti. La funzione size Serve per conoscere le dimensioni di una matrice, ad esempio letta da un file, immettendo: d = size(z) la funzione d in uscita un vettore di due elementi che sono il numero di righe e di colonne della matrice z: d = 2 3 ossia una matrice 23. Se interessa solo sapere quante colonne ci sono, basta immettere: d = size(y,2) Come si immettono le espressioni La forma pi comune per immettere delle istruzioni, o statement, in MATLAB : variabile = espressione se si omette la variabile e si scrive solo l'espressione, il risultato assegnato automaticamente alla variabile ans. Per esempio, in risposta alla seguente riga di comando: 1900/81 si ottiene: ans= 23.4568 Se l'istruzione da immettere fosse pi lunga di una riga dello schermo occorre porre "" alla fine della riga, per far continuare l'istruzione nella riga (o nelle righe) successive, per esempio: Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 4

s=1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 ... - 1/8 + 1/9 - 1/10 + 1/11 - 1/12 produce il risultato richiesto. Come ottenere informazioni sul workspace Matlab ha uno spazio di memoria dedicato alle variabili in uso, questo si chiama workspace, per avere informazioni sul suo contenuto basta vedere nella finestra Workspace del desktop, ma si possono anche usare dei comandi, essi sono: who: produce la lista dei nomi di tutte le variabili definite fino ad ora; whos: aggiunge alla lista dei nomi anche le loro dimensioni e la classe . Con il comando: clear: si cancella tutto il contenuto del workspace what: si ottiene invece la lista di tutti i file Matlab presenti nella cartella ed i relativi tipi. Per salvare su disco tutto il contenuto del workspace basta battere: save Matlab crea un file binario chiamato matlab.mat; oppure save nomefile per dare un nome preciso al file salvato (senza estensione). In un secondo tempo sempre possibile ripristinare nel workspace quanto stato salvato con il comando: load nomefile non occorre indicare l'estensione '.mat'. Costanti predefinite Sono i,j = sqrt(-1), per i numeri immaginari e pi per la costante pigreco. Numeri ed operazioni in MATLAB Per tutti i numeri Matlab utilizza la doppia precisione floating point, quindi 8 byte. Esso adotta i tradizionali operatori aritmetici usati da tutti i linguaggi (+,,*,/,^) ed altri come la backslash (\) e tutte le funzioni trascendenti (cos,sin,abs,log,log10,...) MATLAB indicher con Inf se un numero diventa infinito. A differenza di altri linguaggi, esso non si arresta davanti ad una divisione per zero, ma assegna un valore infinito e procede nei calcoli. Analogalmente, in caso di indeterminazione, Matlab indicher con NaN (Not a Number) i risultati di calcoli come 0/0 od Inf/Inf. Numeri Complessi sempre possibile usare numeri complessi nelle espressioni Matlab. In questo caso occorre fare attenzione a non usare le variabili (i oppure j) per altre cose. Ecco alcuni esempi di espressioni complesse: z=3+4*i z=3+4*j r=1; theta=pi/4; w=r*exp(i*theta); Ecco due modi equivalenti per assegnare le matrici complesse : A=[1 2;3 4] + i*[5 6;7 8] A=[1+5*i 2+6*i;3+7*i 4+8*i] Entrambi danno come risultato: A= 1.0000+5.0000i 2.0000+6.0000i 3.0000+7.0000i 4.0000+8.0000i Note:

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

nella seconda espressione di A non ci sono spazi tra parte reale ed immaginaria in quanto MATLAB in grado di interpretare correttamente. MATLAB permette di ridefinire i,j per altri usi, ma se si vogliono usare i numeri complessi, occorre ricreare la variabile usata, per esempio la "i" con l'espressione: i=sqrt(-1).

Formati numerici di uscita Quando mostra i valori di una matrice, MATLAB usa il formato intero se tutti i suoi elementi lo sono, ad esempio, scrivendo: x=[-1 0 1] esso indica: x= -1 0 1 Se invece c' anche un solo elemento non intero, vi sono diverse possibili visualizzazioni, ad esempio, battendo: x=[4/3 1.234567e-8] d come risposta x = 1.3333 0.0000 Notare che il secondo elemento di x appare nullo. Poich il primo elemento molto maggiore del secondo, il secondo appare nullo per via della precisione impostata per la visualizzazione. Il formato numerico si pu modificare sul desktop dal menu File|Preferences. Ecco alcuni esempi di formati possibili: format short (default) , format short e , format short g, format long , format hex Con i formati short e long, se l'elemento pi grande della matrice maggiore di 1000 od il pi piccolo minore di 0.001, viene usato un fattore moltiplicativo comune. Ad esempio: y=1.e20*x , verr visualizzato come: y = 1.0e+020 * 1.3333 0.0000 Uso dell'help Si pu accedere all'help cliccando sull'icona "?" della barra menu del desktop Matlab. Per avere informazioni sull'uso di una funzione o di un operatore Matlab basta battere, nella command window, help seguito dal nome della funzione, ad esempio help if visualizza l'uso e la sintassi del controllo "if". CALCOLO MATRICIALE Matlab distingue due tipi di calcolo matriciale: Matrix Operations: operazioni tra matrici; Array Operations: operazioni tra matrici, elemento per elemento. Matrix Operations Trasposta La trasposta si realizza semplicemente mettendo un apostrofo al nome della matrice, se questa complessa il risultato la matrice trasposta complessa coniugata. Esempio: A=[1 2 3; 4 5 6; 7 8 0] B=A' I risultati sono; A= 1 2 3 4 5 6 7 8 0 B= 1 4 7 2 5 8 3 6 0 Un uso molto comune della trasposta quello di trasformare un vettore riga in vettore colonna (o viceversa): Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 6

x=[-1 0 2]' produce: x= -1 0 2 Addizione, Sottrazione e Moltiplicazione Queste operazioni non hanno nessun problema. Per tutti i calcoli matriciali, le matrici devono avere dimensioni (size) tra loro compatibili con il tipo di operazione. Fa eccezione il caso in cui uno degli operandi sia scalare, ossia una matrice 11, in questo caso esso viene ad operare con ogni elemento della matrice. Ricordando le matrici A,B,x , viste prima, si immetta la seguente espressione: C=A+B , il risultato sar: C = 2 6 10 6 10 14 10 14 0 Si immetta ora la seguente espressione: D=A+x , si avr la seguente risposta: ??? Error using ==> + Matrix dimensions must agree. Questo perch x un vettore colonna 31 ed A e una matrice 33 Si immetta ora la seguente espressione: b=A*x , si avr la seguente risposta: b = 5 8 -7 Se si scrive l'espressione: y=x-1 ,si avr la seguente risposta: y = -2 -1 1 Divisione tra matrici La divisione tra matrici un poco pi complessa, questo perch non esiste di per s un operatore "divisione". Esistono due operatori per la divisione, divisione a sinistra "\" ed a destra "/", pi facile capire questi concetti con un esempio: X=A\B equivalente a: X=inv(A)*B , esso risolve il problema: AX=B; X=B/A equivalente a: X=B*inv(A), esso risolve il problema: XA=B. Se A rettangolare, A\B e B/A automaticamente trovano la soluzione ai minimi quadrati, dove inv(A) valida solo per matrici quadrate. L'uso di una divisione tra matrici non raccomandato per semplici operazioni perch pu portare confusione. La cosa migliore quella di utilizzare la funzione: inv(). Per esempio, se si ha l'equazione: b=A*x e si vuole conoscere x, basta utilizzare l'espressione: x=inv(A)*b Potenze sulle matrici possibile elevare una matrice ad una matrice, una matrice ad uno scalare, uno scalare ad una matrice, sebbene il caso pi comune sia quello di elevare una matrice ad una potenza scalare. La sola limitazione che la matrice deve essere quadrata. Se si immette l'espressione: A^4 , si ottienre: ans = 3861 4806 2997 8964 11205 7290 7425 9504 7614 Se si immette invece l'espressione: x^3 , si ottienre: ??? Error using ==> ^ Matrix must be square. Altre operazioni sulle matrici Ecco altre funzioni sulle matrici: det determinante della matrice poly caratteristica polinomiale

trace traccia della matrice kron prodotto tensoriale di Kronecker 7

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

expm esponenziale logm logaritmo sqrtm radice quadrata della matrice funm funzione arbitraria per avere maggiori dettagli sull'uso delle funzioni meno ovvie, basta ricorrere all'help. La matrice vuota Si intende la matrice vuota quando almeno una delle sue dimensioni uguale a zero. Molte funzioni, come si vedr danno in uscita una matrice vuota se non sono state raggiunte delle condizioni. Per creare una matrice 00 basta immettere: A = [] Array Operations Come si gi detto, queste operazioni si riferiscono a quelle elemento per elemento. Per questo tipo di operazioni si fa precedere il simbolo dell'operatore (per esempio: / \ * ^) da un punto ".". Molte funzioni e tutti gli operatori logici sono considerati array operation. Per esempio, se si immettono le seguenti istruzioni: x=[1 2 3]; y=[4 5 6]; z=x.*y si ottiene: z = 4 10 18 E scrivendo questa espressione: z=x.\y , si avr in risposta: z = 4.0000 2.5000 2.0000 Nota: l'espressione x.\y equivalente a: y./x Ecco un esempio con le potenze: z=x.^y , si avr in risposta: z = 1 32 729 Se l'esponente uno scalare: z=x.^2 , si avr in risposta: z = 1 4 9 Se si fosse usata l'espressione: z=x^2, si sarebbe avuta la risposta: ??? Error using ==> ^ Matrix must be square. Se la base uno scalare: z=2 .^[x y] , si avr in risposta: z = 2 4 8 16 32 64 Operazioni e funzioni relazionali e logiche Queste operazioni (per esempio: greater than, less than, ...) esistono, ma non sono di uso frequente all'infuori degli m-file. Per esaminarli basta scrivere help <. Funzioni matematiche elementari Molte funzioni sono implicitamente del tipo elemento per elemento in MATLAB, esse sono: sin seno abs valore assoluto cos coseno angle angolo di fase tan tangente sqrt radice quadrata asin arcoseno sign segno acos arcocoseno conj complesso coniugato imag parte immaginaria real parte reale atan arcotangente atan2 arcotangente a quattro quadranti sinh seno iperbolico cosh coseno iperbolico tanh tangente iperbolica atanh arcotangente iperbolica asinh arcoseno iperbolico acosh arcocoseno iperbolico log logaritmo naturale log10 logaritmo in base 10 fix arrotondamento per difetto floor arrotondamento verso Inf round arrotondamento ceil arrotondamento verso +Inf rem resto o modulo exp esponente di base e Generare vettori e matrici possibile generare vettori e matrici usando apposite funzioni. Occorre ricordarsi di terminare sempre la riga con un ";" onde evitare che la matrice venga visualizzata durante l'esecuzione del comando. Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 8

Per generare un vettore di elementi con incremento unitario basta immettere : tra il primo e lultimo valore, per esempio: t=1:5 produrr: t = 1 2 3 4 5 Con questa istruzione si sono imposti : valore iniziale : valore finale (incremento=1). Se si desidera generare un vettore di elementi con un certo incremento, per esempio 0.5, basta immettere: t=1:.5:5 che produrr: t = 1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000 4.5000 5.0000 Con questa istruzione si sono imposti : valore iniziale : incremento : valore finale. Esistono anche le funzioni linspace e logspace linspace(X1, X2, N) genera un vettore linearmente spaziato di N elementi tra X1 e X2, immettendo: y=linspace(-pi,pi,4)si ottiene: y= -3.1416 -1.0472 1.0472 3.1416 La funzione logspace del tutto simile, ma produce un vettore con spaziatura logaritmica, entrambi queste funzioni sono utili per creare assi. Esistono altre funzioni che generano matrici o vettori, a seconda dell'argomento: se questo (m,n) genera una matrice rettangolare mn , se (m) genera una matrice quadrata mm. anche possibile mettere nell'argomento le dimensioni di una variabile gi assegnata (size(A)), in questo caso crea una matrice delle stesse dimensioni. Eccone alcune: rand genera valori casuali, uniformemente distribuiti tra o ed 1. eye genera una matrice identit (diagonale unitaria e tutti gli altri zeri) zeros genera tutti zeri ones genera tutti uni Immettendo A=eye(3,3) si ottiene: A = 1 0 0 0 1 0 0 0 1 Le funzioni zeros e ones servono anche per dimensionare ed inizializzare le matrici che non vengono assegnate in modo globale, come si visto fino ad ora, ma assegnando i singoli elementi. I POLINOMI Il Matlab pu interpretare un vettore di lunghezza n+1 come un polinomio di ordine n. I polinomi sono rappresentati come vettori i cui elementi sono i coefficienti in ordine decrescente. Per i coefficienti non presenti nel polinomio si deve inserire lo zero nella corrispondente posizione del vettore. Ad esempio il polinomio: s3 + 3s + 4 si pu rappresentare in Matlab come: p=[1 0 3 4] per cui facile calcolarne le radici con la funzione roots(p) che dar come risultato: ans = 0.5000 + 1.9365i 0.5000 - 1.9365i -1.0000 La funzione inversa di roots poly, essa crea un polinomio partendo dalle sue radici, immettendo per esempio: poly([1 2 3])si avranno i coefficienti del polinomio: ans = 1 -6 11 -6 Se si vuole conoscere il valore di un polinomio in un punto si usa la funzione polyval(p,s) dove p il vettore dei coefficienti del polinomio ed s il punto in cui si vuole calcolarlo, se esso una matrice od un vettore, il calcolo viene fatto elemento per elemento. Per esempio, se il polinomio p(s)= (s+1)(s+2) , cui corrisponde p= [1 3 2] ed s = [1 2 3], si avr in risposta a polyval(p,s): ans = 6 12 20 Per sommare due polinomi dello stesso ordine non ci sono problemi, i vettori hanno la stessa lunghezza ed i coefficienti si sommano. La moltiplicazione tra due polinomi data dalla convoluzione dei loro coefficienti, la funzione Matlab conv la divisione ottenuta con la funzione deconv. Queste funzioni sono di utilit per lo studio dei sistemi con le matrici di trasferimento. LE STRINGHE

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

Le variabili stringa sono delle array di caratteri alfanumerici. Per delimitare una stringa si usano gli apici, ad esempio: nome = 'Pinco Pallino'; possibile creare anche array bidimensionali di caratteri, ma occorre fare attenzione che ogni riga, ossia ogni stringa, abbia la stessa lunghezza aggiungendo spazi (blank) in fondo, ad esempio: name = ['Thomas R. Lee '; 'Senior Developer'];

Un modo molto semplice per creare array di stringhe quello di usare la funzione char che fa automaticamente il riempimento fino alla lunghezza della stringa maggiore: name = char('Thomas R. Lee','Senior Developer'); Per togliere gli spazi si usa la funzione: deblank. Per creare una stringa di n spazi si usa la funzione: blanks(n). Per convertire una stringa s in caratteri minuscoli si usa la funzione: lower(s). Esistono numerose funzioni per trasformare stringhe in numeri e viceversa e per passare da una base numerica ad un'altra. Una funzione interessante quella di cercare una stringa pi corta (sottostringa) in una stringa pi lunga e di restituire un puntatore con la posizione della sottostringa, la sintassi la seguente: k = findstr(str1,str2) Nel caso in cui non si trovasse la sottostringa, il risultato in k una array vuota []. Con questa funzione (a differenza della funzione strfind) si pu ignorare quale sia la stringa pi lunga, lo determina Matlab. Concatenazione di stringhe Le stringhe sono array di caratteri, valgono quindi le cose gi viste, se immettiamo le stringhe: titolo= ('Ing. '); nome=('Pinco Pallino');

immettendo: [titolo nome] si otterr: ans = Ing. Pinco Pallino Se si vuole eliminare gli spazi nella concatenazione, si pu usare la funzione strcat(s1,s2,s3,...): strcat(titolo,nome) , avr come risposta: ans = Ing.Pinco Pallino La funzione eval Una funzione molto importante eval, essa permette di eseguire un'espressione Matlab da programma, ad esempio: eval('load pippo'); carica nel workspace il file (binario) Matlab pippo.mat. Essa equivalente al comando: load pippo. ssa una inutile complicazione se il nome del file una costante, ma se esso una variabile questo espediente diventa necessario, e l'istruzione va scritta concatenando le stringhe. Per esempio, per caricare un file il cui nome stato assegnato alla variabile: nomefile= 'pippo'; basta immettere il comando: eval(['load ' nomefile]); Si noti che nomefile non tra apici in quanto il nome della variabile stringa e non la stringa medesima. COSTRUTTI ALTERNATIVI E RIPETITIVI Il MATLAB e' anche un linguaggio di programmazione in quanto possiede i tre tipi di costrutti: sequenziali, alternativi e ripetitivi. I primi sono la successione delle istruzioni, i secondi sono dei controlli di flusso condizionali, gli ultimi servono per il controllo dei loop. I costrutti sono chiusi con il comando end. Solo per evidenziare meglio il costrutto si suggerisce di identare le istruzioni, ossia di spostarle verso destra con spazi in modo da lasciare in Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 10

evidenza i comandi di controllo del flusso. Non si devono usare ";" per le righe che contengono i comandi, ma si possono usare nelle istruzioni di azione. Costrutto if Un costrutto alternativo si effettua con if: if condizione 1 azione 1 elseif condizione 2 azione 2 elseif condizione 3 azione 3 end Una condizione ha la forma: espressione - operatore di relazione - espressione Le espressioni possono usare operatori di relazione e/o operatori logici. Le azioni sono una o pi istruzioni Matlab, su una riga (con separatore ";") o pi righe. Gli operatori di relazione sono i sei seguenti: == uguale < minore > maggiore <= minore uguale >= maggiore uguale ~= diverso Gli operatori logici sono i seguenti: & and | or not Il simbolo di negazione "~" sulla tastiera italiana lo si ottiene normalmente tenendo premuto il tasto "Alt" e battendo la sequenza 126 dal tastierino numerico, ma Matlab non lo permette. Un metodo efficace ma poco comodo quello di copiarlo dal testo della risposta al comando help <. Costrutto switch L'altro costrutto alternativo si effettua con switch la cui sintassi : switch espressione case condizione1 azione1 case {condizione2, condizione3,...} azione2 otherwise azione3 end Questo costrutto risulta in molti casi pi leggibile a quello che utilizza if. Per chiarire meglio si veda l'esempio: method = 'Bilinear'; switch lower(method) case {'linear','bilinear'} disp('Method is linear') case 'cubic' disp('Method is cubic') case 'nearest' disp('Method is nearest') otherwise disp('Unknown method.') end Matlab risponde: Method is linear Se method = 'none'; Matlab risponde: Unknown method. Costrutto while Un costrutto ripetitivo e' while la cui sintassi : while condizione azione end Costrutto for Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 11

L'altro costrutto ripetitivo e' for la cui sintassi : for k = 3.0 : - 0.3 : 1.5 azione end Istruzione break Serve nei costrutti while e for per terminare il loop, indipendentemente dalla condizione del loop. Essa non pu essere usata al di fuori del loop. Note: Se possibile, evitare di usare cicli ripetitivi che rendono lenta l'esecuzione del programma e preferire di usare la potenza delle funzioni sui vettori, se non se ne pu fare a meno vedere di dimensionare il vettore di uscita prima di entrare nel ciclo, per esempio con la funzione zeros. Immissione da tastiera La funzione input permette di visualizzare nella Command Window un messaggio e di immettere un dato od una stringa, per esempio: nomefile=input('Nome file dati (senza estensione) = ','s');

Permette di introdurre il nome nel file dati nella stringa nomefile . Il parametro di formato che dice a Matlab che deve leggere una stringa 's', si esamini con attenzione la sintassi usata. Immettendo il nome seguito dal tasto 'Invio' e immettendo il comando: eval(['load ' nomefile '.mat']); %legge il file mat Si ottiene la lettura del file, come gi stato accennato precedentemente (vedere eval). Se si 'immissione della stringa un dato numerico, si usa la forma: a=input('Dimmi un numero = ')

cui Matlab risponde: Dimmi un numero = immettendo un 5, questo viene visualizzato ed associato ad a. Se si batte un carattere non numerico, viene visualizzato un errore. La funzione disp Serve per stampare sulla command window una stringa od una qualsiasi altra matrice, ad esempio: disp('prova di stampa'); avr come risposta: prova di stampa Per stampe pi ordinate meglio utilizzare le funzioni di stampa con formato assegnato come fprintf eccone un esempio: fprintf('Angolo di rollio [] = %7.3f\n',beta*180/pi); I formati di stampa sono quelli del C, su questo si ritorner a parlare quando si vedranno le uscite su file. COME SCRIVERE UN PROGRAMMA MATLAB Un programma Matlab un file testo in ascii, quindi basterebbe un qualsiasi editor, per esempio Notepad di Windows. Naturalmente di gran lunga preferibile utilizzare leditor debugger di Matlab. Per richiamare questo programma basta cliccare con il mouse sullicona che rappresenta un foglio bianco (new file). Le istruzioni si scrivono in sequenza come si visto fino ad ora. meglio commentare sempre il programma in modo che sia autodocumentante, questo lo si attua facendo precedere il commento dal simbolo %. anche consigliabile, oltre alluso dellidentazione per i controlli di flusso, anche la separazione delle righe in gruppi. Quando si finito di scrivere un programma lo si salva con file|save as nome (non occorre lestensione che sar .m). Per mettere in esecuzione il programma appena scritto battere il nome del file-m dalla command window. Oppure dalla finestra current directory, selezionando il file e premendo il tasto destro del mouse selezionare run sul menu.

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

12

COME SCRIVERE UNA FUNZIONE MATLAB Come si gi detto possibile arricchire le gi numerose funzioni Matlab con funzioni personali. Le funzioni Matlab sono m-file cui occorre passare le variabili in ingresso e forniscono variabili in uscita. Le variabili interne da esse usate sono variabili locali, ossia non rimane nessuna traccia di loro nel workspace dopo lesecuzione della funzione. Per scrivere le funzioni si usano le stesse procedure viste per scrivere un programma Matlab, ma la funzione deve sempre iniziare con una riga di dichiarazione del tipo: function [variabili in uscita] = nomefunzione(variabili in ingresso) ad esempio function y = nomef(x) dove il comando function significa che Matlab deve interpretare il programma seguente come una funzione di nome nomef dove y largomento di uscita ed x quello dingresso, naturalmente i nomi delle variabili sono un esempio. Gli argomenti possono essere anche pi di uno o nessuno, ecco altro esempio: function [x, y, z] = sphere(theta, phi, rho) ecco un esempio con nessun parametro in uscita, scritto nei due modi equivalenti: function printresults(x) function [] = printresults(x) Il nome del m-file della funzione deve essere uguale a quello della funzione: nomef, sphere, printresults , per gli esempi visti. Successivamente alla riga di dichiarazione consigliabile (ma non obbligatorio) una o pi righe di commento alluso della funzione, che verranno stampate con il comando help nomef. OPERAZIONI SUI FILE I comandi save e load Si gi visto luso di questa funzione per salvare il contenuto del workspace in un file binario Matlab. La sintassi la seguente: save nomefile var1 var2 Con questo comando si salvano su file solo le variabili che interessano, omettendo i nomi si salvano tutte le variabili. Se si vuole salvarle in un file facilmente leggibile ed editabile, occorre indicare a Matlab che si desidera generare un file tipo ascii con laggiunta di un parametro: save nomefile variabile -ascii A differenza del salvataggio in un file binario .mat, con i file ascii occorre che si salvi solo una variabile alla volta, altrimenti i dati verrebbero mischiati e non sarebbero pi ricostruibili. Matlab genera un file ascii in formato esponenziale con 8 cifre significative, se occorre una maggiore accuratezza si deve usare il parametro: -ascii double che utilizza 16 cifre. Ad esempio, si voglia salvare su disco una serie temporale generata in questo modo: alfa= linspace(0,2*pi,100); seno=sin(alfa); Che sono il vettore delle ascisse e delle ordinate della funzione sen(alfa). Si notino che sono vettori colonna per via dellapice aggiunto in fondo al vettore alfa, questa scelta dovuta a considerazioni di tipo pratico: meglio avere righe corte, contenibili in 80 100 caratteri al massimo, per poterle leggere sullo schermo o su una stampante. Occorre prima comporre i due vettori 1001 in una matrice 1002 e quindi salvare queste due serie temporali su un unico file testo, le istruzioni da immettere sono: alfasen= [alfa seno]; save seno.dat alfasen -ascii

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

13

Per leggere questo file ascii basta immettere la riga: load seno.dat A questo punto nel workspace viene caricata la matrice dati cui Matlab assegna come nome quello del file, ossia seno. La matrice esattamente uguale alla matrice alfasen originale. La separazione dei vettori originali si realizza come si gi visto: alfa= seno(:,1); seno=seno(:,2); Attenzione: non si pu invertire la sequenza di immissione perch la seconda istruzione ridefinisce la variabile seno, quindi perde il vettore alfa contenuto nella prima colonna. I comandi fprintf e fscanf Per manipolazioni sui file pi sofisticate, si usano le istruzioni fprintf (abbreviazione di file print formatted) per scrivere file formattati e fscanf per leggerli. Queste istruzioni, come quelle per la stampa formattata, sono molto simili a quelle del linguaggio C, linguaggio nativo di Matlab. Prima di usarle occorre assegnare un identificativo di operazione su file mediante listruzione fopen: fid= fopen(nomefile,'w'); se si vuole scrivere sul file si adopera il parametro w (write), a (append) per scrivere appendendo i dati ad un file esistente, r per leggere (read), ed altri ancora. Alla fine delle operazioni sul file, questo deve essere sempre chiuso con il comando fclose(fid). Le operazioni su quel file sono dora in poi associate alla variabile fid, ecco un esempio di scrittura di un file dati: fid= fopen('seno.dat','w'); fprintf(fid,'%6.3f %6.3f\n',alfa,seno); fclose(fid); Questo comando, a differenza del C, vettorizzato: se la variabile non uno scalare, il file viene scritto mettendo gli elementi di ogni colonna nelle righe. Nel caso dellesempio precedente, viene generato un file scrivendo il vettore alfa nelle prime 50 righe, su due colonne, e quindi il vettore seno nelle rimanenti 50. Se il file viene riletto da Matlab con la funzione fscanf, i vettori vengono ripristinati. Ecco come appaiono le prime righe del file generato: 0.000 0.063 riga 1 0.127 0.190 ..... ..... 6.093 6.156 6.220 6.283 riga 50 ..... ..... 0.000 0.063 riga 51 0.127 0.189 ..... ..... -0.189 -0.127 -0.0630 0.000 riga 100 Per evitare questo problema si usa un ciclo di scrittura: fid= fopen('seno.dat','w'); for i=1:length(seno) fprintf(fid,'%6.3f %6.3f\n',alfa(i),seno(i)); end fclose(fid); si noti luso della funzione length che fornisce la lunghezza del vettore seno. Con luso del ciclo, che rallenta un poco lesecuzione, si scrivono su file gli elementi dei vettori (che sono scalari), quindi non avviene la vettorizzazione. Il file generato ora corretto: 0.000 0.000 0.063 0.063 Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 14

0.127 0.190 0.254 0.317 0.381

0.127 0.189 0.251 0.312 0.372

Il risultato simile a quello ottenuto con listruzione save, ma ora il programmatore che decide il formato dei dati con i parametri formato, preceduti dal %. Il formato %6.3f significa un numero reale con un minimo di 6 cifre in totale e tre decimali. Matlab, a differenza di altri linguaggi allunga il formato se il numero eccede. Ecco alcuni formati pi comuni: %c stringa di caratteri; numero specificato dalla larghezza del campo; %d numero decimale; %f ,%e, %g numero in virgola mobile (Floating-point): con decimali, esponenziale, formato libero; %i numero intero con segno; %s stringa di caratteri senza spazi; La funzione fscanf legge il file riga per riga e lo ricostruisce nel workspace in colonne, mantenendo le dimensioni originali, per usare questa funzione occorre fornire le dimensioni della matrice contenuta nel file e tenere ben presente questa caratteristica. Ad esempio, supponendo che il file contenga i dati organizzati in questo modo: 1 2 3 4 5 0 9 8 7 6 11 22 33 44 55 66 77 88 99 00 che una matrice 45, per leggerli ed assegnarli ad x occorre introdurre listruzione: x=fscanf(fid, '%d', [4 5]) Matlab, eseguendola, metter nel workspace: x = 1 5 7 33 77 2 0 6 44 88 3 9 11 55 99 4 8 22 66 0 come si potr notare, i numeri sono sempre gli stessi ma sono stati ordinati in modo diverso. Ogni volta che legge una riga dal file riempie le colonne fino a raggiungere le dimensioni originarie, quindi inizia a riempire le altre. Per evitare questo inconveniente, occorre usare un piccolo espediente, leggere la matrice 45 come un vettore con listruzione: x=fscanf(fid, '%d'); e ricostruire la matrice originaria con la funzione reshape e la sua trasposta: x=reshape(x, 5, 4)'; Il risultato ora quello corretto: x = 1 2 3 0 9 8 11 22 33 66 77 88

4 7 44 99

5 6 55 0

A differenza del C anche questa istruzione vettorizzata, come si gi visto per la scrittura, con la vettorizzazione si risparmia tempo perch si evita un loop di lettura, ma occorre fare qualche altro passaggio (veloce) per ricostruire i dati. Gli esempi visti sono validi se si conosce almeno una dimensione del file dati, la funzione seguente di grande utilit nei casi in cui si ignorino le dimensioni della matrice da leggere: function a = loadAscii(nomefile) % restituisce in [a] la matrice su file ascii % ricavandone automaticamente le dimensioni Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 15

fid = fopen(nomefile); if fid==-1 error([nomefile ': il file non esiste']); end numlines = 0; try while(1) tline = fgetl(fid); if ~ischar(tline), break, end numlines=numlines+1; end fseek(fid, 0, 'bof'); a = fscanf(fid,'%g',[numlines inf]); [r c] = size(a); a = reshape(a,c,r)'; fclose(fid); catch fclose(fid); error([nomefile ': Errore durante la lettura del file']); end La prima parte del programma ricava il numero di righe numlines del file, la seconda legge il file, ponendo inf come numero di colonne Matlab le legge tutte. Quindi si ricavano le dimensioni effettive della matrice a con la funzione size e si opera come nellesempio precedente per ricostruire la matrice originale. In questo programma sono state usate anche nuove funzioni sui file come fseek e fgetl e costrutti come try e catch. La funzione fgetl legge una linea dal file (file get line), la funzione fseek cos come stata scritta riposiziona lindice della posizione nel file al valore iniziale (bof = beginning of file) , questo per poter successivamente rileggere i dati dallinizio, una volta conosciuto il numero di righe. Il costrutto while come si vede un loop apparentemente infinito, in quanto la condizione sempre vera fino a quando esistono righe da leggere. Alla fine del file, fgetl pone a 1 la condizione ed esce dal loop. Si esce dal loop anche con il break nel caso in cui la riga non una character array (questo controllato dalla funzione ischar), in questo caso scatta la trappola di errore realizzata con il costrutto try e catch. Esso funziona in questo modo: normalmente vengono eseguite le istruzioni comprese tra try e catch, se si incontra un errore in queste istruzioni, si eseguono quelle tra catch ed end. In questo caso lerrore quello di una riga che presenta elementi che non sono caratteri ascii, per cui viene arrestato il processo e stampato il messaggio di errore. possibile operare su pi file aperti contemporaneamente, ad esempio aprirne uno in lettura, leggere ed elaborarne i dati e scriverli su un file di uscita, in questo caso le variabili identificative devono avere nomi diversi. La funzione textread Permettere di leggere dati di formato fisso (e noto) da un file ascii. Essa produce da programma gli stessi risultati della GUI dell Import Wizard , che richiede per di essere avviata manualmente dalloperatore, la sintassi tipica la seguente: [A,B,C,...] = textread('filename','format') Visto che si sono gi descritte diverse funzioni, data la notevole potenza di questa funzione e la quantit dei parametri associati, non si entrer nel dettaglio.

LA GRAFICA
Grafica 2D La funzione plot Crea una figura con un diagramma bidimensionale dei dati, le sintassi di alcune istruzioni sono: plot(Y) plot(X1,Y1,...) plot(X1,Y1,LineSpec,...)

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

16

Nel primo caso si ottiene il grafico del vettore Y, nel secondo caso vengono passati alla funzione i vettori dei due assi, nel terzo caso si danno indicazioni (nella LineSpec) sul tipo di linea, sulla sua larghezza, sugli eventuali marcatori e sul colore. possibile tracciare pi curve nella stessa figura, ad esempio: plot(X1,Y1,X1,Y2) traccia due curve con lo stesso asse X1, esse saranno colorate con colori differenti. Essa pu anche essere scritta: plot(X1,[Y1 Y2]) Si veda un esempio, si costruiscano le serie temporali: alfa= linspace(0,2*pi,100); seno=sin(alfa); coseno= cos(alfa); si vedano ora alcune possibili configurazioni: plot(alfa, seno) plot(seno) plot(seno, coseno) disegna la sinusoide con lasse delle ascisse in radianti crea un grafico con lindice del vettore sullasse delle ascisse (1-100) disegna un grafico corrispondente ad un cerchio disegna le due funzioni

plot(alfa, [seno,coseno])

possibile con funzioni aggiuntive (separate da virgole), aggiungere al grafico un titolo (stringa), i nomi degli assi (stringhe), fissare una scala assegnata, aggiungere la griglia. Ecco un altro esempio: plot(alfa, seno),grid, title(Funzione sinusoide), xlabel(radianti),ylabel(f(t)) Tutte queste cose possono essere modificate dalloperatore agendo sulle propriet cliccando sul tracciato e andando sul menu properties. La funzione: axis([XMIN XMAX YMIN YMAX]) permette di assegnare al grafico una scala fissa, altrimenti questa scelta automatiocamente. Il comando: axis equal permette di rendere uguale il passo in ascisse e coordinate, per cui un cerchio appare non deformato, ad esempio: plot(seno, coseno), axis equal Se si vuole sovrapporre pi grafici sul primo, occorre congelare gli assi con il comando: hold on successivamente i grafici vengono sovrapposti fino a che non si sblocca la figura con il comando: hold off La funzione: figure(n)

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

17

crea la figura n, che vuota. Serve per assegnare forzatamente un numero progressivo. Normalmente questo fatto automaticamente. Per creare grafici logaritmici in x , in y e bi-logaritmici si usano rispettivamente le funzioni: semilogx semilogy loglog Per mettere pi grafici in una figura, si usa la funzione subplot, eccone un esempio: subplot(2,1,1), plot(alfa,seno), grid subplot(2,1,2), plot(alfa,coseno), grid esso crea una figura costituita da due grafici: I sotto-grafici sono organizzati in una matrice mn e passati come argomento alla funzione subplot insieme al numero del grafico che va crescendo da sinistra a destra e dallalto in basso. Nellesempio si ha una colonna di due righe di grafici. Grafica di numeri complessi Quando i dati da plottare sono complessi, la parte immaginaria ignorata eccetto quando il tracciato dato da un singolo argomento complesso. Solo in questo caso particolare viene tracciato un grafico nel piano complesso, ad esempio, il comando: plot(Z) dove Z un vettore complesso o matrice, equivalente a: plot(real(Z),imag(Z)) Per esempio: t = linspace(0,2*pi,16); plot(exp(j*t), ' -o ') traccia un poligono di 16 lati con cerchietti ai vertici.

Diagrammi polari Si realizzano mediante la funzione grafica polar che ha la seguente sintassi: polar(theta, rho, linestile) dove le coordinate polari theta e rho sono langolo, in radianti, ed il modulo. possibile anche immettere le caratteristiche della linea, come si gi visto per le precedenti funzioni grafiche. Esempio: alfa=linspace(0,2*pi,100); polar(sin(alfa),cos(alfa)) GRAFICA 3D Grafici tridimensionali sono tipicamente tracciati per mezzo delle istruzioni plot3, mesh e surf. La funzione plot3 La funzione plot3 consente di tracciare curve tridimensionali, la sua sintassi del tipo: Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 18

plot3(x,y,z) dove x,y,z sono vettori della stessa lunghezza, ad esempio: t = linspace(0,10*pi,100); plot3(sin(t),cos(t),t); genera il grafico visibile in figura. La funzione mesh Listruzione mesh traccia il grafico di una superficie. Ha come parametro la matrice che descrive landamento di tale superficie. Per questo esempio si utilizza la funzione peaks che genera una speciale matrice (senza parametri di 4949 elementi) derivata da traslazioni di distribuzioni di Gauss ed utile per visualizzare queste funzioni: Z=peaks; mesh(Z) La funzione surf Alternativamente a mesh pu essere impiegata surf, questa ultima non colora semplicemente il reticolo ma lintera superficie. La funzione mesh produce superfici wireframe colorando solamente le linee che connettono i punti definiti, surf espone in colore, le linee che connettono e le facce della superficie. surf(Z) La funzione shading Listruzione shading, mettendo a disposizione diversi parametri, permette di raffinare ulteriormente lesposizione della superficie tracciata: shading interp La funzione contour Permette di rappresentare la superficie mediante curve di livello colorate: contour(Z) Funzioni di visualizzazione in due variabili Per rappresentare il grafico di una funzione di due variabili, z = f (x,y), occorre generare, usando la funzione meshgrid , due matrici X e Y in cui sia memorizzato linsieme di definizione, o dominio della funzione f (x,y), in modo che la prima matrice consista di una copia di valori di ascissa memorizzati per righe e la seconda di ordinate per colonne. La funzione meshgrid trasforma nel dominio specifico, un singolo vettore o due vettori x e y in matrici X e Y per usarle nella valutazione della funzione di due variabili. Le file di X sono copie del vettore x e le colonne di Y sono copie del vettore y. Per valutare la funzione bidimensionale sin(r)/r, lungo le due direzioni x e y si procede nel modo seguente: x= -8:.5:8; y=x; [X,Y] = meshgrid(x,y); R = sqrt(X.^2 + Y.^2) + eps; Z = sin(R)./R; mesh(X,Y,Z) La constante Matlab vale: eps = 2.2204e-016 Il risultato quello illustrato a fianco. Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 19

Alcune utili funzioni per lelaborazione dei dati Le funzioni max e min Per un vettore, esse restituiscono il valore massimo (max) o minimo (min) ed anche (se richiesto) la sua posizione nel vettore (puntatore), ad esempio: M= max(seno) risponde: M = 0.9999 se si immette invece: [m i]= min(seno) risponde: m = -0.9999 i = 75 Per una matrice le funzioni restituiscono un vettore riga contenente i massimi od i minimi di ogni colonna della matrice. Ad esempio per la matrice: A=[1 2 3 4 5;0 9 8 7 6;11 22 33 44 55;66 77 88 99 00]; immettendo: max(A) si otterr: ans = 66

77

88

99

55

La funzione mean Calcola la media, per un vettore restituisce uno scalare, per una matrice un vettore riga contenente le medie corrispondenti ad ogni colonna della matrice. La funzione std Calcola la deviazione standard, per un vettore restituisce uno scalare, per una matrice un vettore riga contenente le deviazioni standard corrispondenti ad ogni colonna della matrice. La funzione find Trova gli indici degli elementi non nulli. Interessante la forma con una condizione, ad esempio: find(seno>0.99) si otterr: ans = 24 25 26 27 infatti, se si vuole vedere i valori: seno(23:28) si ottiene: ans = 0.9848 0.9938 0.9989 0.9999 0.9969 0.9898 Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 20

Ecco alcuni esempi di programmi Matlab che elaborano dati e creano grafici per la presentazione di simulazioni sullimpianto di propulsione navale. Non sono stati stampati i file ascii contenenti i dati, ma dai commenti si capisce come erano organizzati. Si noti il metodo usato per leggere in modo vettorizzato questi file: le dimensioni sono introdotte in modo invertito (i dati sul file qsper.dat sono in 3 colonne) e si usato inf per fargli ricavare il numero effettivo delle righe. In tal modo basta fare la trasposta per avere i dati corretti. %************************************************************ % programma MAPGEN.M , G.Carrera 21 febb 1998 % legge i file dei punti sperimentali e calcolati relativi ai % punti del diagramma caratteristico del un motore % Diesel nell'ordine: giri, potenza, consumo specifico % (tutti adimensionalizzati) %************************************************************ clear % legge i dati sperimentali fid = fopen('Qsper.dat','r'); a = fscanf(fid,'%g %g %g',[3 inf]); % matrice di 3 righe x ndati fclose(fid); a=a'; % trasforma in colonne ns = a(:,1); Pots = a(:,2); cs = a(:,3); % legge i dati calcolati fid = fopen('Qcalc.dat','r'); a = fscanf(fid,'%g %g %g',[3 inf]); % matrice di 3 righe x ndati fclose(fid); a=a'; % trasforma in colonne nc = a(:,1); Potc = a(:,2); cc = a(:,3); clear a; % legge il file della curva limite (giri - potenza) fid = fopen('A420lim.dat','r'); Plim = fscanf(fid,'%g %g',[2 inf]); % matrice di 2 righe x ndati fclose(fid); Plim=Plim'; % trasforma in colonne % calcola gli estremi degli intervalli degli assi n1= min(min(ns),min(nc)); n2= max(max(ns),max(nc)); P1= min(min(Pots),min(Potc)); P2= max(max(Pots),max(Potc)); npunti=30; % numero di punti lato griglia nvect=linspace(n1,n2,npunti); % vettore giri Pvect=linspace(P1,P2,npunti); % vettore potenze [XIs,YIs] = meshgrid(nvect,Pvect); ZIs = griddata(ns,Pots,cs,XIs,YIs); v= [0.98 0.99 1.0 1.01 1.02 1.04 1.07 1.15]; [XIc,YIc] = meshgrid(nvect,Pvect); ZIc = griddata(nc,Potc,cc,XIc,YIc); v= [0.98 0.99 1.0 1.01 1.02 1.04 1.07 1.15]; save engmap % disegna le mesh dei dati interpolati subplot(1,2,1), mesh(XIs,YIs,ZIs),title('Experimental Engine Map'), xlabel('rps'), ylabel('Power'), zlabel('qs'); subplot(1,2,2), mesh(XIc,YIc,ZIc),title('Computed Engine Map'), xlabel('rps'), ylabel('Power'), zlabel('qs'); Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 21

%************************************************************ % programma MAP.M , G.Carrera 21 feb 1998 % legge il file contenente i punti del diagramma caratteristico di un % motore Diesel, gi interpolati dal programma MAPGEN.M e disegna % le curve iso-consumi specifici %************************************************************ clear load engmap; % carica i dati interpolati % disegna la mappa dei dati sperimentali contour(nvect,Pvect,ZIs,v), text(0.94,0.7,'0.98'), title('Engine Map (-.- = calculated)'),xlabel('rpm'), ylabel('power'), hold on % disegna la mappa dei dati calcolati contour(nvect,Pvect,ZIc,v,'-.') % disegna la curva limite plot(Plim(:,1),Plim(:,2),'w') hold off %************************************************************ % programma MAPSIM.M , G.Carrera 15 luglio 1998 % legge il file contenente i punti del diagramma caratteristico di un motore % Diesel, gi interpolati dal programma MAPGEN.M e disegna le curve % iso-consumi specifici e vi traccia i punti della simulazione %************************************************************ clear load engmap; % carica i dati interpolati % disegna la mappa dei dati sperimentali contour(nvect,Pvect,ZIs,v), text(0.94,0.7,'0.98'), title('Engine Map (-.- = calculated)'),xlabel('rpm'), ylabel('power'), hold on % disegna la mappa dei dati calcolati contour(nvect,Pvect,ZIc,v,'-.') % disegna la curva limite plot(Plim(:,1),Plim(:,2),'w') dir *.mat nome=input('Nome file dati (senza estensione) = ','s'); eval(['load ' nome '.mat']); %legge il file mat nstep = size(Qe,1); fprintf('Numero step della simulazione monitorati = %d \n',nstep); stepi = input('Numero step inizio grafica = '); if (stepi < 1)|(stepi > nstep) stepi = 1; end stepf = input('Numero step fine grafica = '); if (stepf <= stepi)|(stepf > nstep) stepf = nstep; end fprintf('Intervallo temporale graficato = %6.2f - %6.2f [s]\n',t(stepi),t(stepf)); Qe_a=Qe(stepi:stepf)/117116.66; % adimensionalizza la Qe e_rpm_a=e_rps(stepi:stepf)/ 8.333333333333; % adimensionalizza i giri potenza_a= Qe_a.*e_rpm_a;% potenza adimensionalizzata % 6132212.702045 plot(e_rpm_a,potenza_a,'*'); % grafica la curva dati simulati hold off

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

22

INTEGRAZIONE NUMERICA
Metodo dei trapezi, la funzione trapz il sistema pi semplice, ma anche abbastanza approssimativo, per fare lintegrale definito di una funzione. Essa viene approssimata in tanti trapezi, di cui facile fare larea, per due punti si ha:
x2

f ( x )dx ( x
x1

x1 )

f ( x1 ) + f ( x2 ) 2

la sintassi tipica di questa funzione : i= trapz(x,y); ad esempio, per integrare mezzo ciclo di sinusoide si scrivono le seguenti istruzioni: alfa= linspace(0,pi,50); senom= sin(alfa); trapz(alfa,senom) Verr visualizzato: ans = 1.9993 Lerrore modesto (0.0343 %) perch i punti sono abbastanza fitti (100 per ciclo). Metodo di Simpson, la funzione quad pi accurato del precedente, ogni tre punti la funzione si approssima con una parabola, per cui:
x3

f ( x )dx 3 [ f ( x ) + 4 f ( x ) + f ( x )] con h =
1 2 3 x1

x3 x1 2

per calcolare lintegrale con il metodo di Simpson occorre creare una function, ossia un m-file, contenente la descrizione analitica della funzione da integrare, la sintassi tipica per la funzione quadratura ricorsiva di Simpson : q = quad(fintegr,a,b) utilizzando lo stesso esempio di prima, si deve scrivere la funzione seguente e salvarla in senqua.m: function sq= senqua(alfa) sq=sin(alfa) ; quindi si immettono le istruzioni : alfa= linspace(0,pi,50); q = quad(senqua,0,pi) che avranno in risposta: q = 2.0000 In questo caso, anche se non visualizzato per via del formato short, lerrore percentuale pari a 3.6016e7. A costo di qualche artificio in pi, si ha una notevole precisione, specie in casi in cui la funzione non sia rappresentata da molti punti. Notare che, per funzioni Matlab gi definite, come nel caso di sin(alfa), bastava passare il nome della funzione stessa, indicata come stringa: q = quad(sin(alfa),0,pi) Integrazione cumulativa per trapezi: la funzione cumtrapz Per valutare lintegrale cumulativo di una serie temporale di valori rappresentata dal vettore Y, si utilizza la funzione cumtrapz(Y). Se la spaziatura tra i dati non unitaria occorre moltiplicare il tutto per lintervallo di spaziatura. Ad esempio, per ricavare la funzione integrale di sin(alfa), si scrive: alfa=linspace(0,2*pi,100); seno=sin(alfa); iseno=cumtrapz(seno)*2*pi/100; plot(alfa,[seno;iseno]), grid la figura che viene rappresentata la seguente: Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08 23

INTEGRAZIONE NUMERICA DELLE EQUAZIONI DIFFERENZIALI


Le funzioni ode23 e ode45 Le funzioni di MATLAB ode23 e ode45 consentono l'integrazione numerica di equazioni differenziali impiegante la combinazione di formule di Runge-Kutta, rispettivamente, del secondo e terzo ordine e del quarto e quinto con passo variabile. Per usare queste funzioni, che hanno identica sintassi, occorre che lequazione differenziale sia espressa in forma normale, ovvero come sistema di equazioni del primo ordine:

dx = f (t , x) dt

(1)

dove x un vettore di dimensioni pari allordine dellequazione e t la variabile indipendente, il tempo per le equazioni che descrivono il comportamento dinamico dei sistemi. Per utilizzare queste funzioni occorre creare una funzione Matlab, come si gi visto per la funzione quad, che descriva il sistema di equazioni del tipo (1).La sintassi tipica : [x,t]= ode23(odefun,t0,tf,x0) in cui la funzione odefun quella descrittiva, t0 e tf sono i limiti di integrazione e x0 rappresenta il vettore delle condizioni iniziali. Come esempio si veda la seguente equazione differenziale, che prende il nome di equazione di Van der Pol: (2) Essa deve prima essere posta nella forma normale, ossia due equazioni del primo ordine:

x (1 x 2 ) x + x = 0 x1 = x2

x2 = (1 x12 ) x2 x1
a questo punto, supponendo =1, si pu scrivere la funzione descrittiva vanderpol.m in questo modo: function out1 = vanderpol(t,x) out1 = [x(2); (1-x(1)^2)*x(2) - x(1)]; Questa funzione viene richiamata in un m-file di nome RungeK.m, attraverso il comando [t,x] = ode45('vanderpol',[0 20],[2; 0]); plot(t,x(:,1),'-',t,x(:,2),'-.') dove t=0 l'istante iniziale e t=20 quello finale, mentre 2 e 0 sono i valori iniziali. La figura seguente mostra il grafico delle soluzioni numeriche:

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

24

INTERPOLAZIONE
La funzione polyfit Essa risolve problemi di interpolazione polinomiale, la sintassi la seguente: p=polyfit(x,y,n) dove il vettore x contiene i valori della variabile indipendente ed il vettore y contiene quelli da interpolare, essa fornisce in uscita un polinomio di grado n interpolante le coppie di valori (xi,yi) col metodo dei minimi quadrati. La funzione spline Realizza linterpolazione mediante spline cubiche, dati due vettori x e y ed un vettore xi di ascisse assegnate, essa restituisce un vettore yi ottenuto mediante interpolazione spline, essa ha come sintassi: yi=spline(x,y,xi); La funzione interpft Esegue una interpolazione pi fitta di un vettore y di valori campionati a passo fisso. La sintassi : yi=interpft(x,n); in uscita genera un vettore yi di lunghezza n. Essa utilizza la FFT sui valori campionati e antitrasforma con un maggiore numero di punti. La funzione interp1 Utilizza una interpolazione con la possibilit di scegliere il metodo di interpolazione (lineare, in assenza dellargomento metodo) , la sintassi : yi=interp1(x,y,xi,metodo); i vettori in ingresso ed in uscita sono quelli gi visti per le funzioni precedenti, largomento metodo permette di definire i seguenti metodi di interpolazione: 'nearest' interpolazione al valore pi vicino 'linear' interpolazione lineare 'spline' interpolazione mediante spline cubiche 'pchip' interpolazione mediante cubiche Hermite 'cubic' come 'pchip' La funzione interp2 Interpolazione bidimensionale, la sua sintassi :

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

25

zi=interp2(x,y,z,xi,yi,metodo); anche qui, in assenza dellargomento metodo , si intende lineare, altrimenti sono ammessi i seguenti metodi:'nearest', 'linear', 'spline' e'cubic'. Bibliografia Capitolo2 1. Matlab, The language of Technical Computing, version 6, The Mathworks, 2002 2. Cavallo, R. Setola, F.Vasca Guida operativa a Matlab Simulink e Control Toolbox Liguori Editore, 1994. 3. Adrian Biran, Moshe Breiner "MATLAB for engineers", Addison-Wesley, 1999 4. William J.Palm Matlab 6 per lingegneria e le scienze Mc Graw-Hill, 2001.

Simulazione degli impianti navali G. Carrera Cap.2 rev.27/04/08

26