ncp_sigmoid/Sigmoid函数法/snd_solve.m

77 lines
2.5 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function [z,l,u,w,x,y,PG,QR,Pg,Qg,e,f,T,G,B,Zt,tij,Zb,Bci,capK,mut,mub]=snd_solve(HSB,const,mu,r,nodeNum,pgNum,pvNum,pgvNum,xNum,transNum,pgNode,pvNode,...
Pg,Qg,m,x,y,z,l,u,w,Lz,Lw,LZ,UW,dgxT,L1,U1,G,B,transI,transJ,T,transG1,transB1,kt0,Tn,mut,oneTrans,q0,capKn,mub,oneCap,capK,capNum,capI,capBi)
%程序功能:连续化处理过程,求解修正方程
%编写时间2010年10月
%% 求解方程,求出各变量的修正量
dX=-HSB\const;
dx=dX(1:xNum,1);
dy=dX(xNum+1:xNum+m,1);
dl=dgxT*dx+Lz;
du=-dgxT*dx-Lw;
Ll=(l.*z-mu*ones(r,1));
Lu=(u.*w+mu*ones(r,1));
diagZ=sparse(1:r,1:r,z,r,r);
diagW=sparse(1:r,1:r,w,r,r);
dz=-LZ*dgxT*dx-L1*(diagZ*Lz+Ll);
dw=UW*dgxT*dx+U1*(diagW*Lw-Lu);
%求最大步长
minusdz=find(dz<0);
dzmin=min(-z(minusdz)./dz(minusdz));
minusdl=find(dl<0);
dlmin=min(-l(minusdl)./dl(minusdl));
minusdw=find(dw>0);
dwmin=min(-w(minusdw)./dw(minusdw));
minusdu=find(du<0);
dumin=min(-u(minusdu)./du(minusdu));
ap=min(dlmin,dumin);
ad=min(dzmin,dwmin);
stepp=0.9995*min(ap,1);
stepd=0.9995*min(ad,1);
%更新变量
x=x+stepp*dx;
l=l+stepp*dl;
u=u+stepp*du;
y=y+stepd*dy;
z=z+stepd*dz;
w=w+stepd*dw;
%保留上一次计算的变比,用于修正节点导纳矩阵
Tlast=T;
capKlast=capK;
%给控制变量、状态变量重新赋值
Zt=x(1:transNum,1);
Zb=x(transNum+pgvNum+1:transNum+pgvNum+capNum);
tij=oneTrans;
Bci=oneCap;
n_zt= Zt<0;
p_zt= Zt>=0;
tij(n_zt)=exp(Zt(n_zt)./mut(n_zt))./(exp(Zt(n_zt)./mut(n_zt))+oneTrans(n_zt));%为了避免计算机溢出对Zt为正为负时分开表达式计算两种表达式等价
tij(p_zt)=oneTrans(p_zt)./(oneTrans(p_zt)+exp(-Zt(p_zt)./mut(p_zt)));
n_zb= Zb<0;
p_zb= Zb>=0;
Bci(n_zb)=exp(Zb(n_zb)./mub(n_zb))./(exp(Zb(n_zb)./mub(n_zb))+oneCap(n_zb));
Bci(p_zb)=oneCap(p_zb)./(oneCap(p_zb)+exp(-Zb(p_zb)./mub(p_zb)));
T=Tn+tij.*kt0; %根据Sigmoid函数更新T和capK
capK=capKn+Bci.*q0;
PG(pgNode,1)=x(transNum+1:transNum+pgNum,1);
QR(pvNode,1)=x(transNum+pgNum+1:transNum+pgNum+pvNum,1);
e=x(transNum+pgNum+pvNum+capNum+1:transNum+pgNum+pvNum+capNum+nodeNum,1);
f=x(transNum+pgNum+pvNum+capNum+nodeNum+1:xNum,1);
Pg(pgNode)=PG(pgNode);
Qg(pvNode)=QR(pvNode);
%% 变比变化后需修正节点导纳矩阵
transG=transG1;
transB=transB1;
G=G-sparse(transI,transI,(T.*T-Tlast.*Tlast).*transG,nodeNum,nodeNum)...
+sparse(transI,transJ,transG.*(T-Tlast),nodeNum,nodeNum)...
+sparse(transJ,transI,transG.*(T-Tlast),nodeNum,nodeNum);
B=B-sparse(transI,transI,(T.*T-Tlast.*Tlast).*transB,nodeNum,nodeNum)...
+sparse(transI,transJ,transB.*(T-Tlast),nodeNum,nodeNum)...
+sparse(transJ,transI,transB.*(T-Tlast),nodeNum,nodeNum)...
+sparse(capI,capI,(capK-capKlast).*capBi,nodeNum,nodeNum);