|
|
function [Xnext,Vs,Vinv,S_busInjVec,S_inv_Batt,S_inv_PV,fval,exitflag] = ...
|
|
|
MicrogridSys_ODEAE_expIterSolver(X,Vs,Vinv,Ref,S_slack_ini,S_load_vec,S_DieselG_vec, ...
|
|
|
V_DC,Xm_g,Zmv_g,Y_Bus,controlParams,K_Vdp,K_fdp, ...
|
|
|
BusOfBattery,BusOfPV,dt,Niter)
|
|
|
|
|
|
|
|
|
|
|
|
Nbus = size(Y_Bus,1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Y_Bus = sparse(Y_Bus);
|
|
|
|
|
|
BatteryNum = numel(BusOfBattery);
|
|
|
SolarNum = numel(BusOfPV);
|
|
|
|
|
|
|
|
|
Vs_iter = Vs;
|
|
|
Vinv_iter = Vinv;
|
|
|
X_iter = X;
|
|
|
|
|
|
|
|
|
M = (sqrt(3)/sqrt(2))*0.5*V_DC;
|
|
|
|
|
|
for m = 1:Niter
|
|
|
|
|
|
|
|
|
Yinv_Batt = spalloc(Nbus,Nbus,BatteryNum);
|
|
|
Yinv_PV = spalloc(Nbus,Nbus,SolarNum);
|
|
|
|
|
|
VinvBatt_bus = zeros(Nbus,1);
|
|
|
VinvPV_bus = zeros(Nbus,1);
|
|
|
|
|
|
idx_X = 0;
|
|
|
idx_ref = 0;
|
|
|
idx_Vin = 0;
|
|
|
idx_Xm = 0;
|
|
|
|
|
|
if BatteryNum > 0
|
|
|
for bb = 1:BatteryNum
|
|
|
|
|
|
[Inc1, ~, Edq1] = ode4_singleStep( X_iter(idx_X+1:idx_X+6), dt, ...
|
|
|
@PID_Droopcontroller_DynModel, ...
|
|
|
Ref(idx_ref+1:idx_ref+4), ...
|
|
|
[Vinv_iter(idx_Vin+1); Vs_iter(BusOfBattery(bb))], ...
|
|
|
Xm_g(idx_Xm+1), Zmv_g(idx_Xm+1), controlParams(1:10), K_Vdp, K_fdp );
|
|
|
|
|
|
Xtemp = X_iter(idx_X+1:idx_X+6) + Inc1*dt;
|
|
|
X_iter(idx_X+1:idx_X+6,1) = Xtemp;
|
|
|
|
|
|
|
|
|
th = Xtemp(2);
|
|
|
Ex1 = Edq1(1)*cos(th) - Edq1(2)*sin(th);
|
|
|
Ey1 = Edq1(1)*sin(th) + Edq1(2)*cos(th);
|
|
|
Vinv_iter(idx_Vin+1) = M*(Ex1 + 1j*Ey1);
|
|
|
|
|
|
|
|
|
ii = BusOfBattery(bb);
|
|
|
Yinv_Batt(ii,ii) = Yinv_Batt(ii,ii) + 1/(1j*Xm_g(idx_Xm+1)+Zmv_g(idx_Xm+1));
|
|
|
VinvBatt_bus(ii) = Vinv_iter(idx_Vin+1);
|
|
|
|
|
|
idx_X = idx_X + 6;
|
|
|
idx_ref= idx_ref+ 4;
|
|
|
idx_Xm = idx_Xm + 1;
|
|
|
idx_Vin= idx_Vin+ 1;
|
|
|
end
|
|
|
else
|
|
|
VinvBatt_bus = Vs_iter;
|
|
|
end
|
|
|
|
|
|
if SolarNum > 0
|
|
|
for ss = 1:SolarNum
|
|
|
|
|
|
[Inc2, ~, Edq2] = ode4_singleStep( X_iter(idx_X+1:idx_X+6), dt, ...
|
|
|
@PID_PQcontroller_DynModel, ...
|
|
|
Ref(idx_ref+1:idx_ref+2), ...
|
|
|
[Vinv_iter(idx_Vin+1); Vs_iter(BusOfPV(ss))], ...
|
|
|
Xm_g(idx_Xm+1), Zmv_g(idx_Xm+1), controlParams(11:20) );
|
|
|
|
|
|
Xtemp = X_iter(idx_X+1:idx_X+6) + Inc2*dt;
|
|
|
X_iter(idx_X+1:idx_X+6,1) = Xtemp;
|
|
|
|
|
|
|
|
|
th = Xtemp(2);
|
|
|
Ex2 = Edq2(1)*cos(th) - Edq2(2)*sin(th);
|
|
|
Ey2 = Edq2(1)*sin(th) + Edq2(2)*cos(th);
|
|
|
Vinv_iter(idx_Vin+1) = M*(Ex2 + 1j*Ey2);
|
|
|
|
|
|
|
|
|
jj = BusOfPV(ss);
|
|
|
Yinv_PV(jj,jj) = Yinv_PV(jj,jj) + 1/(1j*Xm_g(idx_Xm+1)+Zmv_g(idx_Xm+1));
|
|
|
VinvPV_bus(jj) = Vinv_iter(idx_Vin+1);
|
|
|
|
|
|
idx_X = idx_X + 6;
|
|
|
idx_ref= idx_ref+ 2;
|
|
|
idx_Xm = idx_Xm + 1;
|
|
|
idx_Vin= idx_Vin+ 1;
|
|
|
end
|
|
|
else
|
|
|
VinvPV_bus = Vs_iter;
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
Vs_init = Vs_iter(2:end);
|
|
|
Vinf = 1+0j;
|
|
|
|
|
|
|
|
|
z0 = [ real(S_slack_ini);
|
|
|
real(Vs_init);
|
|
|
imag(S_slack_ini);
|
|
|
imag(Vs_init) ];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
opts = optimoptions('fsolve', ...
|
|
|
'Display','off',...
|
|
|
'Algorithm','levenberg-marquardt');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[z_sol, fval, exitflag] = fsolve(@(z) complex_power_flow_eq( ...
|
|
|
z, Vinf, Y_Bus, Yinv_Batt, Yinv_PV, VinvBatt_bus, VinvPV_bus, ...
|
|
|
S_load_vec, S_DieselG_vec), z0, opts);
|
|
|
|
|
|
|
|
|
n = numel(z_sol)/2;
|
|
|
Pr = z_sol(1:n);
|
|
|
Qi = z_sol(n+1:end);
|
|
|
VsR = [1; Pr(2:end)];
|
|
|
VsI = [0; Qi(2:end)];
|
|
|
Vs_iter = VsR + 1j*VsI;
|
|
|
|
|
|
|
|
|
if exitflag > 0
|
|
|
z_last = z_sol;
|
|
|
else
|
|
|
|
|
|
z_last = [];
|
|
|
end
|
|
|
end
|
|
|
|
|
|
|
|
|
Xnext = X_iter;
|
|
|
Vs = Vs_iter;
|
|
|
Vinv = Vinv_iter;
|
|
|
|
|
|
S_busInjVec = Vs .* conj(Y_Bus*Vs);
|
|
|
S_inv_Batt = Vs .* conj(Yinv_Batt * (VinvBatt_bus - Vs));
|
|
|
S_inv_PV = Vs .* conj(Yinv_PV * (VinvPV_bus - Vs));
|
|
|
|
|
|
|
|
|
function F = complex_power_flow_eq(decision_real_imag, Vinf, Ybus, Yinv_Batt,Yinv_PV, ...
|
|
|
VinvBatt_bus, VinvPV_bus, S_load, S_DieselG)
|
|
|
n = numel(decision_real_imag)/2;
|
|
|
Real = decision_real_imag(1:n);
|
|
|
Imag = decision_real_imag(n+1:end);
|
|
|
|
|
|
Vs_real = [real(Vinf); Real(2:end)];
|
|
|
Vs_imag = [imag(Vinf); Imag(2:end)];
|
|
|
Vbus = Vs_real + 1i*Vs_imag;
|
|
|
|
|
|
|
|
|
Psl = Real(1); Qsl = Imag(1);
|
|
|
S_sys = zeros(size(S_load));
|
|
|
S_sys(1,1) = Psl + 1j*Qsl;
|
|
|
|
|
|
|
|
|
S_inv = Vbus .* conj(Yinv_Batt * (VinvBatt_bus - Vbus)) + ...
|
|
|
Vbus .* conj(Yinv_PV * (VinvPV_bus - Vbus));
|
|
|
|
|
|
left = Vbus .* conj(Ybus * Vbus);
|
|
|
right = S_inv + S_sys + S_load + S_DieselG;
|
|
|
|
|
|
F = [ real(left - right); imag(left - right) ];
|
|
|
end
|
|
|
|
|
|
function [IncRate,dotX,Edq] = ode4_singleStep(Xin, h, f_dyn, varargin)
|
|
|
X1 = Xin;
|
|
|
[Edq,k1] = f_dyn(varargin{:}, X1);
|
|
|
|
|
|
X2 = Xin + 0.5*h*k1;
|
|
|
[~,k2] = f_dyn(varargin{:}, X2);
|
|
|
|
|
|
X3 = Xin + 0.5*h*k2;
|
|
|
[~,k3] = f_dyn(varargin{:}, X3);
|
|
|
|
|
|
X4 = Xin + h*k3;
|
|
|
[~,k4] = f_dyn(varargin{:}, X4);
|
|
|
|
|
|
IncRate = (k1 + 2*k2 + 2*k3 + k4)/6;
|
|
|
dotX = k1;
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|