V2H Optimization: No feasible solution found

I have some troubles to code an optimization Problem in Matlab. Since this is my first optimization i am a bit lost. This code is not running because "Linprog stopped because no point satisfies the constraints.". But I fail to see which constraint is prohibiting the code from running.
T = length(PV); % Anzahl der Zeitschritte
Unrecognized function or variable 'PV'.
% Problem
prob = optimproblem;
% battery storage system parameter
BSS_Pmax = 11; % max power
BSS_Emax = 100; % max energy
% battery variables
BSS_ch = optimvar('BSS_ch', T, 'LowerBound', 0, 'UpperBound', BSS_Pmax);
BSS_disch = optimvar('BSS_disch', T, 'LowerBound', 0, 'UpperBound', BSS_Pmax);
BSS_SOC = optimvar('BSS_SOC', T, 'LowerBound', 0, 'UpperBound', BSS_Emax);
% other variables
Grid_Import = optimvar('Grid_Import', T, 'LowerBound', 0);
% battery constraints
prob.Constraints.energyStorage = optimconstr(T);
prob.Constraints.energyStorage = BSS_SOC(1) == 0;
prob.Constraints.energyStorage = BSS_SOC(2:T) == BSS_SOC(1:T-1) - BSS_disch(2:T) + BSS_ch(2:T);
% energy flow
prob.Constraints.EnergyBalance = Grid_Import == Bedarf - PV - BSS_disch + BSS_ch;
% cost funtion
cost = Grid_Import .* Price;
prob.ObjectiveSense = 'minimize';
prob.Objective = sum(cost);
% solve
[x, fval] = solve(prob);
% optional display
%disp(x.BSS_ch);
%disp(x.BSS_disch);

 Risposta accettata

Torsten
Torsten il 21 Mag 2024
Modificato: Torsten il 21 Mag 2024
Use
energyStorage = optimconstr(T);
energyStorage(1) = BSS_SOC(1) == 0;
energyStorage(2:T) = BSS_SOC(2:T) == BSS_SOC(1:T-1) - BSS_disch(2:T) + BSS_ch(2:T);
prob.Constraints.energyStorage = energyStorage;
instead of
% battery constraints
prob.Constraints.energyStorage = optimconstr(T);
prob.Constraints.energyStorage = BSS_SOC(1) == 0;
prob.Constraints.energyStorage = BSS_SOC(2:T) == BSS_SOC(1:T-1) - BSS_disch(2:T) + BSS_ch(2:T);
I can't check your constraints since I cannot execute your code. So I don't know if the above modification solves your problem.

6 Commenti

Hi Torsten, thanks for your suggestion. Unfortunately, it did not solve the problem.
What do you need to be able to execute the code? Instead of the data, randomly selected arrays could act as placeholders. e.g. PV = values between 0-500; Household = values between 500-1000; Price = values between 0.2 and 0.4
Torsten
Torsten il 21 Mag 2024
Modificato: Torsten il 21 Mag 2024
Then I suggest you post a code with random data here that can be executed and reproduces the error you get from "linprog".
Tim Sanders
Tim Sanders il 22 Mag 2024
Modificato: Tim Sanders il 22 Mag 2024
Please see the updated code below:
% Set the size of the array
n = 8760;
% Generate random values between 0 and 500
PV = randi([0, 500], n, 1); % Beispielwerte
Household = randi([200, 1000], n, 1); % Beispielwerte
Price = 0.006 .* randi([1, 100], n, 1); % Beispielwerte
T = length(PV); % Anzahl der Zeitschritte
% Problem
prob = optimproblem;
% battery storage system parameter
BSS_Pmax = 11; % max power
BSS_Emax = 100; % max energy
% battery variables
BSS_ch = optimvar('BSS_ch', T, 'LowerBound', 0, 'UpperBound', BSS_Pmax);
BSS_disch = optimvar('BSS_disch', T, 'LowerBound', 0, 'UpperBound', BSS_Pmax);
BSS_SOC = optimvar('BSS_SOC', T, 'LowerBound', 0, 'UpperBound', BSS_Emax);
% other variables
Grid_Import = optimvar('Grid_Import', T, 'LowerBound', 0);
% battery constraints
energyStorage = optimconstr(T);
energyStorage(1) = BSS_SOC(1) == 0;
energyStorage(2:T) = BSS_SOC(2:T) == BSS_SOC(1:T-1) - BSS_disch(2:T) + BSS_ch(2:T);
prob.Constraints.energyStorage = energyStorage;
% energy flow
prob.Constraints.EnergyBalance = Grid_Import == Household - PV - BSS_disch + BSS_ch;
% cost funtion
cost = Grid_Import .* Price;
prob.ObjectiveSense = 'minimize';
prob.Objective = sum(cost);
% solve
[x, fval] = solve(prob);
Torsten
Torsten il 22 Mag 2024
Modificato: Torsten il 22 Mag 2024
It works if you relax the condition
% energy flow
prob.Constraints.EnergyBalance = Grid_Import == Household - PV - BSS_disch + BSS_ch
to
% energy flow
prob.Constraints.EnergyBalance = Grid_Import >= Household - PV - BSS_disch + BSS_ch
Hi thanks, this does work.
But it created a new problem. I was unware of the fact that in the real dataset the price can get to a negative value. If you replace the random data generation of the price parameter with "Price = 0.006 .* randi([-100, 100], n, 1); % Beispielwerte". The Problem will become unbounded. Because it will generate an inf. Gridimport in those hours to reduce the cost.
Most probably, you need to set an upper bound for Gridimport.

Accedi per commentare.

Più risposte (0)

Categorie

Prodotti

Release

R2024a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by