Università degli Studi di Napoli Federico II CdL Ing. Elettrica Corso di Laboratorio di Circuiti Elettrici Introduzione a MATLAB Parte 2 1
L operatore : (due punti) Permette di costruire rapidamente vettori: >> k=1:10 k = 1 2 3 4 5 6 7 8 9 10 >> V=60:-5:5 V = 60 55 50 45 40 35 30 25 20 15 10 5 Consente di selezionare gli elementi di una matrice: A = 8 5 4 3 7 5 2 9 3 B=A(1,:) B = 8 3 2 >> C=A(:,2) C = 3 7 5 2
Stringhe In MATLAB è possibile operare, oltre che su numeri, anche su parole (stringhe di caratteri) Un testo in MATLAB è un vettore di caratteri Le stringhe si manipolano come i vettori >> a='ingegneria a = Ingegneria >> size(a) ans = 1 10 La stringa va inserita tra apici La stringa Ingegneria è una matrice [1 10] 3
Funzioni elementari sin - Seno. asin - Arcoseno cos - Coseno. acos - Arcocoseno tan - Tangente atan - Arcotangente. exp - Esponenziale log - Logaritmo naturale log10 - Logaritmo (base 10) sqrt - Radice quadrata abs - Valore assoluto max - Massimo min - Minimo 4
File.m Editor di file.m Un file.m (M-file) è un programma riconoscibile da Matlab. E un file di testo contenente codice MATLAB In Matlab è presente un editor di files.m Per accedere all editor: File New M-file Con il comando Save il file sarà salvato nella Current Directory 5
Se si crea un file prova.m e si digita al prompt il comando >>prova Matlab eseguirà tutte le istruzioni contenute nel file. I vantaggi di un file.m sono notevoli. Infatti, si può: Eseguire un algoritmo senza dover digitare ogni volta una lunga serie di comandi Ottenere una documentazione del lavoro svolto Cambiare dati senza dover digitare nuovamente tutti i comandi Scambiare programmi con altri utenti 6
Creare il file risolvi.m con il quale risolvere il seguente sistema di equazioni algebriche lineari Utilizzare il metodo dell inversa. Esercizio Esercizio 5 9 4 0 4 4 7 5 7 3 4 3 2 1 3 2 1 3 2 1 = + = + + = + + x x x x x x x x x 7
% Esempio di m-file. Il simbolo % permette di commentare ogni comando % Cancello dalla memoria tutte le variabili e pulisco la command window clear all; clc; % Matrice A dei coefficienti delle incognite A=[4 3 7; 7 4 4; 4-9 1]; % Vettore colonna b dei termini noti b=[5; 0; -5]; % Controllo se il sistema è ben-condizionato % Se l'indice rcond << 1 il sistema è mal-condizionato disp('indice rcond') disp(rcond(a)) % Ricavo il vettore colonna x delle incognite x=inv(a)*b; % Mostro i risultati disp('valori delle incognite') disp(' x(1) x(2) x(3)') disp([x(1) x(2) x(3)]) 8
File.m Esercizio esempio1.m Creare la matrice A[3*4] Estrarre da A il vettore b 7 11 3 6 A = 22 5 6 12 4 3 2 8 b = Creare il vettore bt (trasposta di b) { 4 3 2 8} b 4 3 = 2 8 Calcolare s, prodotto scalare tra la prima riga di A e il vettore bt Risultato: s=115 9
% Esempio n.1 di utilizzo Matlab % Ripulisco la Command Window clc; % Cancello dalla memoria tutte le variabili clear all; % Creazione della matrice A A=[7 11 3 6; 22-5 -6 12; 4 3 2 8]; % Estrazione del vettore b b=a(3,:); % Trasposta di b bt=b'; % Prodotto 1^riga di A per bt s=a(1,:)*bt 10
Immissione di dati da tastiera: input >> a=input('inserisci il numero desiderato= ') Inserisci il numero desiderato= 8 a = 8 >> b=input('inserisci la stringa desiderata= ', 's') Inserisci la stringa desiderata= Lezione b = Lezione >> c=input('inserisci il vettore desiderato= ') Inserisci il vettore desiderato= [5 7 11] c = 5 7 11 11
MATLAB come linguaggio di programmazione ciclo for. end ciclo if end ciclo while end 12
Controllo di flusso: ciclo for. end Il ciclo for consente di ripetere un certo numero di volte le istruzioni in esso contenute Il ciclo for ha la seguente struttura: for variabile = espressione istruzioni end for k=1:4 y(k)=2^k; end >> y y = 2 4 8 16 13
L uso eccessivo di cicli for può allungare i tempi di calcolo Basta fare una verifica con le istruzioni sotto riportate. Il vettore V viene ricavato in due modi diversi: nel caso a) si usa un ciclo for; nel caso 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+4]; I=[1:1:1e+4]; for k=1:1e+4; V(k)=R(k)*I(k); end; b) R=[1:1:1e+5]; I=[1:1:1e+5]; V=R.*I; 14
Controllo di flusso: ciclo if end Il ciclo if consente di eseguire istruzioni solo se una determinata espressione risulta vera Il ciclo if ha la seguente struttura: if espressione istruzioni end if k==2 y=1; end if k==2 y=1; elseif k==4 y=0; end if k>0 y=1; else y=0; end 15
% Esempio n.2 ciclo if end 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'); end 16
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 17
I cicli possono essere innestati, uno dentro l altro. for variabile1 = espressione1 for variabile2 = espressione2 istruzioni end end for k=1:3 for j=1:2 a(j,k)=k*j; end end >> a a = 1 2 3 2 4 6 Esercizi: Creare una matrice unità [5 5] Creare una matrice [5 4] triangolare superiore 18
Controllo di flusso: while if end Il ciclo if 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 end num=10; eps=.1; k=0; while eps<num k=k+1; a(k)=num; num=num/2; end >> a a = 10.0 5.0 2.5 1.25 0.625 0.3125 0.1563 19
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, end k=k+1; m(k)=n^2; end Il ciclo continua finchè non viene inserito un numero minore di zero 20
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 21
% 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; end % 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 22
Esercizi Creare un file.m per risolvere il seguente sistema: 3x1 + 5x2 + 2x3 = 0 x1 + 6x2 + 5x3 = 4 8x1 + 4x2 6x3 = 5 1. Usare il metodo dell inversa 2. Usare il metodo di Cramer (con un ciclo for.. end) Soluzione x 1-2.1275; x 2 = 2.1667; x 3 = -2.2255 23
Esercizi Creare un file.m per risolvere il precedente sistema: 1. Usare il metodo di Gauss 2. Usare la fattorizzazione LU * *) Suggerimento: al prompt digitare il comando help lu 24
Esercizi 1. Creare un file.m con cui valutare il più piccolo numero xmin rappresentabile in Matlab nella forma 2^k xmin è il numero per il quale si ha: x 2 min = 0 2. Creare un file.m con cui valutare il più grande numero xmax rappresentabile in Matlab nella forma 2^k xmax è il numero per il quale si ha: max x *2 = inf xmin=4.9407e-324 xmax= 8.9885e+307 25
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 x-y x=[-2*pi:pi/10:2*pi]; y=sin(x); plot(x,y) 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 26
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) 27
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 28
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 29
Possiamo inserire un titolo al grafico >> title(funzione seno') Possiamo dare un etichetta agli assi x e y >> xlabel( x [rad]') >> ylabel( sin(x)') 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 30
1 Funzione seno 0.8 0.6 0.4 0.2 sin(x) 0-0.2-0.4-0.6-0.8-1 -6-4 -2 0 2 4 6 x [rad] 31
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 32
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 33