From d4119727516cee940ddc786513b4b5d2d6b3484b Mon Sep 17 00:00:00 2001 From: "dugg@lab-desk" Date: Mon, 10 Nov 2014 10:21:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A6=82=E6=9E=9C=E8=99=9A=E6=8B=9F=E7=94=B5?= =?UTF-8?q?=E5=8E=8B=E6=96=B9=E5=B7=AE=E5=A4=AA=E5=B0=8F=EF=BC=8C=E5=B0=B1?= =?UTF-8?q?=E4=BC=9A=E4=B8=8D=E5=AE=B9=E6=98=93=E6=94=B6=E6=95=9B=E3=80=82?= =?UTF-8?q?=E8=A6=81=E9=99=90=E5=88=B6=E6=96=B9=E5=B7=AE=E5=A4=AA=E5=B0=8F?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dugg@lab-desk --- IPMLoop.m | 12 ++++++++---- run.m | 23 +++++++++++++---------- test.m | 6 +++++- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/IPMLoop.m b/IPMLoop.m index f079c3b..939ca8c 100644 --- a/IPMLoop.m +++ b/IPMLoop.m @@ -1,4 +1,4 @@ -function [ V1r,V1i,I1r,I1i ] = IPMLoop(V1measurement,wV1r,wV1i,I1measurement,wI1r,wI1i,BalI1r,BalI1i,busNum,Loadi,fsY1,Balance,Vref ) +function [ V1r,V1i,I1r,I1i,isConverged ] = IPMLoop(V1measurement,wV1r,wV1i,I1measurement,wI1r,wI1i,BalI1r,BalI1i,busNum,Loadi,fsY1,Balance,Vref ) %把每个序的循环写在这个函数中。其实也就是内点法循环。 V1r=1*ones(busNum,1); V1i=0*ones(busNum,1); @@ -23,7 +23,7 @@ Init_U=1*sparse(ones(RestraintCount,1)); Init_Y=sparse(2*busNum,1);%等式约束乘子 Gap=(Init_L'*Init_Z-Init_U'*Init_W); kmax=60; -while(abs(Gap)>0.000001) +while(abs(Gap)>0.00001) if KK>kmax break; end @@ -84,7 +84,11 @@ while(abs(Gap)>0.000001) fprintf('Gap %f\n',full(Gap)); KK=KK+1; end -f=sum(([real(I1measurement);imag(I1measurement)]-[I1r;I1i]).^2)+sum((real(V1measurement)-V1r(Loadi)).^2)+sum((imag(V1measurement)-V1i(Loadi)).^2); - +% f=sum(([real(I1measurement);imag(I1measurement)]-[I1r;I1i]).^2)+sum((real(V1measurement)-V1r(Loadi)).^2)+sum((imag(V1measurement)-V1i(Loadi)).^2); +if abs(Gap)<0.00001 + isConverged=1; +else + isConverged=0; +end end diff --git a/run.m b/run.m index 9964043..df9c356 100644 --- a/run.m +++ b/run.m @@ -1,4 +1,4 @@ -function [JMeasurement,SEMeasurement,SEMeasurementNOPQ,SEMeasurementM,SEMeasurementNOPQM]=run() +function [JMeasurement,SEMeasurement,SEMeasurementNOPQ,SEMeasurementM,SEMeasurementNOPQM,isConverged]=run() %% 利用先把负荷转换为电流的方法。这个方法要求知道电压量。 % close all @@ -146,9 +146,9 @@ mphaseASpotLoadQ=phaseASpotLoadQ.*(1+normrnd(0,sigma,length(phaseASpotLoadQ),1)) mphaseBSpotLoadQ=phaseBSpotLoadQ.*(1+normrnd(0,sigma,length(phaseBSpotLoadQ),1)); mphaseCSpotLoadQ=phaseCSpotLoadQ.*(1+normrnd(0,sigma,length(phaseCSpotLoadQ),1)); %电压量测量 -mVoltpA=VoltpA.*(1+normrnd(0,sigma,length(VoltpA),1)); -mVoltpB=VoltpB.*(1+normrnd(0,sigma,length(VoltpB),1)); -mVoltpC=VoltpC.*(1+normrnd(0,sigma,length(VoltpC),1)); +% mVoltpA=VoltpA.*(1+normrnd(0,sigma,length(VoltpA),1)); +% mVoltpB=VoltpB.*(1+normrnd(0,sigma,length(VoltpB),1)); +% mVoltpC=VoltpC.*(1+normrnd(0,sigma,length(VoltpC),1)); % mVoltpA=abs(VoltpA).*(1+normrnd(0,sigma,length(VoltpA),1)); mVoltpB=abs(VoltpB).*(1+normrnd(0,sigma,length(VoltpB),1)).*exp(1j*-120/180*pi); @@ -181,7 +181,6 @@ mIf2=-mIf2; %% 设定量测误差 %% 先算正序的 %平衡节点电流 -fprintf('正序\n'); BalI1r=real(-sum(rIf1)); BalI1i=imag(-sum(rIf1)); %电压 @@ -204,13 +203,13 @@ I1measurement=mIf1(Loadi); %正序测量误差的第二种形式 wV1r=abs(real(V1measurement)).*sigma; wV1i=abs(imag(V1measurement)).*sigma; +wV1i(abs(wV1i)<1e-5)=1e10; wI1r=abs(real(I1measurement)).*sigma; wI1i=abs(imag(I1measurement)).*sigma; % [ V1r,V1i,I1r,I1i ]=IPMLoop(V1measurement,wV1r,wV1i,I1measurement,wI1r,wI1i,BalI1r,BalI1i,busNum,Loadi,fsY11,Balance,1 ); % f=sum(([real(I1measurement);imag(I1measurement)]-[I1r;I1i]).^2)+sum((real(rV1)-V1r).^2)+sum((imag(rV1)-V1i).^2); % fprintf('目标值 %f\n',full(f)); %% 算负序的 -fprintf('负序\n'); BalI2r=real(-sum(rIf2)); BalI2i=imag(-sum(rIf2)); %电压 @@ -239,7 +238,6 @@ wI2i=abs(imag(I2measurement)).*sigma; % f=sum(([real(I2measurement);imag(I2measurement)]-[I2r;I2i]).^2)+sum((real(rV2)-V2r).^2)+sum((imag(rV2)-V2i).^2); % fprintf('目标值 %f\n',full(f)); %% 算零序 -fprintf('零序\n'); BalI0r=real(-sum(rIf0)); BalI0i=imag(-sum(rIf0)); %电压 @@ -269,13 +267,16 @@ tic for II=1:3 if II==1 - [ V1r,V1i,I1r,I1i ]=IPMLoop(V1measurement,wV1r,wV1i,I1measurement,wI1r,wI1i,BalI1r,BalI1i,busNum,Loadi,fsY11,Balance,1 ); + fprintf('正序\n'); + [ V1r,V1i,I1r,I1i,isConverged1 ]=IPMLoop(V1measurement,wV1r,wV1i,I1measurement,wI1r,wI1i,BalI1r,BalI1i,busNum,Loadi,fsY11,Balance,1 ); end if II==2 - [ V2r,V2i,I2r,I2i ]=IPMLoop(V2measurement,wV2r,wV2i,I2measurement,wI2r,wI2i,BalI2r,BalI2i,busNum,Loadi,fsY22,Balance,0 ); + fprintf('负序\n'); + [ V2r,V2i,I2r,I2i,isConverged2 ]=IPMLoop(V2measurement,wV2r,wV2i,I2measurement,wI2r,wI2i,BalI2r,BalI2i,busNum,Loadi,fsY22,Balance,0 ); end if II==3 - [ V0r,V0i,I0r,I0i ]=IPMLoop(V0measurement,wV0r,wV0i,I0measurement,wI0r,wI0i,BalI0r,BalI0i,busNum,Loadi,fsY00,Balance,0 ); + fprintf('零序\n'); + [ V0r,V0i,I0r,I0i,isConverged0 ]=IPMLoop(V0measurement,wV0r,wV0i,I0measurement,wI0r,wI0i,BalI0r,BalI0i,busNum,Loadi,fsY00,Balance,0 ); end end @@ -359,4 +360,6 @@ SEMeasurementM=(SEMeasurementM/mCount)^.5; %没有PD,QD的 SEMeasurementNOPQM=sum(sum((( abs(rVoltABCV)-abs(mVoltABCV))./abs(mVoltABCV)./sigma).^2)); SEMeasurementNOPQM=(SEMeasurementNOPQM/mCount)^.5; +%返回收敛信息 +isConverged=isConverged1*isConverged2*isConverged0; end \ No newline at end of file diff --git a/test.m b/test.m index 69bca8d..b34017e 100644 --- a/test.m +++ b/test.m @@ -8,7 +8,11 @@ SEMeasurementMSum=0; SEMeasurementNOPQMSum=0; N=1000; for I=1:N - [JMeasurement,SEMeasurement,SEMeasurementNOPQ,SEMeasurementM,SEMeasurementNOPQM]=run(); + [JMeasurement,SEMeasurement,SEMeasurementNOPQ,SEMeasurementM,SEMeasurementNOPQM,isConverged]=run(); + if isConverged==0 + I=I-1; + continue + end % [JMeasurement]=run(); JMeasurementSum=JMeasurement+JMeasurementSum; SEMeasurementSum=SEMeasurement+SEMeasurementSum;