Introduzione a MATLAB
Università degli Studi di Napoli Federico II CdL Ing. Elettrica
Corso di Laboratorio di Circuiti Elettrici
Dr. Carlo Petrarca
Dipartimento di Ingegneria Elettrica e Tecnologie dell’Informazione
Università di Napoli FEDERICO II
Lezione n.5
i1
E
+
R1
R2 i2
i4
V = 4
A
V2 V3
V1
i =
3 J
B
C
Risoluzione di un circuito elettrico (1)
incognite n
l
8
; 3
; 4
V 250
A 8
15 10
) 4 (
) 3 (
) 2 (
) 1 (
2 1
E
J
R
R
3
Sistema fondamentale
0 0
) (
) (
3 2
1
4 1
i i
i i i B
A
0
0 )
(
) (
3 2
4 2
1 2
1
V V
V V
V M
M
E V
J i
V i
R
V i
R
4 3
2 2
2
1 1
1
0 0
) 4 (
) 3 (
) 2 (
) 1 ( LKC
LKT
Bipoli
i1
E
+
R1
R2 i2
i4
V = 4
A
V2 V3
V1
i =
3 J
B
C
E J V
V V V i i i i
R R
0 0 0 0 0 0
1 0
0 0
0 0
0 0
0 0
0 0
0 1
0 0
0 0
1 0
0 0
0
0 0
0 1
0 0
0
0 1 1
0 0
0 0
0
1 0
1 1
0 0
0 0
0 0
0 0
0 1
1 1
0 0
0 0
1 0 0
1
4 3 2 1 4 3 2 1
2 1
Sistema fondamentale in forma matriciale:
Matrice A [8,8], vettore incognite x[8,1], vettore noti b[8,1]
5 R=[10 15]; %vettore delle resistenze
J=8; % corrente del generatore E=250; % f.e.m del generatore nb=4; % Numero di bipoli
A=zeros(2*nb); % Matrice dei coeff. delle incognite
A(1,1)=1; A(1,4)=1; A(2,1)=-1; A(2,2)=-1; A(2,3)=1; A(3,5)=1; A(3,6)=-1; A(3,8)=1; A(4,6)=1;
A(4,7)=-1; A(5,1)=R(1); A(5,5)=-1; A(6,2)=R(2); A(6,6)=-1; A(7,3)=1; A(8,8)=1;
b=zeros(8,1); % Vettore colonna dei termini noti b(7,1)=J; b(8,1)=E;
x=inv(A)*b; % Vettore colonna delle incognite disp('Valori delle correnti incognite')
disp(' i(1) i(2) i(3) i(4)') disp([x(1) x(2) x(3) x(4)])
disp('')
disp('Valori delle tensioni incognite') disp(' v(1) v(2) v(3) v(4)') disp([x(1+nb) x(2+nb) x(3+nb) x(4+nb)])
+ E2
E3
E1
i (t)
3
+
+
R1
R2
R3
Risoluzione di un circuito elettrico (2)
1
100 ;
2200 ;
3300 ;
11 ;
22 ;
33 ;
E V E V E V R R R
i 4
+ E2
E3
i 5 E1
i 6
+
+
R1
R2
R3 i 1
i 2
i3
A
B
C
O O'
v1
v2
v3 v =4
v =5
v =6
7
Conviene indicare tutte le incognite (tensioni e correnti sui bipoli)
Sistema fondamentale
0 0
0 0
) ' (
) (
) (
) (
3 2
1
6 3
5 2
4 1
i i
i
i i
i i
i i
O C
B A
0 0 )
(
) (
6 5
3 2
5 4
2 1
2 1
V V
V V
V V
V V
M
M
3 6
2 5
1 4
3 3
3
2 2
2
1 1
1
0 0 0
6 5 4 3 2 1
E V
E V
E V
V i
R
V i
R
V i
R LKC
LKT
Caratteristiche
9
3 2 1
6 5 4 3 2 1 6 5 4 3 2 1
3 2
1
0 0 0 0 0 0 0 0 0
1 0
0 0
0 0
0 0
0 0
0 0
0 1
0 0
0 0
0 0
0 0
0 0
0 0
1 0
0 0
0 0
0 0
0 0
0 0
0 1 0
0 0
0 0
0 0
0 0
0 0
1 0
0 0
0 0
0
0 0
0 0
0 1
0 0
0 0
0
1 1
0 1
1 0
0 0
0 0
0 0
0 1
1 0
1 1
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 1
1 1
0 0
0 0
0 0
1 0
0 1
0 0
0 0
0 0
0 0
0 1
0 0
1 0
0 0
0 0
0 0
0 0
1 0
0 1
E E E
v v v v v v i i i i i i
R R
R
Sistema fondamentale in forma matriciale:
R=[8 7 15]; %vettore delle resistenze E=[100 250 180]; % vettore f.e.m dei generatori nb=6; % Numero di bipoli
A=zeros(2*nb); % Matrice dei coeff. delle incognite
A(1,1)=1; A(1,4)=-1; A(2,2)=1; A(2,5)=-1; A(3,3)=1; A(3,6)=-1; A(4,1)=1; A(4,2)=1; A(4,3)=1;
A(5,7)=-1;A(5,8)=1;A(5,10)=1; A(5,11)=-1; A(6,8)=-1; A(6,9)=1; A(6,11)=1 ;A(6,12)=-1;
A(7,1)=R(1); A(7,7)=-1; A(8,2)=R(2); A(8,8)=-1; A(9,3)=R(3); A(9,9)=-1; A(10,10)=1;
A(11,11)=1; A(12,12)=1;
b=zeros(2*nb,1); % Vettore colonna dei termini noti b(10:12,1)=E(1:3);
x=inv(A)*b; % Vettore colonna delle incognite disp('Valori delle correnti incognite')
disp(' i(1) i(2) i(3) i(4) i(5) i(6)') disp([x(1) x(2) x(3) x(4) x(5) x(6)])
disp('')
disp('Valori delle tensioni incognite')
disp(' v(1) v(2) v(3) v(4) v(5) v(6) ') disp([x(1+nb) x(2+nb) x(3+nb) x(4+nb) x(5+nb) x(6+nb)])
E’ opportuno usare metodi diversi per la risoluzione del circuito Scriviamo le equazioni nelle sole incognite correnti
1
1 2 2 1 2
2 3 3 2 3
1 1 1 0
0 0
i
R R i E E
R R i E E
11
+ E2
E3
E1
+
+
R1
R2
R3 i 1
i 2
i3
A
B
C
O O'
v1
v2
v3
1 2 3
1 1 2 2 1 2
2 2 3 3 2 3
0 i i i
R i R i E E R i R i E E
; 180
; 250
; 100
; 15
; 7
; 8
3 2 1 3 2 1
V E
V E
V E
R R R
Il Sistema da risolvere si è notevomente ridotto !!
% circuito2bis.m - Risoluzione circuito
% uso come incognite le sole correnti
R=[8 7 15]; %vettore delle resistenze
E=[100 250 180]; %vettore delle f.e.m dei generatori
A=[1 1 1; R(1) -R(2) 0; 0 R(2) -R(3)]; % Matrice dei coeff. delle incognite b=[0; E(1)-E(2); E(2)-E(3)]; % Vettore colonna dei termini noti
I=inv(A)*b; % Vettore colonna delle intensità di corrente V=R.*I; % Vettore colonna delle tensioni sui resistori Pr=V.*I; % Potenza assorbita dai resistori
Pe=E.*I; % Potenza erogata dai generatori
13
Versione alternativa:
Risolviamo il circuito con il metodo delle correnti di maglia
+ E2
E3
E1
+
+
R1
R2
R3 i 1
i 2
i3
A
B
C
O O'
v1
v2
v3 J1
J2
; 0
; 0
3 2
3 1
2 2
2 2
2 2
2 1
2 1
1 1
E J
R J
R J
R E
E J
R J
R J
R
E
;
;
2 3
2 3 2
1 2
1 2
2 2 1
2 1
E E
J R R
J R
E E
J R J
R
R
Esercizio
Risolvere il circuito con il metodo dei potenziali di nodo
§ ciclo for …. end
§ ciclo if … end
§ ciclo while … end
MATLAB come linguaggio
di programmazione
Controllo di flusso: ciclo for …. end
Il ciclo for ha la seguente struttura:
for variabile = espressione istruzione
end
Il ciclo for consente di ripetere iterativamente un certo numero di volte le istruzioni in esso contenute
Esempio for k = 1:10
istruzione end
Il numero di istruzioni è controllato dalla variabile k, che assume i valori da 1 a 10 a intervalli di 1. L’operazione
“istruzione” contenuta nel ciclo è eseguita 10 volte.
for k=1:4 y(k)=k^2;
end
>> y y =
Esempio:
Calcolare il quadrato del numero k per k=1, 2, 3, 4
Inizialmente k=1 e MATLAB esegue l’operazione y(1)=1^2 Successivamente …
k=2 e y(2)=2^2; k=3 e y(3)=3^2;
e infine k=4 e y(4)=4^2;
Le operazioni terminano perchè k ha raggiunto il valore finale 4
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); end;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
Controllo di flusso: ciclo if –else-end
Il ciclo if ha la seguente struttura:
if espressione istruzione A else
istruzione B end
Il ciclo if consente di eseguire istruzioni solo se una determinata espressione risulta vera
L’istruzione A è eseguita solo se l’espressione risulta vera,
altrimenti viene eseguita l’istruzione B
b=3;
a=7;
if a>5
C=6*a*b;
else
C=3*a*b;
end
Esempio:
Calcolare la costante C
% Immissione dati da tastiera
a=input('Inserisci la variabile a =');
b=3;
if a>5
C=6*a*b;
else
C=3*a*b;
end
La variabile a può anche essere immessa da tastiera
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
== uguale
~= diverso da
< minore di
<= minore o uguale
> maggiore di
>= maggiore o uguale
Per il controllo di flusso occorrono gli operatori relazionali
gli operatori relazionali più comuni sono:
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[
Esercizio
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;
end end
disp('Percentuali rilevate');
disp(' %N1 %N2 %N3 %N4 ')
disp([N1/Ntot*100 N2/Ntot*100 N3/Ntot*100 N4/Ntot*100])
I cicli possono essere innestati, uno dentro l’altro.
for variabile1 = espressione1 for variabile2 = espressione2
istruzioni end
end
Esercizi: Creare una matrice unità [5×5]
Creare una matrice [5×4] triangolare superiore
for k=1:3 for j=1:2
a(j,k)=k*j;
end end
>> a a =
1 2 3 2 4 6
Controllo di flusso: while … end
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.
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
Il ciclo while ha la seguente struttura:
while espressione istruzioni
end
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
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
2.2204 16
eps e
% 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; % Comincio dal numero 2^0 while 1~=1+epsilon
epsilon = epsilon/2; % Dimezzo il valore di epsilon k=k+1;
end
% 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
Esercizi
1) Creare un file .m con cui valutare il più piccolo numero x
minrappresentabile 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
maxrappresentabile in Matlab nella forma 2^k
x
maxè il numero per il quale si ha (x
max*2)=inf
Esercizi
Nel circuito risolto in precedenza :
1.verificare il 1° PdK al nodo O’ con un ciclo for … end 2.verificare il teorema di Tellegen con un ciclo for … end 3.verificare il teorema di Tellegen senza usare cicli
33 +
E2
E3
E1
+
+
R1
R2
R3 i 1
i 2
i3
A
B
C
O O'
v1
v2
v3
% Verifica la LKC al nodo O'
% N.B. Le intensità di corrente sono calcolate tutte
% con verso di riferimento entrante nel nodo O' Somma=0; % Somma delle correnti nel nodo for k=1:3
Somma=Somma+I(k);
end
Risoluzione esercizi (1)
Risoluzione esercizi (2)
% Verifica del teorema di Tellegen for k=1:3
Pe(k)=E(k)*I(k); % Potenze Pe erogate dai generatori end
SommaPe=sum(Pe); % Somma delle potenze erogate
for k=1:3
V(k)=R(k)*I(k); % Tensione sul resistore
Pa(k)=V(k)*I(k); % Potenze Pa assorbite dai resistori end
SommaPa=sum(Pa); % Somma delle potenze assorbite SommaPe-SommaPa % Verifica di Tellegen
35
Risoluzione esercizi (3)
% Verifica del teorema di Tellegen senza cicli for Pe=E.*I; % Potenze Pe erogate dai generatori
SommaPe=sum(Pe); % Somma delle potenze erogate V=R.*I; % Tensione sul resistore
Pa=V.*I; % Potenze Pa assorbite dai resistori
SommaPa=sum(Pa); % Somma delle potenze assorbite SommaPe-SommaPa % Verifica di Tellegen