FMINCON планирует график использования устройства, чтобы минимизировать общую стоимость
Я хотел бы написать код, чтобы найти минимальную стоимость запуска посудомоечной машины. Это зависит от требуемой мощности, почасовой тарифной ставки и используемого времени. я использую fmincon
для этого, однако, приведенный ниже код показывает следующее сообщение об ошибке:
Пользовательская целевая функция должна возвращать скалярное значение
Моя цель состоит в том, чтобы минимизировать (общая стоимость * время), если общая стоимость равна суммированию (часовая мощность)*(почасовая стоимость) от 1 до 24 часов равна 0,8 кВт-ч, кроме того, общая стоимость должна быть больше, чем Ca
и общее время пробега за день составляет один час.
% Array showing the hourly electricity rates (cents per kwh)
R=zeros(24,1);
R(1:7,1)=6;
R(20:24,1)=6;
R(8:11,1)=9;
R(18:19,1)=9;
R(12:17,1)=13;
p_7 = transpose([0.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]); %This is the power pattern of appliance (operates at 0.8 kWh for 1 hour daily)
for k=1:23
P7(:, k+1) = circshift(p_7,k); % This shows all the possible hours of operation
end
Total = P7*R; % This is the total cost per hour at different hourly tariffs
fun = @(x)Total.*(x);
x0 = [1];
A = Total;
%Ca = 0.5;
Ca = ones(1,24);
b = Ca;
Aeq = Total;
Daily_tot_7 = 2*ones(1,24);
beq = Daily_tot_7;
ub = 24;
lb = 1;
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
Я считаю, что мое понимание преобразования ограничений в fmincon
не правильно и что я могу пропустить жизненно важные ограничения для этой проблемы.
1 ответ
Ваш вывод в настоящее время является вектором выводов. Вы заявили, что ваша функция затрат - это суммирование почасовых элементов. Следовательно, определение вашей функции должно быть
fun = @(x)sum(Total.*(x));
Однако, если я читаю это право, вы хотите решить для каждого часа индивидуально. В этом случае вам нужно установить переменную x0, которая будет определяться как вход 24x1
x0 = ones(24,1);
Если это так, вам необходимо соответствующим образом настроить переменные A,b,Aeq и beq. Однако, действительно ли они вам нужны, вы можете просто не использовать их, заменив их []
Наконец, ваша переменная p7, вероятно, лучше переопределена как
p7 = R*.8;
Мои извинения, если я неправильно понял, что вы пытаетесь сделать здесь.