stateestimation-ipm/run.asv

152 lines
4.9 KiB
Plaintext
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.

clear
clc
% yalmip('clear')
addpath('.\Powerflow')
[~, ~, ~, ~,Volt,Vangle,Y,Yangle,r,c,newwordParameter,PG,QG,PD,QD,Balance]=pf('ieee14.dat', '0');
%% 量测量
% 电压 节点电流 支路电流 节点功率 支路功率
%%
%% 状态量
% 电压 相角
%%
%% 开始生成量测量
sigma=0.05;% 标准差
%% 电压
%电压幅值
rVolt=Volt; %幅值
BalanceVolt=Volt(Balance);
mVolt=rVolt.*(normrnd(0,sigma,length(Volt),1)+1);%电压量测量
rVAngel=Vangle;
%% 电流
%注入电流
cmpY=Y.*exp(1j*sparse(r,c,Yangle,length(Y),length(Y)));%复数导纳矩阵
cmpV=Volt.*exp(1j*Vangle); %复数电压
cmpI=cmpY*cmpV;% 注入电流
rI=abs(cmpI); %注入电流量测量要的是电流幅值
mI=rI.*(normrnd(0,sigma,length(rI),1)+1);%电流量测量
%% 支路电流
% 支路电流
lineI=newwordParameter.line.lineI;
lineJ=newwordParameter.line.lineJ;
lineR=newwordParameter.line.lineR;
lineX=newwordParameter.line.lineX;
lineB2=newwordParameter.line.lineB2;
lineG=1./lineR;
lineB=1./lineX;
cmpBranchI=(cmpV(lineI)-cmpV(lineJ))./(lineR+1j*lineX);%复数支路电流
rBranchI=abs(cmpBranchI);% 支路电流幅值
mBranchI=rBranchI.*(normrnd(0,sigma,length(rBranchI),1)+1);%支路电流量测量
%% 支路功率
rBranchP=real((cmpV(lineI)-cmpV(lineJ)).*conj(cmpBranchI));
rBranchP=rBranchP(abs(rBranchP)>1e-5);
mBranchP=rBranchP.*(normrnd(0,sigma,length(rBranchP),1)+1);%支路功率量测量
rBranchQ=imag((cmpV(lineI)-cmpV(lineJ)).*conj(cmpBranchI));
rBranchQ=rBranchQ(abs(rBranchQ)>1e-5);
mBranchQ=rBranchQ.*(normrnd(0,sigma,length(rBranchQ),1)+1);%支路功率量测量
%% 注入功率
rPD=PD;
PDi=find(PD~=0);
rQD=QD;
QDi=find(QD~=0);
rPG=PG;
PGi=find(PG~=0);
rQG=QG;
QGi=find(QG~=0);
mPD=rPD.*(normrnd(0,sigma,length(rPD),1)+1);
mQD=rQD.*(normrnd(0,sigma,length(rQD),1)+1);
mPG=rPG.*(normrnd(0,sigma,length(rPG),1)+1);
mQG=rQG.*(normrnd(0,sigma,length(rQG),1)+1);
%% 0注入节点
zerosInjectionIndex=1:length(Volt);
zerosInjectionIndex=zerosInjectionIndex( ~(PD~=0|QD~=0|PG~=0|QG~=0) );
%% 变压器功率
rTransP=TransPower( newwordParameter,cmpY,rVolt,rVAngel );
rTransQ=TransReactivePower( newwordParameter,cmpY,rVolt,rVAngel );
mTransP=rTransP.*(normrnd(0,sigma,length(rTransP),1)+1);
mTransQ=rTransQ.*(normrnd(0,sigma,length(rTransQ),1)+1);
%% 发电机注入功率
% 先找到只有发电机的节点
PDQDi=union(PDi,QDi);
onlyPG=setdiff(PGi,PDQDi);
onlyQG=setdiff(QGi,PDQDi);
%% 冗余度计算
stateVarCount=2*length(Volt);
measurements=length(mVolt)+length(mBranchI)+length(mBranchP)+length(mBranchQ)+length(mPG)+length(mQG)+length(mTransP)+length(mTransQ);
fprintf('冗余度 %f\n',measurements/stateVarCount);
%% Opti ToolBox
Busnum=length(Volt);
%% save
% save('mVolt','mVolt');
% save('mPG','mPG');
% save('mQG','mQG');
% save('mBranchI','mBranchI');
% save('mBranchP','mBranchP');
% save('mBranchQ','mBranchQ');
% save('mTransP','mTransP');
% save('mTransQ','mTransQ');
%% load
% load('mVolt');
% load('mPG');
% load('mQG');
% load('mBranchI');
% load('mBranchP');
% load('mBranchQ');
% load('mTransP');
% load('mTransQ');
%% 自己写的微分代码
% 以下都是Jacobi矩阵
SEVolt=sparse(ones(length(mVolt),1));
SEVAngel=sparse(zeros(length(mVolt),1));
dV_dV=sparse(1:length(mVolt),1:length(mVolt),1,length(mVolt),length(mVolt));%电压量测量的微分
dV_dTyta=sparse(length(mVolt),length(mVolt));
dLPij_dVi=sparse(1:length(lineI),lineJ, ...
-SEVolt(lineJ).*( ...
lineG.*cos(SEVAngel(lineI)-SEVAngel(lineJ)) +lineX.*sin(SEVAngel(lineI)-SEVAngel(lineJ))...
)...
+2*(lineG).*SEVolt(lineI) ...
,length(lineI),length(mVolt));%线路的
dLPij_dVj=sparse(1:length(lineI),lineJ, ...
-SEVolt(lineI).*( ...
lineG.*cos(SEVAngel(lineI)-SEVAngel(lineJ)) +lineX.*sin(SEVAngel(lineI)-SEVAngel(lineJ))...
) ...
,length(lineI),length(mVolt));%线路的
% 处理线路电阻或电抗为0的情况即消除NaN
zerosRXInd=union(find(abs(lineR)<1e-5),find(abs(lineX)<1e-5));
dLPij_dVi=dLPij_dVi(setdiff( 1:size(dLPij_dVi,1),zerosRXInd),:);
dLPij_dVj=dLPij_dVj(setdiff( 1:size(dLPij_dVj,1),zerosRXInd),:);
dLQij_dVi=sparse(1:length(lineI),lineJ, ...
-SEVolt(lineJ).*( ...
lineG.*cos(SEVAngel(lineI)-SEVAngel(lineJ)) -lineX.*sin(SEVAngel(lineI)-SEVAngel(lineJ))...
)...
-2*(lineB+lineB2).*SEVolt(lineI) ...
,length(lineI),length(mVolt));%线路的
dLQij_dVj=sparse(1:length(lineI),lineJ, ...
-SEVolt(lineI).*( ...
lineG.*sin(SEVAngel(lineI)-SEVAngel(lineJ)) -lineX.*cos(SEVAngel(lineI)-SEVAngel(lineJ))...
) ...
,length(lineI),length(mVolt));%线路的
dLQij_dVi=dLQij_dVi(setdiff( 1:size(dLQij_dVi,1),zerosRXInd),:);
dLQij_dVj=dLQij_dVj(setdiff( 1:size(dLQij_dVj,1),zerosRXInd),:);
%% 进入迭代
H=[dV_dV ;dV_dTyta]';
h=SEVolt;
z=mVolt;
W=sparse(1:length(mVolt),1:length(mVolt),1/sigma.^2,length(mVolt),length(mVolt));
G=H'*W*H;
g=-H'*W*(z-h);
% 平衡节点相角恒定;
G(length(mVolt)+Balance,:)=0;
G(:,length(mVolt)+Balance)=0;
G=G+sparse(length(mVolt)+Balance,length(mVolt)+Balance,1,length(mVolt)*2,length(mVolt)*2);
g(length(mVolt)+Balance)=0;
dX=-g\G;
% 更新变量
SEVolt=SEVolt+
%% 输出结果
fprintf('目标函数为:%f\n',fval);
fprintf('相对误差\n');
(abs(rVolt-double(SEVolt)))./(rVolt)
MaxDeviation(rVolt,SEVolt,rVAngel,SEVAngel)
plotAndComparison( rVolt,rVAngel,SEVolt,SEVAngel )
seOpti.fun(x);