ncp_sigmoid/NCP函数法/formHSB.m

201 lines
10 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 [HSB,dhx,dgx,dgxT,N1,H1,diagE,diagF,GIJ,BIJ,L1,U1,LZ,UW]=formHSB(nodeNum,balNode,balNum,opfGoal,lineNum,transNum,lineI,lineJ,...
transI,transJ,T,transG,transB,pgNode,pvNode,G,B,e,f,pgNum,pvNum,pgvNum,xNum,capNum,capI,a,m,r,l,u,z,w,y,H1,N1,diagE,diagF)
%程序功能:预计算过程,形成修正方程系数矩阵
%编写时间2010年11月
%% 形成等式约束雅可比矩阵
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.*transG;
ef1B=ef1.*transB;
ef2G=ef2.*transG;
ef2B=ef2.*transB;
dhPTi=-ef1G+ef2B+2*ef3.*transG.*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.*transB.*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),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]';
%合并形成等式约束雅可比矩阵h(x)
dhx=[dhPT dhQT;dhP;dhQ;dhcapK;dhJacb];
%% 形成不等式约束雅可比矩阵▽g(x)
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)).*transG+(e(transI).*f(transJ)-e(transJ).*f(transI)).*transB;
dgT2=sparse(1:transNum,lineNum-transNum+1:lineNum,dglT,transNum,lineNum);
dgT=[dgT1 dgT2]; %所有不等式对变比求导的模块
dgP=sparse(1:pgNum,transNum+1:transNum+pgNum,ones(pgNum,1),pgNum,r); %所有不等式约束对PG求导的模块
dgQ=sparse(1:pvNum,transNum+pgNum+1:transNum+pgvNum,ones(pvNum,1),pvNum,r); %所有不等式约束对QR求导的模块
dgcapK=sparse(1:capNum,transNum+pgvNum+1:transNum+pgvNum+capNum,ones(capNum,1),capNum,r);%所有不等式约束对capK求导的模块
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,transNum+pgvNum+capNum);
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*transG.*(e(transI)-e(transJ));
d2ftej=-d2ftei;
d2ftfi=-2*transG.*(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);
d2fT0=sparse(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*transB.*(e(transI)-e(transJ));
d2ftej=-d2ftei;
d2ftfi=2*transB.*(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);
d2fT0=sparse(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(B,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);
dhT2=2*ef3.*(transG.*y1(transI)-transB.*y2(transI)); %功率方程对变压器变比求二次偏导所得的列向量
HSdhT=sparse(1:transNum,1:transNum,dhT2,transNum+pgvNum+capNum,transNum+pgvNum+capNum);
eiG=e(transI).*transG;
ejG=e(transJ).*transG;
eiB=e(transI).*transB;
ejB=e(transJ).*transB;
fiG=f(transI).*transG;
fjG=f(transJ).*transG;
fiB=f(transI).*transB;
fjB=f(transJ).*transB;
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);%功率方程先对变比求偏导,再对电压实部求偏导模块
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);%功率方程先对变比求偏导,再对电压虚部求偏导模块
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).*y2(capI),capNum,nodeNum); %功率方程先对capK求偏导再对e求偏导的部分
d2hcap_f=sparse(1:capNum,capI,2*f(capI).*y2(capI),capNum,nodeNum); %功率方程先对capK求偏导再对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(transNum+pgvNum+capNum+nodeNum+1:end)+w(transNum+pgvNum+capNum+nodeNum+1:end);
ZWv=z(transNum+pgvNum+capNum+1:transNum+pgvNum+capNum+nodeNum)+w(transNum+pgvNum+capNum+1:transNum+pgvNum+capNum+nodeNum);
dgeiT=((2*e(transI)-e(transJ)).*transG+f(transJ).*transB).*ZWcl(lineNum-transNum+1:end);
dgejT=(-e(transI).*transG-f(transI).*transB).*ZWcl(lineNum-transNum+1:end);
dgeT=sparse(1:transNum,transI,dgeiT,transNum,nodeNum)+sparse(1:transNum,transJ,dgejT,transNum,nodeNum);%不等式约束先对变比求偏导再对e求偏导的模块
dgfiT=((2*f(transI)-f(transJ)).*transG-e(transJ).*transB).*ZWcl(lineNum-transNum+1:end);
dgfjT=(-f(transI).*transG+e(transI).*transB).*ZWcl(lineNum-transNum+1:end);
dgfT=sparse(1:transNum,transI,dgfiT,transNum,nodeNum)+sparse(1:transNum,transJ,dgfjT,transNum,nodeNum);%不等式约束先对变比求偏导再对f求偏导的模块
HSdgefT=[dgeT dgfT];
HSdgT=[sparse(transNum,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;
HSdgef=sparse(lineI,lineJ,BIJ.*ZWcl,nodeNum,nodeNum)-sparse(lineJ,lineI,BIJ.*ZWcl,nodeNum,nodeNum);
HSdgfe=HSdgef';
HSdgx1=[HSdgee HSdgef;HSdgfe HSdgff]; %所有不等式约束对e、f求二次偏导模块
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);
HSB=sparse(HSB);