MATLAB Answers

0

How to solve the problem about "Conversion to logical from optim.prob​lemdef.Opt​imizationC​onstraint is not possible!"

Asked by Nicholas Deng on 15 Jul 2019
Latest activity Commented on by Matt J
on 22 Jul 2019
batteryNominalEnergy=optimvar('batteryNominalEnergy',1,'LowerBound',0,'UpperBound',20);
powerElectronicsRatedPower=optimvar('powerElectronicsRatedPower',1,'LowerBound',0,'UpperBound',10);
Ppv_load=optimvar('Ppv_load',simTime,1,'LowerBound',0,'UpperBound',9.9824e+03);
Ppv_batt=optimvar('Ppv_batt',simTime,1,'LowerBound',0);
Ppv_grid=optimvar('Ppv_grid',simTime,1,'LowerBound',0,'UpperBound',9.9824e+03);
Pcurtail=optimvar('Pcurtail',simTime,1,'LowerBound',0,'UpperBound',5000);
Pbatt_load=optimvar('Pbatt_load',simTime,1,'LowerBound',0);
Pbatt=Ppv_batt*Eta_inv-Pbatt_load/Eta_inv;
Esoh=optimexpr(simTime,1);
Esoh(1)=1;
if Pbatt(i-1)>=0 %% this line reports the arror
Esoh(i)=Esoh(i-1)-0.2*(sampletime/gvarYEARS2SECONDS/20+0.5*Pbatt(i-1)*sampletime/(batteryNominalEnergy*gvarKWH2WS*Esoh(i-1))/4500);
else
Esoh(i)=Esoh(i-1)-0.2*(sampletime/gvarYEARS2SECONDS/20-0.5*Pbatt(i-1)*sampletime/(batteryNominalEnergy*gvarKWH2WS*Esoh(i-1))/4500);
end
Hi, I have meet the problem in MATLAB using linprog. "Pbatt" can be positive or negative. when it is posive, the battery will be charging. And when it is negetive, the battery will be discharging. The equation above caculates the battery SOH whenever the battery is charging or discharging.
"Pbatt" is calculated from the optimization variables. But if I use "abs(Pbatt)", there will be an error that I can't use abs function.
Appreciate for your help!

  2 Comments

I have a similar problem as yours, please let me know if you find a way to use the abs function, please share. I will do likewise when I find a way around this.
Hi. Recently I'm using another MATLAB tool box which is Yalmip. Maybe you can try it. Or you can try Matt's answer. I will try it, too. Then I will leave my conclusion right here.

Sign in to comment.

1 Answer

Answer by Matt J
on 19 Jul 2019
Edited by Matt J
on 19 Jul 2019
 Accepted Answer

Introduce variables r to represent bounds on Pbatt
r=optimvar('absPbatt',simTime1,'LowerBound',0);
prob.Constraints.r_upper=Pbatt<=r;
prob.Constraints.r_lower=Pbatt>=-r;
This is equivalent to abs(Pbatt)<=r. Now, add sum(r) to your objective
prob.Objective=prob.Objective+sum(r);
and finally
prob.Constraints.SOH = Esoh(2:end)==Esoh(1:end-1)-0.2*(sampletime/gvarYEARS2SECONDS/20+0.5*r(1:end-1)*sampletime/(batteryNominalEnergy*gvarKWH2WS*Esoh(1:end-1))/4500);

  2 Comments

Thank you very much, Matt. I think your answer will help me. I will try it. Then I will leave futher solution about your answer.
Akinkunmi Adegbenro's comment relocated here:
Hi Matt J, please have a look at my question too. I am facing a similar challenge as Nicholas
I am trying copy the idea you shared earlier in your answer, but the last piece of code (i.e. prob.Constraints.SOH) would be different in my case. I am struggling to understand what you did here so I am unable to adapt your answer to my application.

Sign in to comment.