Università degli Studi di Napoli Federico II CdL Ing. Elettrica Corso di Laboratorio di Circuiti Elettrici Introduzione a MATLAB lezione n. 5 Dr. Carlo Petrarca Dipartimento di Ingegneria Elettrica Università di Napoli FEDERICO II 1
MATLAB come linguaggio di programmazione ciclo for. ciclo if ciclo while 2
Controllo di flusso: ciclo for. Il ciclo for consente di ripetere un certo numero di volte le istruzioni in esso contenute Esempio: Il ciclo for ha la seguente struttura: for variabile = espressione istruzioni Calcolare il valore della funzione y(k)=2^k per k=1,2,3,4 for k=1:4 y(k)=2^k; >> y y = 2 4 8 16 3
L uso eccessivo di cicli for può allungare i tempi di calcolo Basta fare una verifica con le istruzioni sotto riportate. Il vettore V=R*I viene ricavato in due modi diversi: a) si usa un ciclo for; b) si usa il prodotto elemento per elemento. Il risultato è lo stesso, ma i tempi di calcolo sono estremamente diversi! a) R=[1:1:1e+5]; I=[1:1:1e+5];tic; for k=1:1e+5; V(k)=R(k)*I(k); ;toc; b) R=[1:1:1e+5]; I=[1:1:1e+5]; tic;v=r.*i;toc; N.B. utilizzando il comando tic all inizio di un operazione ed il comando toc alla fine della stessa, MATLAB restituisce il tempo impiegato per il calcolo 4
Controllo di flusso: ciclo if Il ciclo if consente di eseguire istruzioni solo se una determinata espressione risulta vera Il ciclo if ha la seguente struttura: if espressione istruzioni if k==2 y=1; if k==2 y=1; elseif k==4 y=0; if k>0 y=1; else y=0; 5
% Esempio n.2 ciclo if clc; clear all; % Immissione dati da tastiera A=input('Inserisci un numero='); if A==5 disp('ho immesso il numero 5'); elseif A==3 disp('ho immesso il numero 3'); else disp('il numero immesso è diverso da 3 e diverso da 5'); 6
Per il controllo di flusso occorrono gli operatori relazionali gli operatori relazionali più comuni sono: == uguale ~= diverso da < minore di <= minore o uguale > maggiore di >= maggiore o uguale 7
Esercizio Creare un vettore di 10.000 elementi scelti in modo casuale secondo una distribuzione uniforme nell intervallo [0,100]. Valutare poi la percentuale di elementi compresa nei seguenti intervalli: I1: [0,25[ I2: [25,50[ I3: [50,75[ I4: [50,75[ 8
Ntot=10000; % Numero di elementi a=0; b=100; U=a+(b-a).*rand(Ntot,1); % creazione del vettore N1=0; N2=0; N3=0; N4=0; % Inizializzazione for k=1:ntot if U(k)>=0 & U(k)<25 N1=N1+1; elseif U(k)>=25 & U(k)<50 N2=N2+1; elseif U(k)>=50 & U(k)<75 N3=N3+1; elseif U(k)>=75 & U(k)<100 N4=N4+1; disp('percentuali rilevate'); disp(' %N1 %N2 %N3 %N4 ') disp([n1/ntot*100 N2/Ntot*100 N3/Ntot*100 N4/Ntot*100]) 9
I cicli possono essere innestati, uno dentro l altro. for variabile1 = espressione1 for variabile2 = espressione2 istruzioni for k=1:3 for j=1:2 a(j,k)=k*j; >> a a = 1 2 3 2 4 6 Esercizi: Creare una matrice unità [5 5] Creare una matrice [5 4] triangolare superiore 10
Controllo di flusso: while Il ciclo while consente di eseguire un blocco di istruzioni finchè una determinata espressione risulta vera. Quando l espressione risulta falsa, il flusso del programma esce dal ciclo. Il ciclo while ha la seguente struttura: while espressione istruzioni num=10; eps=.1; k=0; while eps<num k=k+1; a(k)=num; num=num/2; >> a a = 10.0 5.0 2.5 1.25 0.625 0.3125 0.1563 11
Il comando break Il comando break consente di uscire rapidamente da un ciclo for o while. Se break è presente in un ciclo innestato, esso consente l uscita solo dal ciclo interno. clear all; clc; k=0; while 1 n=input('scrivi un numero= ') if n<0, break, k=k+1; m(k)=n^2; Il ciclo continua finchè non viene inserito un numero minore di zero 12
Esercizio esempio3.m Creare un file.m con cui valutare l epsilon di macchina L epsilon di macchina ε è il numero più piccolo che sommato ad 1 restituisce un valore maggiore di 1 : ε + 1 > 1 ε dà indicazioni sul massimo numero di cifre significative In Matlab la costante eps contiene il valore dell epsilon di macchina eps = 2.2204e 16 13
% Esempio n.3 % Calcolo dell'epsilon di macchina nella forma 2^-k % Ripulisco la Command Window e cancello le variabili clc; clear all; k=0; epsilon=1; while 1~=1+epsilon epsilon = epsilon/2; k=k+1; % Comincio dal numero 2^0 % Dimezzo il valore di epsilon % Il ciclo è eseguito una volta in più del necessario % Correggo i valori di epsilon e di k epsilon=epsilon*2 k=k-1; % epsilon=2^-k 14
Esercizi 1) Creare un file.m con cui valutare il più piccolo numero x min rappresentabile in Matlab nella forma 2^k x min è il numero per il quale si ha (x min /2)=0 2) Creare un file.m con cui valutare il più grande numero x max rappresentabile in Matlab nella forma 2^k x max è il numero per il quale si ha (x max *2)=inf 15
Grafici Il comando plot permette di costruire grafici Se x e y sono due vettori della stessa lunghezza, il comando plot(x,y) permette di tracciare il grafico della funzione y=f(x) x=[-2*pi:pi/10:2*pi]; y=sin(x); plot(x,y) 16
Ogni volta che si traccia un grafico, viene aperta una finestra Figure Se si invia un nuovo comando plot, nella finestra Figure il grafico precedente viene sostituito da quello nuovo. Il comando figure consente di creare una nuova finestra in cui inserire il grafico. x=[1:100]; y=log10(x); figure(1); plot(x,y) w=[-100:100]; z=10*w.^2+6*w+3; figure(2); plot(w,z)) 17
Il comando plot consente di specificare il colore, lo stile, I marker della linea da tracciare. A tal fine, è necessario inserire la stringa s : plot(x,y, s ) la stringa s ha la forma del tipo s = colore-marker-stile Ad esempio: colore: b (blue) g (green) r (red) y (yellow) c (cyan) k (black) marker:. (punto) o (cerchio) s (quadrato) + (croce) * (stella) d (rombo) x (ics) stile: - (continua) : (puntata) -. (punto-linea) -- (tratteggiata) 18
plot(x,y,'ro--') plot(x,y,'gd-') 1 1 0.8 0.8 0.6 0.6 0.4 0.4 0.2 0.2 0 0-0.2-0.2-0.4-0.4-0.6-0.6-0.8-0.8-1 -8-6 -4-2 0 2 4 6 8-1 -8-6 -4-2 0 2 4 6 8 1 plot(x,y,'k*:') 1 plot(x,y,'mv') 0.8 0.8 0.6 0.6 0.4 0.4 0.2 0.2 0 0-0.2-0.2-0.4-0.4-0.6-0.6-0.8-0.8-1 -8-6 -4-2 0 2 4 6 8-1 -8-6 -4-2 0 2 4 6 8 19
Il comando hold on stesso grafico consente di tracciare più curve su uno >> x=[-2*pi:pi/10:2*pi]; y=sin(x); plot(x,y) >> z=cos(x); hold on; plot(x,z,'r+-') 1 0.8 0.6 0.4 0.2 0-0.2-0.4-0.6-0.8-1 -8-6 -4-2 0 2 4 6 8 20
Possiamo inserire un titolo al grafico >> title( Funzione seno') Possiamo dare un etichetta agli assi x e y >> xlabel('x [rad]') >> ylabel('sin(x)') Possiamo decidere il tipo di carattere da utilizzare >> xlabel('x [rad], Fontame, Arial ) O anche la dimensione del carattere >> xlabel('x [rad], Fontname, Arial, Fontsize, 13) 21
Possiamo anche usare caratteri dell alfabeto greco >> title('funzione sen( \omega t + \alpha)') Oppure usare pedici e apici Funzione sen(ωt + α) >> ylabel('successione x_n = \beta _1 + n^2') successione x n =β 1 + n 2 MATLAB assegna automaticamente il range degli assi. Si può usare il comando axis([xmin xmax ymin ymax]) per scegliere il range in modo autonomo >> axis([-2*pi 2*pi -1 1]) Il comando grid consente di mostrare una griglia >> grid 22
Cliccando sul comando Tools Edit plot è possibile modificare manualmente le caratteristiche del grafico e, cioè, cambiare i colori, i simboli, il titolo, gli assi, ecc. 23
Il comando subplot Il comando subplot permette di costruire più grafici nella stessa finestra subplot(m,n,p) Suddivide la finestra in una matrice (m n) di grafici Seleziona il grafico p-esimo subplot(2,3,1) Ottengo una finestra con (2 3) grafici e lavoro sul grafico 1 24
Creare il file usa_subplot.m con il quale tracciare su un unico grafico le funzioni: sin(x); cos(x); sin(x)^2; cos(x)^2; cos(x)*sin(x); cos(x)+sin(x) 1 Funzione sin(x) 1 Funzione cos(x) 1 Funzione sin(x) 2 0.5 0.5 0.8 0.6 0 0 0.4-0.5-0.5 0.2-1 -1 0 0 5 10 0 5 10 0 5 10 1 Funzione cos(x) 2 0.5 Funzione sin(x)*cos(x) 1.5 Funzione sin(x)+cos(x) 0.8 1 0.6 0.4 0 0.5 0-0.5 0.2-1 0 0 5 10-0.5 0 5 10-1.5 0 5 10 25