ncp_sigmoid/NCP函数法/linesearch.m

188 lines
8.6 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 [mk,meritF,stepp,stepd]=linesearch(r,nodeNum,balNode,pgNum,pvNum,pgvNum,xNum,transNum,pgNode,pvNode,m,x,y,z,l,u,w,G,B,transI,transJ,transG,...
transB,transG1,transB1,Tn,capKn,capNum,capI,Tn1,capKn1,PG,QR,Pg,Qg,dx,dl,du,dy,dz,dw,opfGoal,Gama,Arlfa,meritF,k2,mu,T,capK,lineNum,lineI,...
lineJ,Pd,Qd,gxx,gsx,mut,mub,stepp,stepd)
%程序功能:光滑处理过程,求步长
%编写时间2010年11月
mk=0;
kk=k2;
isOK=0;
while isOK==0&&mk<10
%更新临时变量
xk=x+Arlfa.^mk*dx;
lk=l+Arlfa.^mk*dl;
uk=u+Arlfa.^mk*du;
yk=y+Arlfa.^mk*dy;
zk=z+Arlfa.^mk*dz;
wk=w+Arlfa.^mk*dw;
%更新临时控制变量和状态变量的值
Tlastk=T;
capKlastk=capK;
T=xk(1:transNum,1);
capK=xk(transNum+pgvNum+1:transNum+pgvNum+capNum);
PG(pgNode,1)=xk(transNum+1:transNum+pgNum,1);
QR(pvNode,1)=xk(transNum+pgNum+1:transNum+pgNum+pvNum,1);
e=xk(transNum+pgNum+pvNum+capNum+1:transNum+pgNum+pvNum+capNum+nodeNum,1);
f=xk(transNum+pgNum+pvNum+capNum+nodeNum+1:xNum,1);
%变比变化后需修正节点导纳矩阵
G=G-sparse(transI,transI,(T.*T-Tlastk.*Tlastk).*transG1,nodeNum,nodeNum)...
+sparse(transI,transJ,transG1.*(T-Tlastk),nodeNum,nodeNum)...
+sparse(transJ,transI,transG1.*(T-Tlastk),nodeNum,nodeNum);
B=B-sparse(transI,transI,(T.*T-Tlastk.*Tlastk).*transB1,nodeNum,nodeNum)...
+sparse(transI,transJ,transB1.*(T-Tlastk),nodeNum,nodeNum)...
+sparse(transJ,transI,transB1.*(T-Tlastk),nodeNum,nodeNum)...
+sparse(capI,capI,capK-capKlastk,nodeNum,nodeNum);
%% 形成等式约束雅可比矩阵
Ezu=exp(-(T-Tn)./mut);
Ezu_1=exp(-(Tn1-T)./mut);
dT_Zt=1;
dNCPT=-mut.*log(Ezu+Ezu_1); %变比对应的凝聚函数常数项
dNCPT_dt=(Ezu-Ezu_1)./(Ezu+Ezu_1); %凝聚函数对T求一次偏导
transGmut=transG.*dT_Zt;
transBmut=transB.*dT_Zt;
Ezbu=exp((capKn-capK)./mub);
Ezbu_1=exp((capK-capKn1)./mub);
dNCPcap=-mub.*log(Ezbu+Ezbu_1); %电容电抗器对应的凝聚函数常数项
dNCP_dcap=(Ezbu-Ezbu_1)./(Ezbu+Ezbu_1); %凝聚函数对capK求一次偏导
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对变压器变比求偏导
dhNCP_T=sparse(1:transNum,1:transNum,dNCPT_dt,transNum,transNum+capNum);
dhP=sparse(1:pgNum,pgNode,ones(pgNum,1),pgNum,m);
dhQ1=sparse(1:pvNum,pvNode,ones(pvNum,1),pvNum,m-nodeNum);
dhQ=[sparse(pvNum,nodeNum) dhQ1];
dhcapK1=sparse(1:capNum,capI,(e(capI).^2+f(capI).^2),capNum,nodeNum); %2011年10月5日修改去掉.*capBi_dBci
dhNCP_capK=sparse(1:capNum,transNum+1:transNum+capNum,dNCP_dcap,capNum,transNum+capNum);
dhcapK=[sparse(capNum,nodeNum) dhcapK1 dhNCP_capK];
%形成功率方程雅可比矩阵
H1=G*e-B*f;
N1=G*f+B*e;
diagE=sparse(1:nodeNum,1:nodeNum,e,nodeNum,nodeNum);
diagF=sparse(1:nodeNum,1:nodeNum,f,nodeNum,nodeNum);
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]'; %合并形成功率方程的雅可比矩阵
dhT=[dhPT dhQT dhNCP_T]; %合并形成等式约束雅可比矩阵h(x)
dhx=[dhT;dhP;dhQ;dhcapK;dhJacb sparse(2*nodeNum,transNum+capNum)];
%% 形成不等式约束雅可比矩阵▽g(x)
gtransNum=0; %变比上下限约束维数用NCP函数后则不需要再约束其上下限
gcapNum=0;
dgT1=sparse(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]; %所有不等式约束对T求导的模块
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(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(2*nodeNum,gtransNum+pgvNum+gcapNum);
dgvl=[dgve dgle;dgvf dglf];
dgef=[dg0 dgvl]; %所有不等式约束对电压实部、虚部求偏导的模块
dgx=[dgT;dgP;dgQ;dgcapK;dgef]; %不等式约束雅克比矩阵
%% 形成对角阵
Z=sparse(1:r,1:r,zk,r,r);
W=sparse(1:r,1:r,wk,r,r);
L1=sparse(1:r,1:r,1./lk,r,r);
U1=sparse(1:r,1:r,1./uk,r,r);
LZ=L1*Z;
UW=U1*W;
Ll=(lk.*zk-mu*ones(r,1));
Lu=(uk.*wk+mu*ones(r,1));
%% 形成目标函数一阶偏导矩阵▽f(.)
if(opfGoal==2)
dPG=ones(pgNum,1);
dfx=sparse(transNum+1:transNum+pgNum,ones(pgNum,1),dPG,xNum,1);
else if(opfGoal==1)
dPG=2*a(pgNode).*PG(pgNode)+b(pgNode);
dfx=sparse(transNum+1:transNum+pgNum,ones(pgNum,1),dPG,xNum,1);
else if(opfGoal==3)
dfT=-1*transG.*dT_Zt.*((f(transI)-f(transJ)).^2+(e(transI)-e(transJ)).^2);
dfPQ=zeros(pgvNum,1);
dfcapK=zeros(capNum,1);
EE=e*ones(1,nodeNum);
FF=f*ones(1,nodeNum);
dfe=2*sum(G.*(EE-EE'));
dff=2*sum(G.*(FF-FF'));
dfx=[dfT;dfPQ;dfcapK;dfe';dff'];
else if(opfGoal==4)
dfT=1*transB.*dT_Zt.*((f(transI)-f(transJ)).^2+(e(transI)-e(transJ)).^2);
dfPQ=zeros(pgvNum,1);
dfcapK=zeros(capNum,1);
EE=e*ones(1,nodeNum);
FF=f*ones(1,nodeNum);
dfe=-2*sum(B.*(EE-EE'));
dff=-2*sum(B.*(FF-FF'));
dfx=[dfT;dfPQ;dfcapK;dfe';dff'];
end
end
end
end
%% 不等式约束项
gxv=[PG(pgNode);QR(pvNode);e.^2+f.^2];
gxl=(e(lineI).*e(lineI)+f(lineI).*f(lineI)-e(lineI).*e(lineJ)-f(lineI).*f(lineJ)).*GIJ+(e(lineI).*f(lineJ)-e(lineJ).*f(lineI)).*BIJ;%线路功率当前值
gx=[gxv;gxl]; %约束条件当前值
Lz=gx-lk-gxx;
Lw=gx+uk-gsx;
muUL=mu*(U1-L1);
BB1=UW*Lw-LZ*Lz-muUL*ones(r,1);
BB=dhx*yk-dfx+dgx*BB1;
BB(transNum+pgvNum+capNum+nodeNum+balNode,1)=0; %保持平衡节点电压虚部不变始终为0则常数项平衡节点处置0
BB(transNum+pgvNum+capNum+balNode,1)=0;
%% 等式约束不平衡量
Pg(pgNode)=PG(pgNode);
Qg(pvNode)=QR(pvNode);
P=Pg-Pd;
Q=Qg-Qd;
dP=P-diagE*H1-diagF*N1;
dQ=Q-diagF*H1+diagE*N1;
hx=[dP;dQ;dNCPT;dNCPcap]; %修正方程常数项h(x)
const=[BB;hx]; %修正方程常数项向量
L3=-L1*(Z*Lz+Ll);
L4=U1*(W*Lw-Lu);
L5=Lz;
L6=Lw;
f_NCP=[const;L3;L4;L5;L6];
f_NCPsum=(f_NCP'*f_NCP)/2;
maxfk=max(meritF(kk-min(10,kk)+1:end));
f3=maxfk-Gama*(Arlfa.^mk)*meritF(kk);
if f_NCPsum<=f3
isOK=1; %满足条件,跳出
else
mk=mk+1; %不满足条件,继续搜索
end
end
stepp=stepp*Arlfa.^mk;
stepd=stepd*Arlfa.^mk;