% ATV03 - Fluxo de Potencia
% Aluno: Lucas Monte Bravo
% Programa: GNU Octave / MATLAB compativel
%
% IMPORTANTE NO OCTAVE ONLINE:
% 1) Cole este codigo inteiro em um arquivo chamado, por exemplo:
% Fluxo_Potencia_Lucas_Monte_Bravo.m
% 2) Clique em Run.
% 3) Nao execute por partes no console.
clear;
clc;
format long;
fprintf('ATV03 - Fluxo de Potencia\n');
fprintf('Aluno: Lucas Monte Bravo\n');
fprintf('Programa: GNU Octave / MATLAB compativel\n\n');
% ============================================================
% DADOS DO ALUNO
% ============================================================
P2 = 0.04; % Potencia ativa gerada na barra 2, PV
P3c = 0.10; % Carga ativa na barra 3
Q3c = 0.02; % Carga reativa na barra 3
L = 0.03;
% Convencao usada no fluxo de potencia:
% injecao positiva; carga negativa.
P3 = -P3c;
Q3 = -Q3c;
V1 = 1.00;
theta1 = 0.00;
V2esp = 0.98; % Barra 2 PV
% ============================================================
% MATRIZ YBUS
% ============================================================
Y = zeros(3,3);
% Dados das linhas: [de para r x bsh]
% bsh ja e metade da susceptancia da linha, conforme enunciado.
linhas = [
1 2 2*L 20*L 0.2*L;
1 3 4*L 40*L 0.4*L;
2 3 2*L 20*L 0.2*L
];
for k = 1:size(linhas,1)
i = linhas(k,1);
j = linhas(k,2);
r = linhas(k,3);
x = linhas(k,4);
bsh = linhas(k,5);
y = 1/(r + 1i*x);
Y(i,i) = Y(i,i) + y + 1i*bsh;
Y(j,j) = Y(j,j) + y + 1i*bsh;
Y(i,j) = Y(i,j) - y;
Y(j,i) = Y(j,i) - y;
end
fprintf('Matriz Ybus:\n');
disp(Y);
% ============================================================
% 1) GAUSS-SEIDEL - 3 ITERACOES
% ============================================================
fprintf('\n============================================================\n');
fprintf('1) GAUSS-SEIDEL - 3 ITERACOES\n');
fprintf('============================================================\n');
% Flat start:
% Barra 1: slack, 1 ang 0
% Barra 2: PV, magnitude especificada 0.98 ang 0
% Barra 3: PQ, 1 ang 0
V = [1 + 0i; V2esp + 0i; 1 + 0i];
fprintf('Iteracao theta2(graus) V3(pu) theta3(graus) |dV2| |dV3|\n');
maiorErro3 = 0;
for it = 1:3
Vant = V;
% --------------------------
% Barra 2 - PV
% --------------------------
Icalc = Y*V;
Scalc = V .* conj(Icalc);
Q2calc = imag(Scalc(2));
soma = Y(2,1)*V(1) + Y(2,3)*V(3);
V2novo = ((P2 - 1i*Q2calc)/conj(V(2)) - soma)/Y(2,2);
% Mantem |V2| = 0.98 pu
V(2) = V2esp * V2novo/abs(V2novo);
% --------------------------
% Barra 3 - PQ
% --------------------------
soma = Y(3,1)*V(1) + Y(3,2)*V(2);
V(3) = ((P3 - 1i*Q3)/conj(V(3)) - soma)/Y(3,3);
dV2 = abs(V(2) - Vant(2));
dV3 = abs(V(3) - Vant(3));
theta2GS = angle(V(2))*180/pi;
V3GS = abs(V(3));
theta3GS = angle(V(3))*180/pi;
fprintf('%4d %14.6f %10.6f %14.6f %8.6f %8.6f\n', ...
it, theta2GS, V3GS, theta3GS, dV2, dV3);
if it == 3
maiorErro3 = max(dV2,dV3);
end
end
fprintf('\nMaior erro da terceira iteracao = %.6f pu\n', maiorErro3);
% ============================================================
% 2) NEWTON-RAPHSON
% ============================================================
fprintf('\n============================================================\n');
fprintf('2) NEWTON-RAPHSON\n');
fprintf('============================================================\n');
% Variaveis de estado:
% x = [theta2; theta3; V3]
theta2 = 0;
theta3 = 0;
V3 = 1;
tol = 0.003;
maxIter = 20;
% minIter = 2 deixa a tabela com duas linhas.
% Se quiser parar exatamente na primeira vez que epsilon < 0.003,
% altere para minIter = 1.
minIter = 2;
fprintf('Iteracao theta2(graus) V3(pu) theta3(graus) P1(pu) Q1(pu) Q2(pu) epsilon\n');
for it = 1:maxIter
% --------------------------------------------------------
% Calcula P e Q no estado atual
% --------------------------------------------------------
Vmag = [V1; V2esp; V3];
theta = [theta1; theta2; theta3];
Pcalc = zeros(3,1);
Qcalc = zeros(3,1);
for i = 1:3
for k = 1:3
Gik = real(Y(i,k));
Bik = imag(Y(i,k));
ang = theta(i) - theta(k);
Pcalc(i) = Pcalc(i) + Vmag(i)*Vmag(k)*(Gik*cos(ang) + Bik*sin(ang));
Qcalc(i) = Qcalc(i) + Vmag(i)*Vmag(k)*(Gik*sin(ang) - Bik*cos(ang));
end
end
% Mismatch:
% Barra 2 PV: DeltaP2
% Barra 3 PQ: DeltaP3 e DeltaQ3
mismatch = [
P2 - Pcalc(2);
P3 - Pcalc(3);
Q3 - Qcalc(3)
];
% --------------------------------------------------------
% Jacobiano
% Linhas: DeltaP2, DeltaP3, DeltaQ3
% Colunas: theta2, theta3, V3
% --------------------------------------------------------
J = zeros(3,3);
% Linha 1: P2, barra i = 2
i = 2;
% dP2/dtheta2
J(1,1) = -Qcalc(i) - imag(Y(i,i))*Vmag(i)^2;
% dP2/dtheta3
k = 3;
Gik = real(Y(i,k));
Bik = imag(Y(i,k));
ang = theta(i) - theta(k);
J(1,2) = Vmag(i)*Vmag(k)*(Gik*sin(ang) - Bik*cos(ang));
% dP2/dV3
J(1,3) = Vmag(i)*(Gik*cos(ang) + Bik*sin(ang));
% Linha 2: P3, barra i = 3
i = 3;
% dP3/dtheta2
k = 2;
Gik = real(Y(i,k));
Bik = imag(Y(i,k));
ang = theta(i) - theta(k);
J(2,1) = Vmag(i)*Vmag(k)*(Gik*sin(ang) - Bik*cos(ang));
% dP3/dtheta3
J(2,2) = -Qcalc(i) - imag(Y(i,i))*Vmag(i)^2;
% dP3/dV3
J(2,3) = Pcalc(i)/Vmag(i) + real(Y(i,i))*Vmag(i);
% Linha 3: Q3, barra i = 3
i = 3;
% dQ3/dtheta2
k = 2;
Gik = real(Y(i,k));
Bik = imag(Y(i,k));
ang = theta(i) - theta(k);
J(3,1) = -Vmag(i)*Vmag(k)*(Gik*cos(ang) + Bik*sin(ang));
% dQ3/dtheta3
J(3,2) = Pcalc(i) - real(Y(i,i))*Vmag(i)^2;
% dQ3/dV3
J(3,3) = Qcalc(i)/Vmag(i) - imag(Y(i,i))*Vmag(i);
% --------------------------------------------------------
% Resolve J*dx = mismatch
% --------------------------------------------------------
dx = J\mismatch;
theta2 = theta2 + dx(1);
theta3 = theta3 + dx(2);
V3 = V3 + dx(3);
% --------------------------------------------------------
% Recalcula P e Q apos a atualizacao
% --------------------------------------------------------
Vmag = [V1; V2esp; V3];
theta = [theta1; theta2; theta3];
Pcalc = zeros(3,1);
Qcalc = zeros(3,1);
for i = 1:3
for k = 1:3
Gik = real(Y(i,k));
Bik = imag(Y(i,k));
ang = theta(i) - theta(k);
Pcalc(i) = Pcalc(i) + Vmag(i)*Vmag(k)*(Gik*cos(ang) + Bik*sin(ang));
Qcalc(i) = Qcalc(i) + Vmag(i)*Vmag(k)*(Gik*sin(ang) - Bik*cos(ang));
end
end
epsilon = max(abs([
P2 - Pcalc(2);
P3 - Pcalc(3);
Q3 - Qcalc(3)
]));
fprintf('%4d %14.6f %10.6f %14.6f %10.6f %10.6f %10.6f %10.8f\n', ...
it, theta2*180/pi, V3, theta3*180/pi, Pcalc(1), Qcalc(1), Qcalc(2), epsilon);
if epsilon < tol && it >= minIter
break;
end
end
fprintf('\nResultado final usado:\n');
fprintf('theta2 = %.6f graus\n', theta2*180/pi);
fprintf('V3 = %.6f pu\n', V3);
fprintf('theta3 = %.6f graus\n', theta3*180/pi);
fprintf('P1 = %.6f pu\n', Pcalc(1));
fprintf('Q1 = %.6f pu\n', Qcalc(1));
fprintf('Q2 = %.6f pu\n', Qcalc(2));
fprintf('epsilon final = %.8f\n', epsilon);
fprintf('\nTabela final das barras:\n');
fprintf('Barra Tipo P(pu) Q(pu) V(pu) theta(graus)\n');
fprintf(' 1 Slack %10.6f %10.6f %10.6f %10.6f\n', Pcalc(1), Qcalc(1), V1, 0);
fprintf(' 2 PV %10.6f %10.6f %10.6f %10.6f\n', P2, Qcalc(2), V2esp, theta2*180/pi);
fprintf(' 3 PQ %10.6f %10.6f %10.6f %10.6f\n', P3, Q3, V3, theta3*180/pi);
To embed this project on your website, copy the following code and paste it into your website's HTML: