1
Università degli Studi di Padova Università degli Studi di Padova Corso di Laurea Specialistica in BioingegneriaCorso di Laurea Specialistica in Bioingegneria
A.A. 2005A.A. 2005--20062006
INTRODUZIONE A MATLABINTRODUZIONE A MATLAB
Giovanni SparacinoDipartimento di Ingegneria dell’Informazione
Università degli Studi di PadovaVia Gradenigo 6/B, 35131 Padova
Tel. 049 827 7741; e-mail: [email protected]: http://www.dei.unipd.it/~gianni
2
CHE COSA È MATLAB
MATLAB= MATrix LABoratory.
L’elemento base sono le matrici
Al solito, matrice M X N significa matrice ad M righe ed N colonne.
Casi particolari: M=1 (vettore riga); N=1 (vettore colonna); M=N=1 (scalare)
Matlab sarà per noi:
•un linguaggio di programmazione
•un ambiente di calcolo scientifico con routines altamente specializzate
3
Matlab ha in se' centinaia di funzioni che possono essere built-in (es. det,inv, ...) o incluse in toolbox opzionali (es. funzione remez nel SignalProcessing Toolbox) la cui licenza si acquista a parte.
Nei programmi che scriviamo in Matlab di solito richiamiamo queste funzioni (o altre scritte da noi !). Grazie a queste funzioni, scrivere un programma inMatlab per risolvere un problema ingegneristico che coinvolge calcolo scientifico risulta molto più semplice e veloce che usare linguaggi come Fortran, Pascal, C, ...
Poichè il codice Matlab viene scritto in file di testo, è immediatamente trasferibile ad altre piattaforme dove Matlab è installabile (UniX, Mac,Windows, VAX, ...).
Un codice Matlab viene di fatto interpretato, ma è anche teoricamente possibile compilarlo tramite il Matlab Compiler (che però in questo corso non useremo mai) rendendo così al contempo “chiuso” il sorgente e più veloce l’esecuzione.
PERCHE’ USEREMO MATLAB ?
4
Uso la command window per:•lavorare in modalita' interattiva•lanciare l’esecuzione di un M-file (= programma in Matlab)
Lanciato Matlab, appare la command window con un prompt
UTILIZZO DI MATLAB: LA COMMAND WINDOW
5
Dalla command window posso ad es. fare operazioni come con una calcolatrice e invocare comandi o funzioni (=programmi con argomenti).All'enter Matlab fa le sue elaborazioni e mi fornisce i risultati.
UTILIZZO INTERATTIVO DELLA COMMAND WINDOW
L’uso interattivo della command window è spesso poco conveniente e noioso (è difficile trovare gli errori, se voglio ripetere le operazioni più volte devo riscrivere tutto ogni volta...), ma a volte può essere utile, specie per iniziare !
6
OPERAZIONI DI ASSEGNAZIONE
Osservazioni
•Se non metto il punto e virgola (“;”) dopo l’assegnazione, Matlab fa un “eco”
•Matlab non richiede la dichiarazione delle variabili.
•Matlab è case-sensitive
•I nomi delle variabili sono a piacere (ma non possono cominciare con un numero, includere spazi e caratteri speciali, es. *, e non dovrebbero coincidere con nomi riservati di comandi e funzioni, es. pi)
•Il contenuto della memoria di lavoro si chiamaworkspace
•Per vedere cosa ho nel workspace: who o whos(who+size)
Dalla Command Window si possono assegnare valori a variabili in modo intuitivo.
7
Osservazione: A = [1 2 3; 4 5 6; 7 8 9] e A = [...1 2 34 5 67 8 9 ]creano la stessa matrice 3 X 3 di nome A
Osservazione: A = [1 2;3 4] + i*[5 6;7 8] e A = [1+5i 2+6i;3+7i 4+8i] creano la stessa matrice 2 X 2 ad elementi complessi.
NB: In Matlab “i” e “j” sono le costanti che rappresentano l’unità immaginaria. Se dobbiamo usare numeri complessi, è bene evitare nel codice l’uso di i e j come variabili (anche se è consentito)
8
•Le matrici si inseriscono per righe •In un’operazione di assegnazione, a destra dell'uguale posso avere delle matrici•Per accedere a porzioni di matrici/vettori, si usano le parentesi tonde•Le parentesi quadre si usano solo per delimitare inizio e fine di matrici/vettori
•Gli indici delle matrici sono interi strettamente positivi
•In generale, per vettori riga, v(1,#) e’ accorciabile in v(#), mentre, per vettori, colonna z(#,1) coincide con z(#)
9
Sia
A=[...2 –2 10 37 1 -3 41 5 6 -4]
Per accedere ad un elemento:x=A(3,4) assegnera’ –4
Per accedere ad un’intera riga, ad es. la 2x=A(2,:) restituira’ [7 1 -3 4]
Per accedere ad un’intera colonna, ad es. la 3x=A(:,3) restituira’ [10 -3 6]’
Per accedere ad una sottomatrice, ad es.la 2X2 in basso a destrax=A(2:3,3:4) restituira’ [-3 4
6 -4]
ESTRAZIONE DI SOTTOMATRICI
10
Le matrici si possono costruire “affiancando” matrici piu' piccole (purchèle dimensioni siano compatibili)
11
Una matrice molto grande come ad es. dati (40 X 4) nell’esempio sotto può essere salvata in un file di testo es. dati.dat e richiamabile nelworkspace con il comando load dati.dat
12
Matlab non richiede lapredichiarazione delle variabili e della loro dimensione.
Addirittura, fa un’allocazione dinamica delle variabili: quando definisco un solo elemento di una matrice o quando definisco un nuovo elemento in una posizione che eccede la vecchia dimensione della matrice, gli altri elementi vengono definiti di imperio e posti uguali a zero !
13
Vettori
length(X) restituisce la lunghezza del vettore X
Matrici
[M,N]=size(X) righe e colonne della matrice X
size(X,1) numero di righe della matrice X
size(X,2) numero di colonne della matrice X
DIMENSIONE DELLE VARIABILI
14
COMANDO FORMAT
Internamente, Matlab usa sempre doppia precisione. Per l’esterno, si possono usare vari formati:
format short virgola fissa, 5 cifre
format long virgola fissa, 15 cifre.
» format short» pians =
3.1416
» format long» pians =
3.14159265358979
format short e virgola mobile, 5 cifre.
format long e virgola mobile, 15 cifre.
» format short e» pians =3.1416e+000
» format long e» pians =
3.141592653589793e+000
15
GESTIONE DI STRINGHE
Definizione e concatenamento di stringheA='pinco'B='pallino'C=[A ' ' B]
Conversione di numeri in stringhe
E=67ES=num2str(E)P=[C ES]
16
VARIABILI DI TIPO RECORD
17
18
GESTIONE DELLE VARIABILI NEL WORKSPACE
who produce la lista delle variabili nel workspace
whos la lista contiene anche informazioni su tipo e dimensioni
clear all elimina tutte le variabili nel workspace
clear <Variabile> cancella solo la variabile con nome Variabile
Ogni volta che Matlab viene chiuso il workspace viene perso. Comandi utili:
save <File> salva nel file File.mat tutte le variabili del workspace
load <File> carica nel workspace tutte le variabili presenti in File.mat
save <File> <Variabili> salva nel file File.mat le variabili in Variabili
load <File> <Variabili> carica nel workspace le variabili Variabili del file File.mat
19
RIEPILOGO
20
GENERAZIONE DI VETTORI O MATRICI “SPECIALI”
E’ possibile generare consemplicita’ vettori con elementiequispaziati avvalendosi del simbolo “:”
21
Il comando
A=logspace(Min, Max, N)
genererebbe invece N valori equispaziati su scala logaritmica
Per generare un vettore A di N elementi equispaziati tra Min e Max, posso anche usare il comando:
A = linspace(Min, Max, N)
22
A=rand(3,5) matrice 3x5 con elementi casuali distribuiti unif. in [0,1]A=randn(3,5) matrice 3x5 con elementi casuali distribuiti gauss. come Ν(0, 1)
GENERAZIONE DI VETTORI CASUALI
Sfruttando le trasformazioni lineari riesco a estrarre da varie distribuzioni diprobabilita’
v=10+2*randn(50,1)
vettore colonna di lunghezza 50 con elementi tratti da una distribuzionegaussiana media 10 e deviazione standard 2
u=15+5*rand(50,1)
vettore colonna di lunghezza 50 con elementi tratti da una distribuzione uniforme tra 15 e 20
23
RIEPILOGO
24
A=[] : matrice vuota
A=eye(10) matrice identità 10x10A=zeros(3,5) matrice 3x5 con elementi tutti nulliA=ones(3,5) matrice 3x5 con elementi tutti pari a 1A=diag([3, 5, 6]) matrice 3x3, con elementi sulla diagonale specificati
ALTRI ESEMPI
25
Per la trasposizione di matrice si usa come in algebra lineare l’apice
ESEMPI DI OPERAZIONI SULLE MATRICI
Trasposizione di matrice
26
Matlab esegue in modo intuitivo le operazioni algebriche sulle matrici
Esempio:>> a=2*eye(2)a =
2 00 2
Esempio: >> a=ones(2,3);>> b=ones(2,3);>> a+bans =
2 2 22 2 2
Prodotto per uno scalare, somma, prodotto tra matrici
27
Naturalmente, quando si richiede di eseguire somma, differenza e prodotto, le dimensioni delle matrici coinvolte devono essere compatibili. Ad esempio, se usassimo a e b della slide precedente:
>> a*b??? Error using ==> *Inner matrix dimensions must agree.
Infatti il prodotto fra queste specifiche matrici non è definibile. Posso nell’esempio moltiplicare invece a per la trasposta di b, ottenendo:
>> a*b'ans =
3 33 3
28
Elevamento a potenza
•X^2 indica il prodotto della matrice X con se stessa ed è definito solo per matrice quadrate, cioè X^2 = X*X,•X.^2 indica invece la matrice con elementi A i,j = ( X i,j ) 2
Per esempio:
>> x=ones(2,2);>> x^2ans =
2 22 2
>> x.^2ans =
1 11 1
29
Altro esempio
>> x=[-1,2];>> x^2??? Error using ==> ^Matrix must be square.
Posso invece sempre agire “elemento per elemento”
>> x.^2ans =
1 4
30
Osservazione:Mettere il “.” prima dell’operatore cambia l’operazione drasticamenteperchè significa “elemento per elemento”
31
Divisione
divisione elemento per elemento
equivale a a*inv(b)
32
Altre operazioni sulle matrici
Ce ne sono un’infinità, ad es. inv, det, trace, mean, std, var, sort, max, min,diag, ... Solo per elencarne alcune:
max(x), min(x): massimo e minimo del vettore x.sort(x): ordinamento ascendente del vettore x.mean(x),median(x),var(x),std(x): media, mediana, varianza e sd campionaria di x (per colonne se x è una matrice !!!).
sum(x) : somma gli elementi di x (per colonne se x è matrice).prod(x): esegue il prodotto degli elementi di x (per colonne se x è matrice).diff(x): calcola le differenze [x(2)-x(1), x(3)-x(2), … , x(n)-x(n-1)].
det(X) : determinante di X.rank(X) : rango di X.trace(X): traccia di X.inv(X) : matrice inversa di X.eig(X) : autovalori di X.poly(X) : polinomio caratteristico di X.norm(X, p): norma p di X (matrice o vettore che sia)
33
Esempi: min, max, sort
34
Esempi: poly, eig
coeff. polinomio caratteristico
colonne di V = autovettori di a
autovalori di a
35
Esempi: lu
36
Manipolazione di matrici
37
RIEPILOGO
38
Esistono innumerevoli funzioni, es.
cos, sin, cosh, sinh, tan, tanh, asin, asinh, acos, acosh, ... log, log10, log2, exp,abs, mod,sqr, sqrt, round, floor, ceil,sign
che nei corsi di Matematica sono state definite su scalari e che, se l'argomento e' una matrice, in Matlab lavorano elemento per elemento.
Funzioni matematiche
39
Si possono così calcolare funzioni di matrici:>> a=zeros(1,2)a =
0 0>> b=cos(a)b =
1 1
Altro esempio (NB: pi è una variabile predefinita che vale π):>> t=[0 pi/6 pi/3 pi/2];>> x=cos(t)
x =
1.0000 0.8660 0.5000 0.0000
40
RIEPILOGO
41
Valutazione:
polyval(p,x) : calcola il valore del polinomio in x
Radici:
roots(p) : radici del polinomio.poly(r) : determina il polinomio le cui radici sono r.
GESTIONE DI POLINOMI
42
ALCUNI COMANDI PER SOPRAVVIVERE ...
Dalla Command Window
>> <FrecciaSu>,<FrecciaGiu> Richiama i comandi già dati dalla Command Window
>> help <NomeComando> Consulta l’help in linea per il comando NomeComando
>> lookfor <NomeComando> Ricerca nel manuale la parola chiave NomeComando
>> demos Dimostrazioni
>> exit Chiude Matlab
43
Nell’help, per soli motivi grafici, la funzione viene scritta in maiuscolo, ma va usata comunque in minuscolo !!!
Utili le funzioni correlate !
44
Lookfor ci aiuta a trovare comandi di cui non conosciamo l’esistenza ...
45
COMANDO diary (=big brother …)
46
ESECUZIONE DI M-FILES DALLA COMMAND WINDOWUna sequenza ordinata di comandi può essere scritta in un M-file (=file testo con estensione m).
Per scrivere M-files ci si può servire di un comune text-editor (es. notepad) o del potente editor interno di Matlab
Per far eseguire un M-file dallaCommand Window, è sufficiente scrivere il nomedell’M-file e battere “Invio”.
Nella esecuzione di un M-file,Matlab si comporta come un interprete.
47
La scrittura di un M-file rispetto all’esecuzione di comandi dallaCommand Window permette di:
•Sperimentare un algoritmo, senza dover reintrodurre da tastiera, ad ogni variazione dello stesso, una lunga lista di comandi
•Ottenere programmi che possono essere riutilizzati, per esempio cambiando solo i dati
•Scambiare programmi con altri utenti
•Ottenere una documentazione permanente per un lavoro
M-FILES
48
Scripts: sono files di comandi. Non hanno variabili in entrata e in uscita e operano sulle variabili del workspace% Questo file calcola la radice degli elementi di % una matrice a, se a>0, altrimenti stampa un messaggio di erroreif a>=0
a=sqrt(a)else
disp('errore')end
Functions: sono files di comandi con argomenti in entrata e in uscita. Le variabili interne a questi programmi non influenzano le variabili del workspace
function a=radfunz(x)% RADFUNZ(X) calcola la radice degli elementi di X% se X>=0, altrimenti stampa un messaggio di errore%if x>=0
a=sqrt(x)else
disp('errore')end
Per cominciare ci concentreremo sugli scripts
TIPI DI M-FILES
Attenzione: nel workspace deve essere stata definita una variabile a
Attenzione: Questo file deve essere salvato comeradfunz.m
49
DA RICORDARE
Quando dalla command window digitiamo “pippo” + Enter, Matlab:
1. Controlla nel workspace se pippo è una variabile ed eventualmente ce ne restituisce il valore
2. Controlla se esiste una function built-in di nome pippo ed eventualmente cerca di eseguirla
3. Controlla se esiste nella current directory un M-file di nome pippo.m ed ed eventualmente cerca di eseguirlo
4. Controlla se nell’insieme delle cartelle presenti nel matlabpath(toolbox + quello che abbiamo inserito noi) esiste una function di nome pippo ed eventualmente cerca di eseguirla
50
•E’ buona abitudine sia negli scripts che nelle functions inserire dei commenti
•I commenti sono segnalati da %: Matlab ignora tutti i caratteri dell’intera riga dopo il %
•Le prime righe di commento di uno script o di una functiondiventano parte dello help online
USO DEL % (COMMENTI)
51
GESTIONE DELLA WORKING DIRECTORY
Dalla Command Window
>> dir contenuto della directory corrente >> ls idem>> pwd percorso della directory corrente>> cd idem
>> cd <Percorso> cambia la directory corrente>> chdir <Percorso> come sopra
>> what analogo a dir, ma mostra solo i file .m, .mat, .mdl
52
Gli operatori relazionali più comuni sono:== uguale~= diverso da< minore di<= minore o uguale etc.
Esempi:>> x=2;>> x==0 (questa relazione e’ falsa:)ans =
0>> x==2 (questa relazione è vera)ans =
1
OPERATORI RELAZIONALI
53
Gli operatori relazionali possono essere applicati anche alle matrici:
>> a=[1 2; 0 -1];>> a>0 (qui i primi due elementi sono veri)ans =
1 10 0
>> a>=0 (qui i primi tre elementi sono veri)ans =
1 11 0
54
USO DEGLI OPERATORI RELAZIONALI COME FUNZIONI BINARIE
eq - Equal == ne - Not equal ~= lt - Less than < gt - Greater than > le - Less than or equal <= ge - Greater than or equal >=
55
OPERATORI LOGICI
Gli operatori logici più comuni sono:& and logico| or logico~ not logico
Esempi:>> x=1; y= -1;>> x>0 & y>0 (questa relazione è falsa)ans =
0>> x>0 | y>0 (questa relazione è vera)ans =
1
56
USO DEGLI OPERATORI LOGICI SU MATRICI
and - Logical AND & or - Logical OR | not - Logical NOT ~ xor - Logical EXCLUSIVE ORany - True if any element of vector is nonzeroall - True if all elements of vector are nonzero
57
USO DEGLI OPERATORI LOGICI SU MATRICI
any - True if any element of vector is nonzeroall - True if all elements of vector are nonzero
58
STRUTTURE DI PROGRAMMAZIONE
59
STRUTTURA IF … ELSE…END
Struttura:
if espressioneistruzioni
elseistruzioni
end
Esempio:
if mod(x,2)==0
disp(‘numero est pari’)
else
disp(‘numero dispari’)
end
60
STRUTTURA IF … ELSEIF …END
Struttura:
if espressioneistruzioni
elseif espressioneistruzioni
elseistruzioni
end
Esempio:
if canestro==false
punti = 0;
elseif tirodalontano == true
punti = 3;
else
punti = 2;
end
61
Il ciclo for ha la struttura:
for variabile = espressioneistruzioni
end
In genere espressione è del tipo IndMin:Incremento:IndMax.
Esempio
s=0;for i=1:10
s=s+i;end
calcola la somma dei primi 10 numeri interi (55)
CICLO FOR … END
62
Il ciclo while ha la seguente struttura
while espressioneistruzioniend
Esempioi=1;while i<5i=i+1;
endi
>> ii =
5
CICLO WHILE … END
63
I cicli possono essere uno dentro l’altro.
Esempio (per il ciclo for)
Crea una matrice triangolare inferiore:
>> aa =
1 0 0 01 1 0 01 1 1 01 1 1 1
n=4;for i=1:n
for j=1:ia(i,j) = 1;
end % jend %i
64
Oss. trucchi per migliorare la velocita’
a=zeros(4,4)n=4;for i=1:n
for j=1:ia(i,j) = 1;
end % jend %i
Fa la stessa cosa del codice prima, ma è più veloce, perché Matlab non deve ad ogni nuova riga/colonna riallocare lo spazio in memoria per la matrice a
Meglio preallocare lo spazio per le variabili
65
Oss. trucchi per migliorare la velocita’
T=0.05;for i=0:100
t(i+1)=i*T+1;y(i+1)=log(t(i+1));
end %i
Fa la stessa cosa di
ma e’ decine di volte più lento. Meglio vettorizzare il codice.
t=(0:1:100)
y=log(t+1)
66
67
GRAFICI
Per ottenere il grafico di una funzione, devo:
•Preparare un vettore di ascisse
•Preparare un vettore di ordinate
•Scegliere la figura (opzionale) (Istruzione figure)
•Preparare il riquadro (opzionale) (istruzione subplot)
•Fare il grafico (istruzione plot)
•Settare gli assi (opzionale) (istruzione axis)
•Inserire titoli ed etichette (istruzioni title, xlabel, ylabel, ...)
68
Esempio: grafico di ex cos4x, su [0,2]
>> x=[0:0.01:2];>> f=cos(4*x).*exp(x);>> plot(x,f)
Esempio: grafico di una circonferenza sulla figura 3>> t=0:0.01:2*pi;>> x=cos(t);>> y=sin(t);>> figure(3)>> plot(x,y,'g+')>> axis equal
69
Una serie temporale (senza asse ascisse)
plot(y)
Una funzione
plot(t,y) (di default vengono uniti i punti)
Con i circolettiplot(t,y,'o')
Circoletti + lineaplot(t,y,'o',t,y)
Circoletti + linea rossaplot(t,y,'o',t,y,'r')
Circoletti+linea rossa tratteggiataplot(t,y,'o',t,y,'r--')
ISTRUZIONE PLOT
70
GESTIONE DI PIU’ GRAFICI
Oppure (comando hold on ... hold off)plot(t1,y1)hold on…plot(t2,y2)….plot(t3,y3)hold off
Due funzioni sovrapposte
plot(t1,y1,t2,y2)
Circoletti e asterischi
plot(t1,y1,'o',t2,y2,'*')
Piu' figure
figure(1)
plot(t1,y1)
figure(2)
plot(t2,y2)
71
L’istruzione subplot(M,N,K) crea una figura contenente M*N riquadri, distribuiti su M righe ed N colonne. L’indice K indica che il plot che segue, con annessititle, xlabel, etc.., si riferisce al K-esimo riquadro (con K che può assumere valori fra 1 e M*N)
ISTRUZIONE SUBPLOT
prima del plot, subplot(2,2,4) prima del plot, subplot(6,3,5) prima del plot, subplot(6,1,6)
72
figure(n) : apre la figura n. Se la figura n è gia esistente, la rende la figura “attiva”, ovvero quella su cui i plot avranno effetto.close: chiusura finestra grafica correnteclose all: chiusura di tutte le finestre graficheclose (n) : chiude la figura nclf: cancellazione grafici, riquadri etc dalla figura corrente
title(stringa) : Inserisce il titolo nella figura attiva. stringa può contenere sequenze LaTeX.ylabel(stringa) : aggiunge del testo all’asse delle ordinate.xlabel(stringa) : aggiunge del testo all’asse delle ascisse.
grid on/off : attiva/disattiva la griglia nella figura attiva.
axis([xmin, xmax, ymin, ymax]) : specifica i range per ascisse e ordinateaxis tight : gli assi finiscono al valore massimo/minimo dei dati (non rimane contorno)axis auto : la scala di visualizzazione è scelta da Matlabaxis off/on : elimina/ripristina la visualizzazione di assi, etichette e tick.axis equal : fa in modo che incrementi unitari sui due assi abbiano la stessa lunghezza effettiva su schermo.axis square : si impostano gli stessi minimo e massimo per entrambi gli assi (visualizzazione quadrata)axis normal : si ritorna alla configurazione originale degli assi.
73
ylabel('concentration c_{a}(t)')
Apici e Pedici nei titoli/label
xlabel('concentration c^{b}(t)')
Lettere greche nei titoli/label
title(‘ Risultati per \beta = 3')
74
GRAFICI A BARRE (in alternativa a plot)
hist(y,m): suddivide l’intervallo dei valori compresi tra il minimo e il massimo di y in m “bin” (=sottointervalli) di egual larghezza e calcola (e poi disegna) il numero di elementi di y compresi in ogni bin
-0.2 0 0.2 0.4 0.6 0.8 1 1.20
5
10
15
20
25
30
35
40
45
50bar(x,y) : produce un diagramma a barre.
bar([0:.25:1],[10:10:50])
30 35 40 45 50 55 60 650
50
100
150
200
250
300
350
hist(50+4*randn(1,5000),50)
75
0 1 2 3 4 5 6 7-1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
» x=[0:0.1:2*pi];
» y=sin(x);
» stem(x,y)
stem(x,y): adatto quando si vuole mettere in evidenza il fatto che il segnale è a tempo discreto
semilogx(x,y) : come plot ma l’asse x viene rappresentato in scala log10
semilogy(x,y) : come plot ma l’asse y viene rappresentato in scala log10
loglog(x,y) : come plot ma con entrambi gli assi in scala log10.
76
77
Esempi semplici di M-file
Esempio 1
% qui posso mettere tutti i commenti che mi pare
t=(0:1:100)';y=5*exp(-0.05*t);
ts=(0:5:100)';ys=5*exp(-0.05*ts);
% aggiungo il rumore con varianza 0.8ns=length(ts);vn=randn(ns,1);v=sqrt(0.8)*vn;zs=ys+v;
plot(t,y,'r--',ts,zs,'bo')gridtitle('curva e campioni rumorosi')xlabel('tempo')ylabel('concentrazione')
78
Esempio 2
% esempio di programma che disegna% 5 decay esponenziali sovrapposti% nb: comando hold on, hold off, pause
t=(0:0.01:10)';tau0=0.5;figure(1)hold onfor k=1:5
tau=k*tau0;y=exp(-t/tau);plot(t,y)pause
endhold off
79
Esempio 3% esempio di programma che disegna% decay esponenziali, uno dopo l'altro e a volontà, sulla stessa figura% NB comandi while ed input
t=(0:0.01:10)';tau0=0.5;ancora='s'k=1;figure(1)clfhold on
while ancora=='s'tau=k*tau0;y=exp(-t/tau);plot(t,y)ancora=input('Vuoi continuare (s/n) ? ')k=k+1
endhold off
80
Esempio 4
% esempio di programma che disegna% 5 decay esponenziali su 5 subplot% comandi eval, num2str, e subplot
t=(0:0.01:10)';tau0=0.5;figure(1)for k=1:5
tau=k*tau0;y=exp(-t/tau);stringa1=['subplot(5,1,' num2str(k) ')'];eval(stringa1)plot(t,y)
end
81
CREAZIONE DI FUNCTION
82
La function inizia con una riga che ne specifica il nome (nell’esempio radfunz), le variabili di input e le variabili di output.
La function deve essere salvata in un file con lo stesso nome (nell’esempio radfunz.m)
I commenti dopo la prima riga faranno parte dello help on-line
Seguono le istruzioni con eventuali altri commenti
STRUTTURA DI UNA FUNCTIONfunction a=radfunz(x)% RADFUNZ(X) calcola la radice degli elementi di X% se X>=0, altrimenti stampa un messaggio di errore%if x>=0
a=sqrt(x)else
display('errore')end
83
Un altro esempio
function [xmin,xmax]=minmax(a)
%MINMAX(A) calcola l'elemento minimo, XMIN, e l’elemento % massimo, XMAX della matrice A.
xmin=Inf; xmax=-Inf;
% ricava le dimensioni della matrice A:[m,n] = size(a);for i=1:m
for j=1:nif a(i,j) > xmax
xmax = a(i,j);endif a(i,j) < xmin
xmin = a(i,j);end
endend
84
Un altro esempio
function [mean, stdev] = stat(x)% STAT è una funzione che calcola media e standard deviation per un vettore
[m n] = size(x);
if (m ~= 1) | (n ~=1)error(‘errore: si accettano solo vettori’)
end
mean = sum(x)/m;stdev = sqrt(sum(x.^ 2)/m - mean.^2);
85
function [out1,out2,…]=funz(in1,in2,….)
In generale, le function hanno la seguente struttura
Gli argomenti in output vanno a sinistra dell’ uguale, fra parentesi quadre
Gli argomenti in input vanno a destra dell’ uguale , fra parentesi tonde
Le function vengono richiamate dal programma main passando le variabili di ingresso (anche con nome diverso !)
86
function y=ddpgaussiana(x,m,s);
% questa function restituisce i valori della% ddp nei punti x per una v.a. gaussiana% a media m e deviazione standard s
y= ((1/sqrt(2*pi)*s))*exp((-(x-m).^2)/(2*s^2));
% programma main che fa uso di una% function da me creata per calcolare% il valore della ddp gaussiana a partire da % media e dev.standard
a=[-20:0.1:20];f_a=ddpgaussiana(a,0,4); plot(a,f_a)
Programma “main”
ESEMPIO
87
function y=mia_funz1(x)%function y=mia_funz1(x)% questa e' una function che restituisce il% valore di una_funzione y=mia_funz1(x),% scalare di variabile scalare,% che definisco sotto
if length(x)==1contributo1=exp(-2*x);contributo2=exp(-5*x);y=contributo1+contributo2;
elseerror('la funzione mia funz1 accetta solo argomenti scalari')
end
% esempio di programma main che richiama% una function da me costruita di nome mia_funz1t=(0:0.1:10)';for k=1:length(t)
h(k,1)=mia_funz1(t(k));endplot(t,h)
Programma “main”
ESEMPIO
88
function yv=mia_funz2(xv)% function yv=mia_funz(xv)% questa funzione restituisce un vettore yv% le cui componenti sono l'immagine delle% componenti del vettore xv secondo la % funzione scalare di variabile scalare % da me costruita sotton=length(xv);for k=1:n
xscalare=xv(k);if xscalare<0yscalare=-0.2*xscalare+5;elseyscalare=5*exp(-0.2*xscalare);
endyv(k)=yscalare;
end
ESEMPIO
89
% esempio di programma main che richiama% una function da me costruita di nome mia_funz2% sfrutta la natura vettoriale della funzione
t=(-10:0.1:10)';h=mia_funz2(t);plot(t,h)
Programma “main”
% esempio di programma main che % richiama una function, quad,% che ha come argomento anche una function da me costruita di nome mia_funz2
t=(-10:0.1:10)';h=mia_funz2(t);plot(t,h)
a=-2;b=2;area = quad('mia_funz2',a,b)
Programma “main”
90
% esempio di programma main che % richiama una function, quad,% che ha come argomento anche una function da me costruita di nome mia_funz2
t=(-10:0.1:10)';h=mia_funz2(t);plot(t,h)
a=-2;b=2;area = quad('mia_funz2',a,b)
Programma “main”
FUNZIONI CHE OPERANO SU FUNZIONI
91
Integrale definito della funzione sin
Esempi: funzioni di funzioni
92
Integrale definito della funzione 5*sin
Esempi: funzioni di funzioni composte
INLINE Construct INLINE object.INLINE(EXPR) constructs an inline function object from theMATLAB expression contained in the string EXPR. The inputarguments are automatically determined by searching EXPRfor variable names (see SYMVAR). If no variable exists, 'x'is used.
Examples:g = inline('t^2')
93
Cerca zeri della funzione sin(x) vicino a 3
Cerca zeri della funzione sin(2*x) vicino a 1
Esempi: funzioni di funzioni e funzioni di funzioni composte
94
ALCUNE FUNZIONI CHE POTRANNO ESSERE UTILI