📄 fm_hvdc.m
字号:
function fm_hvdc(flag)
% FM_HVDC define HVDC transmission system
%
% FM_HVDC(FLAG)
% FLAG = 0 initialization
% FLAG = 1 algebraic equations
% FLAG = 2 algebraic Jacobians
% FLAG = 3 differential equations
% FLAG = 4 state matrix
% FLAG = 5 non-windup limits
%
%Author: Federico Milano
%Date: 11-Nov-2002
%Version: 1.0.0
%
%E-mail: fmilano@thunderbox.uwaterloo.ca
%Web-site: http://thunderbox.uwaterloo.ca/~fmilano
%
% Copyright (C) 2002-2006 Federico Milano
global Hvdc Bus DAE
% Data Structure: Hvdc.dat:
% col #1: cosar
% col #2: Vdr
% col #3: Sr
% col #4: Vdi
% col #5: Si
% col #6: cosgi
% col #7: I0r
% col #8: I0i
% col #9: 1/Rd
% col #10: Ld/Rd
% col #11: cosar_max
% col #12: cosar_min
% col #13: cosgi_max
% col #14: cosgi_min
% col #15: 1/KI
% col #16: Vn*In/Sn
Id = DAE.x(Hvdc.Id);
xr = DAE.x(Hvdc.xr);
xi = DAE.x(Hvdc.xi);
bus1 = Hvdc.bus1;
bus2 = Hvdc.bus2;
V1 = DAE.V(bus1);
V2 = DAE.V(bus2);
xcr = Hvdc.con(:,9);
xci = Hvdc.con(:,10);
ar = Hvdc.con(:,11);
ai = Hvdc.con(:,12);
Kp = Hvdc.con(:,14);
I0r_max = Hvdc.con(:,21);
I0r_min = Hvdc.con(:,22);
I0i_max = Hvdc.con(:,23);
I0i_min = Hvdc.con(:,24);
cosar = Hvdc.dat(:,1);
Vdr = Hvdc.dat(:,2);
Sr = Hvdc.dat(:,3);
Vdi = Hvdc.dat(:,4);
Si = Hvdc.dat(:,5);
cosgi = Hvdc.dat(:,6);
I0r = Hvdc.dat(:,7);
I0i = Hvdc.dat(:,8);
Rd = Hvdc.dat(:,9);
LdonRd = Hvdc.dat(:,10);
cosar_max = Hvdc.dat(:,11);
cosar_min = Hvdc.dat(:,12);
cosgi_max = Hvdc.dat(:,13);
cosgi_min = Hvdc.dat(:,14);
xr_max = Hvdc.dat(:,11);
xr_min = Hvdc.dat(:,12);
xi_max = Hvdc.dat(:,13);
xi_min = Hvdc.dat(:,14);
KIinv = Hvdc.dat(:,15);
VISn = Hvdc.dat(:,16);
switch flag
case 0 % Initialization
pi = 3.14159265358979;
Hvdc.dat(:,1) = cosar;
Hvdc.dat(:,2) = Vdr;
Hvdc.dat(:,3) = Sr;
Hvdc.dat(:,4) = Vdi;
Hvdc.dat(:,5) = Si;
Hvdc.dat(:,6) = cosgi;
Hvdc.dat(:,7) = I0r;
Hvdc.dat(:,8) = I0i;
Hvdc.dat(:,9) = 1./Hvdc.con(:,15);
Hvdc.dat(:,10) = Hvdc.con(:,16)./Hvdc.con(:,15);
Hvdc.dat(:,11) = cos(pi*Hvdc.con(:,18)/180);
Hvdc.dat(:,12) = cos(pi*Hvdc.con(:,17)/180);
Hvdc.dat(:,13) = cos(pi*Hvdc.con(:,20)/180);
Hvdc.dat(:,14) = cos(pi*Hvdc.con(:,19)/180);
Hvdc.dat(:,15) = 1./Hvdc.con(:,13);
Hvdc.dat(:,16) = Hvdc.con(:,7).*Hvdc.con(:,8)./Hvdc.con(:,3);
Vdr = ones(Hvdc.n,1);
Sr = 1.3505*Hvdc.dat(:,16).*V1;
Vdi = ones(Hvdc.n,1);
Si = 1.3505*Hvdc.dat(:,16).*V2;
I0r = I0r_max;
I0i = I0i_min;
cosar = (Hvdc.dat(:,11)-Hvdc.dat(:,12))/2;
cosgi = Hvdc.dat(:,14);
case 1 % algebraic equations
DAE.gp = DAE.gp + sparse(Hvdc.bus1,1,VISn.*Vdr.*Id,Bus.n,1);
DAE.gp = DAE.gp - sparse(Hvdc.bus2,1,VISn.*Vdi.*Id,Bus.n,1);
DAE.gq = DAE.gq + sparse(Hvdc.bus1,1,VISn.*Id.*sqrt(1.8238*V1.*V1-Vdr.*Vdr),Bus.n,1);
DAE.gq = DAE.gq + sparse(Hvdc.bus2,1,VISn.*Id.*sqrt(1.8238*V2.*V2-Vdi.*Vdi),Bus.n,1);
case 2 % algebraic Jacobians
a = 3040988094387517/2251799813685248;
b = 95493/100000;
c = 9247608590206622002595365425289;
d = 5070602400912917605986812821504;
e = 10141204801825835211973625643008;
g = 18495217180413244005190730850578;
h = 1/4503599627370496;
Qi = (c*(VISn.*V2.*Id).^2-d*(VISn.*Vdi.*Id).^2).^0.5;
Qr = (c*(VISn.*V1.*Id).^2-d*(VISn.*Vdr.*Id).^2).^0.5;
j12_1 = VISn.*(a*xr + a*Kp.*(I0r-Id) + a*V1.*Kp./ar).*Id;
j22_1 = h./Qr.*(g*(VISn.^2).*V1.*(Id.^2)-e*(VISn.^2)*Vdr.*(Id.^2).*(cosar+a*V1.*Kp./ar));
j12_2 = -VISn.*(cosgi-a*Kp.*I0i).*Id;
j22_2 = h./Qi.*(g*(VISn.^2).*V2.*(Id.^2)-e*(VISn.^2).*Vdi.*(Id.^2).*(cosgi-a*Kp.*I0i));
i = find(I0r >= I0r_max | I0r <= I0r_min);
if i,
j12_1(i) = VISn(i).*cosar(i).*Id(i);
j22_1(i) = h./Qr(i).*(g*(VISn(i).^2).*V1(i).*(Id(i).^2) - e*(VISn(i).^2).*Vdr(i).*(Id(i).^2).*cosar(i));
end
i = find(I0i >= I0i_max | I0i <= I0i_min);
if i,
j12_2(i) = -VISn(i).*cosgi(i).*Id(i);
j22_2(i) = h./Qi(i).*(g*(VISn(i).^2).*V2(i).*(Id(i).^2) - e*(VISn(i).^2).*Vdi(i).*(Id(i).^2).*cosgi(i));
end
i = find(cosar >= cosar_max | cosar <= cosar_min);
if i,
j12_1(i) = a*VISn(i).*cosar(i).*Id(i);
j22_1(i) = h./Qr(i).*(g*(VISn(i).^2).*V1(i).*(Id(i).^2) - 2*a*(VISn(i).^2).*Vdr(i).*(Id(i).^2).*cosar(i));
end
i = find(cosgi >= cosgi_max | cosgi <= cosgi_min);
if i,
j12_2(i) = -a*VISn(i).*cosgi(i).*Id(i);
j22_2(i) = h./Qi(i).*(g*(VISn(i).^2).*V2(i).*(Id(i).^2) - 2*a*(VISn(i).^2).*Vdi(i).*(Id(i).^2).*cosgi(i));
end
DAE.J12 = DAE.J12 + sparse(Hvdc.bus1,Hvdc.bus1,j12_1,Bus.n,Bus.n);
DAE.J22 = DAE.J12 + sparse(Hvdc.bus1,Hvdc.bus1,j22_1,Bus.n,Bus.n);
DAE.J12 = DAE.J12 + sparse(Hvdc.bus2,Hvdc.bus2,j12_2,Bus.n,Bus.n);
DAE.J22 = DAE.J12 + sparse(Hvdc.bus2,Hvdc.bus2,j22_2,Bus.n,Bus.n);
case 3 % differential equations
I0r = V1./ar;
I0r = min(I0r,I0r_max);
I0r = max(I0r,I0r_min);
I0i = V2./ai;
I0i = min(I0i,I0i_max);
I0i = max(I0i,I0i_min);
cosar = xr+Kp.*(I0r-Id);
cosar = min(cosar,cosar_max);
cosar = max(cosar,cosar_min);
cosgi = xi+Kp.*(Id-I0i);
cosgi = min(cosgi,cosgi_max);
cosgi = max(cosgi,cosgi_min);
a = 3040988094387517/2251799813685248;
b = 95493/100000;
Vdr = a.*V1.*cosar-b.*xcr.*Id;
Sr = a.*VISn.*V1.*Id;
Vdi = a.*V2.*cosgi-b.*xci.*Id;
Si = a.*VISn.*V2.*Id;
DAE.f(Hvdc.Id) = (Rd.*(Vdr-Vdi)-Id)./LdonRd;
DAE.f(Hvdc.xr) = (I0r-Id)./KIinv;
DAE.f(Hvdc.xi) = (Id-I0i)./KIinv;
rectifier = 1;
for i = 1:Hvdc.n
if DAE.x(Hvdc.xr(i)) >= xr_max(i)
DAE.x(Hvdc.xr(i)) = xr_max(i);
if DAE.f(Hvdc.xr(i)) > 0; DAE.f(Hvdc.xr(i)) = 0; end
elseif DAE.x(Hvdc.xr(i)) <= xr_min(i)
DAE.x(Hvdc.xr(i)) = xr_min(i);
if DAE.f(Hvdc.xr(i)) < 0; DAE.f(Hvdc.xr(i)) = 0; end
else
DAE.x(Hvdc.xi(i)) = xi_min(i);
DAE.f(Hvdc.xi(i)) = 0;
cosgi(i) = cosgi_min(i);
Vdi(i) = a*V2(i)*cosgi(i)-b*xci(i)*Id(i);
Si(i) = a*VISn(i)*V2(i)*Id(i);
rectifier = 0;
end
if rectifier
if DAE.x(Hvdc.xi(i)) >= xi_max(i)
DAE.x(Hvdc.xi(i)) = xi_max(i);
if DAE.f(Hvdc.xi(i)) > 0; DAE.f(Hvdc.xi(i)) = 0; end
elseif DAE.x(Hvdc.xi(i)) <= xi_min(i)
DAE.x(Hvdc.xi(i)) = xi_min(i);
if DAE.f(Hvdc.xi(i)) < 0; DAE.f(Hvdc.xi(i)) = 0; end
else
DAE.x(Hvdc.xr(i)) = xr_min(i);
DAE.f(Hvdc.xi(i)) = 0;
cosar(i) = cosar_min(i);
Vdr(i) = a*V1(i)*cosar(i)-b*xcr(i)*Id(i);
Sr(i) = a*VISn(i)*V1(i)*Id(i);
end
end
end
Hvdc.dat(:,1) = cosar;
Hvdc.dat(:,2) = Vdr;
Hvdc.dat(:,3) = Sr;
Hvdc.dat(:,4) = Vdi;
Hvdc.dat(:,5) = Si;
Hvdc.dat(:,6) = cosgi;
Hvdc.dat(:,7) = I0r;
Hvdc.dat(:,8) = I0i;
case 4 % Jacobians of state variables
a = 3040988094387517/2251799813685248;
b = 95493/100000;
c = 9247608590206622002595365425289;
d = 5070602400912917605986812821504;
e = 10141204801825835211973625643008;
g = 18495217180413244005190730850578;
h = 1/4503599627370496;
m = -3040988094387517;
for i = 1:Hvdc.n
Qi = (c*VISn(i)^2*V2(i)^2*Id(i)^2-d*VISn(i)^2*Vdi(i)^2*Id(i)^2)^(1/2);
Qr = (c*VISn(i)^2*V1(i)^2*Id(i)^2-d*VISn(i)^2*Vdr(i)^2*Id(i)^2)^(1/2);
DAE.Fx(Hvdc.Id(i),Hvdc.Id(i)) = (Rd(i)*(-a*V1(i)*Kp(i)-b*xcr(i)-a*Kp(i)*V2(i)+b*xci(i))-1)/LdonRd(i);
DAE.Fx(Hvdc.Id(i),Hvdc.xr(i)) = a*Rd(i)*V1(i)/LdonRd(i);
DAE.Fx(Hvdc.Id(i),Hvdc.xi(i)) = -a*Rd(i)*V2(i)/LdonRd(i);
DAE.Fx(Hvdc.xr(i),Hvdc.Id(i)) = -1/KIinv(i);
DAE.Fx(Hvdc.xi(i),Hvdc.Id(i)) = 1/KIinv(i);
DAE.Fy(Hvdc.xr(i),bus1(i) + Bus.n) = 1/ar(i)/KIinv(i);
DAE.Fy(Hvdc.Id(i),bus1(i) + Bus.n) = Rd(i)*(cosar(i)+a*V1(i)*Kp(i)/ar(i))/LdonRd(i);
DAE.Fy(Hvdc.xi(i),bus2(i) + Bus.n) = -1/ai(i)/KIinv(i);
DAE.Fy(Hvdc.Id(i),bus2(i) + Bus.n) = Rd(i)*(-cosgi(i)+a*Kp(i)*I0i(i))/LdonRd(i);
DAE.Gx(bus1(i),Hvdc.Id(i)) = VISn(i)*(-a*V1(i)*Kp(i)-b*xcr(i))*Id(i)+VISn(i)*Vdr(i);
DAE.Gx(bus1(i),Hvdc.xr(i)) = a*VISn(i)*V1(i)*Id(i);
DAE.Gx(bus1(i) + Bus.n,Hvdc.Id(i)) = h/Qr*(g*VISn(i)^2*V1(i)^2*Id(i)-e*VISn(i)^2*Vdr(i)*Id(i)^2* ...
(-a*V1(i)*Kp(i)-b*xcr(i))-e*VISn(i)^2*Vdr(i)^2*Id(i));
DAE.Gx(bus1(i) + Bus.n,Hvdc.xr(i)) = m/Qr*VISn(i)^2*Vdr(i)*Id(i)^2*V1(i);
DAE.Gx(bus2(i),Hvdc.Id(i)) = -VISn(i)*(a*Kp(i)*V2(i)-b*xci(i))*Id(i)-VISn(i)*Vdi(i);
DAE.Gx(bus2(i),Hvdc.xi(i)) = -a*VISn(i)*V2(i)*Id(i);
DAE.Gx(bus2(i) + Bus.n,Hvdc.Id(i)) = h/Qi*(g*VISn(i)^2*V2(i)^2*Id(i)-e*VISn(i)^2*Vdi(i)*Id(i)^2* ...
(a*Kp(i)*V2(i)-b*xci(i))-e*VISn(i)^2*Vdi(i)^2*Id(i));
DAE.Gx(bus2(i) + Bus.n,Hvdc.xi(i)) = m/Qi*VISn(i)^2*Vdi(i)*Id(i)^2*V2(i);
if I0r(i) >= I0r_max(i) | I0r(i) <= I0r_min(i)
DAE.Fy(Hvdc.xr(i),bus1(i) + Bus.n) = 0;
DAE.Fy(Hvdc.Id(i),bus1(i) + Bus.n) = a*cosar(i)*Rd(i)/LdonRd(i);
end
if I0i(i) >= I0i_max(i) | I0i(i) <= I0i_min(i)
DAE.Fy(Hvdc.xi(i),bus2(i) + Bus.n) = 0;
DAE.Fy(Hvdc.Id(i),bus2(i) + Bus.n) = -a*cosgi(i)*Rd(i)/LdonRd(i);
end
if cosar(i) >= cosar_max(i) | cosar(i) <= cosar_min(i)
DAE.Fx(Hvdc.Id(i),Hvdc.Id(i)) = (Rd(i)*(-b*xcr(i)-a*Kp(i)*V2(i)+b*xci(i))-1)/LdonRd(i);
%DAE.Fx(Hvdc.Id(i),Hvdc.xr(i)) = 0;
DAE.Gx(bus1(i),Hvdc.Id(i)) = VISn(i)*(-b*xcr(i))*Id(i)+VISn(i)*Vdr(i);
%DAE.Gx(bus1(i),Hvdc.xr(i)) = 0;
%DAE.Gx(bus1(i) + Bus.n,Hvdc.xr(i)) = 0;
DAE.Gx(bus1(i) + Bus.n,Hvdc.Id(i)) = h/Qr*(g*VISn(i)^2*V1(i)^2*Id(i) - e*VISn(i)^2*Vdr(i)*Id(i)^2* ...
(-b*xcr(i)) - e*VISn(i)^2*Vdr(i)^2*Id(i));
DAE.Fy(Hvdc.Id(i),bus1(i) + Bus.n) = Rd(i)*a*cosar(i)/LdonRd(i);
end
if cosgi(i) >= cosgi_max(i) | cosgi(i) <= cosgi_min(i)
DAE.Fx(Hvdc.Id(i),Hvdc.Id(i)) = (Rd(i)*(-a*V1(i)*Kp(i)-b*xcr(i)+b*xci(i))-1)/LdonRd(i);
%DAE.Fx(Hvdc.Id(i),Hvdc.xi(i)) = 0;
DAE.Gx(bus2(i),Hvdc.Id(i)) = -VISn(i)*(-b*xci(i))*Id(i)-VISn(i)*Vdi(i);
%DAE.Gx(bus2(i),Hvdc.xi(i)) = 0;
%DAE.Gx(bus2(i) + Bus.n,Hvdc.xi(i)) = 0;
DAE.Gx(bus2(i) + Bus.n,Hvdc.Id(i)) = h/Qi*(g*VISn(i)^2*V2(i)^2*Id(i)-e*VISn(i)^2*Vdi(i)*Id(i)^2* ...
(-b*xci(i))-e*VISn(i)^2*Vdi(i)^2*Id(i));
DAE.Fy(Hvdc.Id(i),bus2(i) + Bus.n) = -Rd(i)*a*cosgi(i)/LdonRd(i);
end
if (DAE.x(Hvdc.xr(i)) >= xr_max(i) | DAE.x(Hvdc.xr(i)) <= xr_min(i)) & (DAE.f(Hvdc.xr(i)) == 0)
DAE.Fx(Hvdc.Id(i),Hvdc.xr(i)) = 0;
DAE.Fx(Hvdc.xr(i),Hvdc.Id(i)) = 0;
DAE.Fx(Hvdc.xr(i),Hvdc.xr(i)) = -1;
DAE.Fy(Hvdc.xr(i),bus1(i) + Bus.n) = 0;
DAE.Gx(bus1(i),Hvdc.xr(i)) = 0;
DAE.Gx(bus1(i) + Bus.n,Hvdc.xr(i)) = 0;
else
DAE.Fx(Hvdc.xr(i),Hvdc.xr(i)) = 0;
end
if (DAE.x(Hvdc.xi(i)) >= xi_max(i) | DAE.x(Hvdc.xi(i)) <= xi_min(i)) & (DAE.f(Hvdc.xi(i)) == 0)
DAE.Fx(Hvdc.Id(i),Hvdc.xi(i)) = 0;
DAE.Fx(Hvdc.xi(i),Hvdc.Id(i)) = 0;
DAE.Fx(Hvdc.xi(i),Hvdc.xi(i)) = -1;
DAE.Fy(Hvdc.xi(i),bus2(i) + Bus.n) = 0;
DAE.Gx(bus2(i),Hvdc.xi(i)) = 0;
DAE.Gx(bus2(i) + Bus.n,Hvdc.xi(i)) = 0;
else
DAE.Fx(Hvdc.xi(i),Hvdc.xi(i)) = 0;
end
end
case 5 % non-windup limiters
Ac_idx = 2*Bus.n+DAE.n;
for i = 1:Hvdc.n
if (DAE.x(Hvdc.xr(i)) >= xr_max(i) | DAE.x(Hvdc.xr(i)) <= xr_min(i)) & (DAE.f(Hvdc.xr(i)) == 0)
k = Hvdc.xr(i);
DAE.tn(k) = 0;
DAE.Ac(:,k) = zeros(Ac_idx,1);
DAE.Ac(k,:) = zeros(1,Ac_idx);
DAE.Ac(k,k) = DAE.Fx(k,k);
end
if (DAE.x(Hvdc.xi(i)) >= xi_max(i) | DAE.x(Hvdc.xi(i)) <= xi_min(i)) & (DAE.f(Hvdc.xi(i)) == 0)
k = Hvdc.xi(i);
DAE.tn(k) = 0;
DAE.Ac(:,k) = zeros(Ac_idx,1);
DAE.Ac(k,:) = zeros(1,Ac_idx);
DAE.Ac(k,k) = DAE.Fx(k,k);
end
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -