ncp_sigmoid/Sigmoid函数法/snd_formHSB.m

263 lines
14 KiB
Matlab
Raw Permalink 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 [HSB,dhx,dgx,dgxT,GIJ,BIJ,L1,U1,LZ,UW,transG,transB,dT_Zt,mut,mub]=snd_formHSB(nodeNum,balNode,opfGoal,lineNum,transNum,lineI,lineJ,transI,transJ,...
T,transG,transB,pgNode,pvNode,G,B,e,f,pgNum,pvNum,pgvNum,xNum,a,m,r,l,u,z,w,y,kt0,mut,Zt,oneTrans,oneCap,Zb,mub,q0,capBi,capNum,capI,tij,Bci,N1,H1,diagE,...
diagF,b0,balNum)
%程序功能:连续化处理过程,形成修正方程系数矩阵
%编写时间2010年10月
%% 修正陡度参数μt
dicVar=[tij;Bci];
tmp1=dicVar.*(1-dicVar);
if sum(tmp1)==0
tmp2=0;
else
tmp2=tmp1/sum(tmp1);
end
tmp3=ones(transNum+capNum,1)./(ones(transNum+capNum,1)+tmp2); %计算每一步迭代中陡度参数的修正量
bk=tmp3*b0;
mut_bk=bk(1:transNum);
mub_bk=bk(transNum+1:end);
smallest=0.0000000001; %当陡度参数已经非常接近0时让其以0.9的速率减小,保证其还能继续下降,
large_mut=find(mut>smallest); %不过只要选择好适当的陡度参数初值和修正参数,陡度参数达到这个精度时基本上都已经收敛
small_mut=find(mut<=smallest);
mut(large_mut)=mut_bk(large_mut).*mut(large_mut);
mut(small_mut)=0.9*mut(small_mut);
large_mub=find(mub>smallest);
small_mub=find(mub<=smallest);
mub(large_mub)=mub_bk(large_mub).*mub(large_mub);
mub(small_mub)=0.9*mub(small_mub);
dT_Zt=oneTrans;
d2T_Zt2=oneTrans;
n_zt= Zt<0; %为了避免指数运算时出现的计算机溢出问题在计算Sigmoid函数及其一、二阶导数时
p_zt= Zt>=0; %区分Zt的正负取值情况采用不同的表达形式两种形式完全等价这是算法得以实现的关键。
n_Ezu=exp(Zt(n_zt)./mut(n_zt));
dT_Zt(n_zt)=kt0(n_zt).*(n_Ezu./(mut(n_zt).*(oneTrans(n_zt)+n_Ezu).^2)); %zt为负时T对zt求一次偏导
d2T_Zt2(n_zt)=(dT_Zt(n_zt)./mut(n_zt)).*(oneTrans(n_zt)-2*n_Ezu./(oneTrans(n_zt)+n_Ezu));%zt为负时T对zt求二次偏导
p_Ezu=exp(-Zt(p_zt)./mut(p_zt));
dT_Zt(p_zt)=kt0(p_zt).*(p_Ezu./(mut(p_zt).*(oneTrans(p_zt)+p_Ezu).^2)); %zt为正时T对zt求一次偏导
d2T_Zt2(p_zt)=(dT_Zt(p_zt)./mut(p_zt)).*(oneTrans(p_zt)-2./(oneTrans(p_zt)+p_Ezu)); %zt为正时T对zt求二次偏导
transGmut=transG.*dT_Zt;
transBmut=transB.*dT_Zt;
dcapK_Zb=oneCap;
d2capK_Zb2=oneCap;
n_zb= Zb<0; %对于Zb同样要区分其正负取值进行计算
p_zb= Zb>=0;
n_Ezbu=exp(Zb(n_zb)./mub(n_zb));
dcapK_Zb(n_zb)=q0.*(n_Ezbu./(mub(n_zb).*(oneCap(n_zb)+n_Ezbu).^2)); %zb为负时capK对zb求一次偏导
d2capK_Zb2(n_zb)=(dcapK_Zb(n_zb)./mub(n_zb)).*(oneCap(n_zb)-2*n_Ezbu./(oneCap(n_zb)+n_Ezbu));%zb为负时capK对zb求二次偏导
p_Ezbu=exp(-Zb(p_zb)./mub(p_zb));
dcapK_Zb(p_zb)=q0.*(p_Ezbu./(mub(p_zb).*(oneCap(p_zb)+p_Ezbu).^2)); %zb为正时capK对zb求一次偏导
d2capK_Zb2(p_zb)=(dcapK_Zb(p_zb)./mub(p_zb)).*(oneCap(p_zb)-2./(oneCap(p_zb)+p_Ezbu));%zb为正时capK对zb求二次偏导
capBi_dBci=capBi.*dcapK_Zb;
%% 形成等式约束雅可比矩阵
ef1=e(transI).*e(transJ)+f(transI).*f(transJ);
ef2=e(transI).*f(transJ)-e(transJ).*f(transI);
ef3=e(transI).*e(transI)+f(transI).*f(transI);
ef1G=ef1.*transGmut;
ef1B=ef1.*transBmut;
ef2G=ef2.*transGmut;
ef2B=ef2.*transBmut;
dhPTi=-ef1G+ef2B+2*ef3.*transGmut.*T;
dhPTj=-ef1G-ef2B;
dhPT=sparse(1:transNum,transI,dhPTi,transNum,nodeNum)+sparse(1:transNum,transJ,dhPTj,transNum,nodeNum);%有功平衡方程P对变压器变比求偏导
dhQTi=ef1B+ef2G-2*ef3.*transBmut.*T;
dhQTj=ef1B-ef2G;
dhQT=sparse(1:transNum,transI,dhQTi,transNum,nodeNum)+sparse(1:transNum,transJ,dhQTj,transNum,nodeNum);%无功平衡方程Q对变压器变比求偏导
dhP=sparse(1:pgNum,pgNode,ones(pgNum,1),pgNum,m);
dhQ1=sparse(1:pvNum,pvNode,ones(pvNum,1),pvNum,nodeNum);
dhQ=[sparse(pvNum,nodeNum) dhQ1];
dhcapK1=sparse(1:capNum,capI,(e(capI).^2+f(capI).^2).*capBi_dBci,capNum,nodeNum);%功率平衡方程对电容电抗器组数求偏导
dhcapK=[sparse(capNum,nodeNum) dhcapK1];
%功率方程雅可比矩阵
deG=diagE*G;
dfB=diagF*B;
deB=diagE*B;
dfG=diagF*G;
dH1=sparse(1:nodeNum,1:nodeNum,H1,nodeNum,nodeNum);
dN1=sparse(1:nodeNum,1:nodeNum,N1,nodeNum,nodeNum);
Hij=-dH1-deG-dfB;
Nij=-dN1+deB-dfG;
Jij=dN1-dfG+deB;
Lij=-dH1+dfB+deG;
dhJacb=[Hij Nij;Jij Lij]'; %合并形成功率方程雅可比矩阵
dhx=[dhPT dhQT;dhP;dhQ;dhcapK;dhJacb]; %合并形成等式约束雅可比矩阵h(x)
%% 形成不等式约束雅可比矩阵▽g(x)
gtransNum=transNum; %在原来变比和电容电抗器上下限不等式约束的模块替换为Zt、Zb的上下限不等式约束
gcapNum=capNum;
dgT1=sparse(1:transNum,1:transNum,ones(transNum,1),transNum,r-lineNum);
dglT=(e(transI).^2+f(transI).^2-e(transI).*e(transJ)-f(transI).*f(transJ))...
.*transGmut+(e(transI).*f(transJ)-e(transJ).*f(transI)).*transBmut;
dgT2=sparse(1:transNum,lineNum-transNum+1:lineNum,dglT,transNum,lineNum);
dgT=[dgT1 dgT2]; %所有不等式对Zt求导的模块
dgP=sparse(1:pgNum,gtransNum+1:gtransNum+pgNum,ones(pgNum,1),pgNum,r); %所有不等式约束对P求导的模块
dgQ=sparse(1:pvNum,gtransNum+pgNum+1:gtransNum+pgvNum,ones(pvNum,1),pvNum,r);%所有不等式约束对Q求导的模块
dgcapK=sparse(1:capNum,transNum+pgvNum+1:transNum+pgvNum+capNum,ones(capNum,1),capNum,r);%所有不等式约束对Zb求导的模块
dgve=2*diagE;
dgvf=2*diagF;
sizeG=size(G);
GIJ=G(sub2ind(sizeG,lineI,lineJ));
BIJ=B(sub2ind(sizeG,lineI,lineJ));
dgleI=(2*e(lineI)-e(lineJ)).*GIJ+f(lineJ).*BIJ;
dgleJ=-e(lineI).*GIJ-f(lineI).*BIJ;
dglfI=(2*f(lineI)-f(lineJ)).*GIJ-e(lineJ).*BIJ;
dglfJ=-f(lineI).*GIJ+e(lineI).*BIJ;
dgle=sparse(lineI,(1:lineNum),dgleI,nodeNum,lineNum)+sparse(lineJ,(1:lineNum),dgleJ,nodeNum,lineNum);
dglf=sparse(lineI,(1:lineNum),dglfI,nodeNum,lineNum)+sparse(lineJ,(1:lineNum),dglfJ,nodeNum,lineNum);
dg0=sparse(m,gtransNum+pgvNum+gcapNum);
dgvl=[dgve dgle;dgvf dglf];
dgef=[dg0 dgvl]; %所有不等式约束对电压实部、虚部求偏导的模块
dgx=[dgT;dgP;dgQ;dgcapK;dgef]; %不等式约束雅克比矩阵
%% 形成对角阵
Z=sparse(1:r,1:r,z,r,r);
W=sparse(1:r,1:r,w,r,r);
L1=sparse(1:r,1:r,1./l,r,r);
U1=sparse(1:r,1:r,1./u,r,r);
LZ=L1*Z;
UW=U1*W;
%% 形成海森伯矩阵
%目标函数的海森伯矩阵▽2f(x)
if(opfGoal==2) %目标为有功出力最小
HSdfx=sparse(xNum,xNum);
else if(opfGoal==1)
HSdfx=sparse(transNum+1:transNum+pgNum,transNum+1:transNum+pgNum,2*a(pgNode),xNum,xNum);%仅目标函数对PG求偏导处的对角元为非零元素其他都为0(目标为发电耗量最小)
else if(opfGoal==3)
d2ftei=-2*transGmut.*(e(transI)-e(transJ));
d2ftej=-d2ftei;
d2ftfi=-2*transGmut.*(f(transI)-f(transJ));
d2ftfj=-d2ftfi;
d2fte=sparse(1:transNum,transI,d2ftei,transNum,nodeNum)+sparse(1:transNum,transJ,d2ftej,transNum,nodeNum);
d2ftf=sparse(1:transNum,transI,d2ftfi,transNum,nodeNum)+sparse(1:transNum,transJ,d2ftfj,transNum,nodeNum);
d2fT2=-transG.*d2T_Zt2.*((f(transI)-f(transJ)).^2+(e(transI)-e(transJ)).^2);
d2fT0=sparse(1:transNum,1:transNum,d2fT2,transNum,transNum+pgvNum+capNum);
d2fT=[d2fT0 d2fte d2ftf];
d2fPGQR=sparse(pgvNum,xNum);
d2fcapK=sparse(capNum,xNum);
d2fee=2*(G-sparse(1:nodeNum,1:nodeNum,sum(G,2),nodeNum,nodeNum));
d2fff=d2fee;
zero_nodeNum=sparse(nodeNum,nodeNum);
d2f_ef_ef=[d2fee zero_nodeNum;zero_nodeNum d2fff];
d2efT=[d2fte d2ftf]';
d2f_ef=[d2efT sparse(2*nodeNum,pgvNum+capNum) d2f_ef_ef];
HSdfx=[d2fT;d2fPGQR;d2fcapK;d2f_ef];
else if(opfGoal==4)
d2ftei=2*transBmut.*(e(transI)-e(transJ));
d2ftej=-d2ftei;
d2ftfi=2*transBmut.*(f(transI)-f(transJ));
d2ftfj=-d2ftfi;
d2fte=sparse(1:transNum,transI,d2ftei,transNum,nodeNum)+sparse(1:transNum,transJ,d2ftej,transNum,nodeNum);
d2ftf=sparse(1:transNum,transI,d2ftfi,transNum,nodeNum)+sparse(1:transNum,transJ,d2ftfj,transNum,nodeNum);
d2fT2=transB.*d2T_Zt2.*((f(transI)-f(transJ)).^2+(e(transI)-e(transJ)).^2);
d2fT0=sparse(1:transNum,1:transNum,d2fT2,transNum,transNum+pgvNum+capNum);
d2fT=[d2fT0 d2fte d2ftf];
d2fPGQR=sparse(pgvNum,xNum);
d2fcapK=sparse(capNum,xNum);
d2fee=-2*(B-sparse(1:nodeNum,1:nodeNum,sum(G,2),nodeNum,nodeNum));
d2fff=d2fee;
zero_nodeNum=sparse(nodeNum,nodeNum);
d2f_ef_ef=[d2fee zero_nodeNum;zero_nodeNum d2fff];
d2efT=[d2fte d2ftf]';
d2f_ef=[d2efT sparse(2*nodeNum,pgvNum+capNum) d2f_ef_ef];
HSdfx=[d2fT;d2fPGQR;d2fcapK;d2f_ef];
end
end
end
end
%等式约束海森伯矩阵与拉格朗日乘子y的乘积▽2h(x)*y
y1=y(1:nodeNum,1);
y2=y(nodeNum+1:2*nodeNum,1);
ef1Gd2=ef1.*transG.*d2T_Zt2;
ef1Bd2=ef1.*transB.*d2T_Zt2;
ef2Gd2=ef2.*transG.*d2T_Zt2;
ef2Bd2=ef2.*transB.*d2T_Zt2;
d2P_T2=(-ef1Gd2+ef2Bd2+2*ef3.*transG.*(dT_Zt.^2+T.*d2T_Zt2)).*y1(transI)+(-ef1Gd2-ef2Bd2).*y1(transJ);
d2Q_T2=(ef1Bd2+ef2Gd2-2*ef3.*transB.*(dT_Zt.^2+T.*d2T_Zt2)).*y2(transI)+(ef1Bd2-ef2Gd2).*y2(transJ);
dhT2=d2P_T2+d2Q_T2; %功率方程对变压器Zt求二次偏导所得的列向量
HSdhT=sparse(1:transNum,1:transNum,dhT2,transNum+pgvNum+capNum,transNum+pgvNum+capNum)+...
sparse(transNum+pgvNum+1:transNum+pgvNum+capNum,transNum+pgvNum+1:transNum+pgvNum+capNum,...
(e(capI).^2+f(capI).^2).*d2capK_Zb2.*y2(capI),transNum+pgvNum+capNum,transNum+pgvNum+capNum);
eiG=e(transI).*transGmut;
ejG=e(transJ).*transGmut;
eiB=e(transI).*transBmut;
ejB=e(transJ).*transBmut;
fiG=f(transI).*transGmut;
fjG=f(transJ).*transGmut;
fiB=f(transI).*transBmut;
fjB=f(transJ).*transBmut;
ejG_fjB=ejG-fjB;
ejGfjB=ejG+fjB;
fjGejB=fjG+ejB;
ejB_fjG=ejB-fjG;
eiGfiB=eiG+fiB;
eiG_fiB=eiG-fiB;
eiB_fiG=eiB-fiG;
fiGeiB=fiG+eiB;
dP2_ei_t=(4*eiG.*T-ejG_fjB).*y1(transI)-ejGfjB.*y1(transJ);
dP2_ej_t=-eiGfiB.*y1(transI)-eiG_fiB.*y1(transJ);
dQ2_ei_t=(-4*eiB.*T+fjGejB).*y2(transI)+ejB_fjG.*y2(transJ);
dQ2_ej_t=eiB_fiG.*y2(transI)+fiGeiB.*y2(transJ);
HSdh_et=sparse(1:transNum,transI,dP2_ei_t+dQ2_ei_t,transNum,nodeNum)+sparse(1:transNum,transJ,dP2_ej_t+dQ2_ej_t,transNum,nodeNum);%功率方程先对Zt求偏导再对电压实部求偏导模块
dP2_fi_t=(4*fiG.*T-fjGejB).*y1(transI)+ejB_fjG.*y1(transJ);
dP2_fj_t=eiB_fiG.*y1(transI)-fiGeiB.*y1(transJ);
dQ2_fi_t=(-4*fiB.*T-ejG_fjB).*y2(transI)+ejGfjB.*y2(transJ);
dQ2_fj_t=eiGfiB.*y2(transI)-eiG_fiB.*y2(transJ);
HSdh_ft=sparse(1:transNum,transI,dP2_fi_t+dQ2_fi_t,transNum,nodeNum)+sparse(1:transNum,transJ,dP2_fj_t+dQ2_fj_t,transNum,nodeNum);%功率方程先对Zt求偏导再对电压虚部求偏导模块
HSdh_eft=[HSdh_et HSdh_ft];
HSdh_tef=HSdh_eft';
HSdhPQ=sparse(pgvNum,2*nodeNum); %功率方程先对PG、QR求偏导再对其他变量求偏导的部分
d2hcap_e=sparse(1:capNum,capI,2*e(capI).*capBi_dBci.*y2(capI),capNum,nodeNum); %功率方程先对Zb求偏导再对e求偏导的部分
d2hcap_f=sparse(1:capNum,capI,2*f(capI).*capBi_dBci.*y2(capI),capNum,nodeNum); %功率方程先对Zb求偏导再对f求偏导的部分
HSdhcap_ef=[d2hcap_e d2hcap_f];
d2htPQ_ef=[HSdh_eft;HSdhPQ;HSdhcap_ef];
HSdhtPQ=[HSdhT d2htPQ_ef];
HSdhx1=sparse(m,pgvNum);
%潮流方程海森矩阵
diagy1=sparse(1:nodeNum,1:nodeNum,y1,nodeNum,nodeNum);
diagy2=sparse(1:nodeNum,1:nodeNum,y2,nodeNum,nodeNum);
HSdhey=-diagy1*G+diagy2*B+(-G*diagy1+B*diagy2);
HSdhefy=diagy1*B+diagy2*G-(B*diagy1+G*diagy2);
HSdhx2=[HSdhey HSdhefy;HSdhefy' HSdhey];
HSdhx=[HSdhtPQ;HSdh_tef HSdhx1 HSdhcap_ef' HSdhx2];
%形成不等式约束二阶偏导的矩阵▽2g(x)*(z+w)
ZWcl=z(gtransNum+pgvNum+gcapNum+nodeNum+1:end)+w(gtransNum+pgvNum+gcapNum+nodeNum+1:end);
ZWv=z(gtransNum+pgvNum+gcapNum+1:gtransNum+pgvNum+gcapNum+nodeNum)+w(gtransNum+pgvNum+gcapNum+1:gtransNum+pgvNum+gcapNum+nodeNum);
dg2T=((e(transI).^2+f(transI).^2-e(transI).*e(transJ)-f(transI).*f(transJ)).*transG.*d2T_Zt2+...
(e(transI).*f(transJ)-e(transJ).*f(transI)).*transB.*d2T_Zt2).*ZWcl(lineNum-transNum+1:end);
HSdg2T=sparse(1:transNum,1:transNum,dg2T,transNum,transNum); %不等式对Zt求二次偏导模块
dgeiT=((2*e(transI)-e(transJ)).*transGmut+f(transJ).*transBmut).*ZWcl(lineNum-transNum+1:end);
dgejT=(-e(transI).*transGmut-f(transI).*transBmut).*ZWcl(lineNum-transNum+1:end);
dgeT=sparse(1:transNum,transI,dgeiT,transNum,nodeNum)+sparse(1:transNum,transJ,dgejT,transNum,nodeNum);%不等式约束先对Zt求偏导再对e求偏导的模块
dgfiT=((2*f(transI)-f(transJ)).*transGmut-e(transJ).*transBmut).*ZWcl(lineNum-transNum+1:end);
dgfjT=(-f(transI).*transGmut+e(transI).*transBmut).*ZWcl(lineNum-transNum+1:end);
dgfT=sparse(1:transNum,transI,dgfiT,transNum,nodeNum)+sparse(1:transNum,transJ,dgfjT,transNum,nodeNum);%不等式约束先对Zt求偏导再对f求偏导的模块
HSdgefT=[dgeT dgfT];
HSdgT=[HSdg2T sparse(transNum,pgvNum+capNum) HSdgefT];
HSdgee=sparse(lineI,lineI,2*GIJ.*ZWcl,nodeNum,nodeNum)-sparse(lineI,lineJ,GIJ.*ZWcl,nodeNum,nodeNum)-...
sparse(lineJ,lineI,GIJ.*ZWcl,nodeNum,nodeNum)+sparse(1:nodeNum,1:nodeNum,2*ZWv,nodeNum,nodeNum);
HSdgff=HSdgee; %所有不等式约束对e、f求二次偏导模块
HSdgef=sparse(lineI,lineJ,BIJ.*ZWcl,nodeNum,nodeNum)-sparse(lineJ,lineI,BIJ.*ZWcl,nodeNum,nodeNum);
HSdgfe=HSdgef';
HSdgx1=[HSdgee HSdgef;HSdgfe HSdgff];
HSdgxtPQ_0=sparse(pgvNum+capNum,xNum);
HSdgef_0=[HSdgefT' sparse(2*nodeNum,pgvNum+capNum)];
HSdgx=[HSdgT;HSdgxtPQ_0;HSdgef_0 HSdgx1]; %合成不等式约束海森矩阵
%求和形成H(.)矩阵.
dgxT=dgx'; %求dgx的转置
MULdgx=dgx*(UW-LZ)*dgxT;
H=HSdhx+HSdgx-HSdfx+MULdgx; %求和形成H(.)矩阵.
%% 根据以上所求的各个矩阵合成海森伯矩阵
HSB0=sparse(m,m);
HSB=[H dhx;dhx' HSB0];
balN=transNum+pgvNum+capNum+nodeNum+balNode;
HSB(balN,:)=0; %保持平衡节点电压虚部不变始终为0即将海森矩阵中平衡节点虚部所对应的行列元素置0对角元素置1
HSB(:,balN)=0;
HSB_balN=sub2ind(size(HSB),balN,balN);
HSB(HSB_balN)=ones(balNum,1);
balN1=transNum+pgvNum+capNum+balNode;
HSB(balN1,:)=0; %保持平衡节点电压实部不变始终为0即将海森矩阵中平衡节点实部所对应的行列元素置0对角元素置1
HSB(:,balN1)=0;
HSB_balN1=sub2ind(size(HSB),balN1,balN1);
HSB(HSB_balN1)=ones(balNum,1);