Вопрос или проблема
У меня есть три переменные
m = cp.Variable(1, pos=True)
n = cp.Variable(1, pos=True)
soc = cp.Variable(T, pos=True)
t_step = 0.3333
ch_eff = 0.99
E_bt = m * 100
и я добавляю ограничения
constraints = []
constraints += [soc<=0.9]
constraints += [soc>=0.1]
constraints += [soc[0] == 0.4]
# Рекурсивное соотношение
for t in range(1, T):
constraints += [soc[t] == soc[t-1]+(((n*p_pv[t-1]-p_load[t-1])*t_step*ch_eff)/E_bt)]
Задача для решения
cost_pv = 100000 #$
cost_battery = 50000 #$
objective = cp.Minimize(m * cost_battery + n * cost_pv)
prob = cp.Problem(objective, constraints)
prob.solve()
p_pv и p_load – это списки значений с плавающей запятой.
Почему это вызывает у меня ошибку?
Следующие ограничения не являются DCP:
var627905[1] == var627905[0] + (var627904 @ 0.0 + -0.0) @ 0.333333333 @ 0.9 / var627903 @ 100.0, потому что следующие подвыражения не являются:
|-- (var627904 @ 0.0 + -0.0) @ 0.333333333 @ 0.9 / var627903 @ 100.0
и как я могу проверить, является ли проблема DCP или нет?
Я пробовал различные ограничения и настройки переменных в cvxpy, но не уверен, почему я получаю эту ошибку.
Ответ или решение
Ваша ошибка связана с тем, что в выражении для рекурсивного отношения не соблюдаются правила DCP (Disciplined Convex Programming), что является основным принципом библиотеки CVXPY. Чтобы исправить вашу проблему, вам нужно убедиться, что все операции и функции, которые вы используете для создания выражений и ограничений, являются DCP-регулярными.
Вот основные моменты, на которые следует обратить внимание:
-
Проверка DCP: В CVXPY операции между переменными должны обладать свойствами, позволяющими сохранить выпуклость. Убедитесь, что все операции, используемые в ограничениях, операции сложения, умножения, сравнения и применения функций, являются DCP-совместимыми.
-
Корректность выражений: В данном случае ошибка показывает, что выражение в правой части вашего рекурсивного ограничения не является DCP-выражением. Особенно это может быть связано с использованием переменных, как
n * p_pv[t-1] - p_load[t-1]
, где необходимо убедиться, чтоp_pv
иp_load
являются совместимыми с DCP. Они должны быть либо константами, либо также должны быть переменными CVXPY. -
Исправление кода: Вот ваш код с возможными исправлениями. Обратите внимание на то, что переменные должны быть совместимы с DCP. Также убедитесь, что
p_pv
иp_load
являются массивами NumPy или имеют свойства массива, чтобы их можно было правильно использовать в ограничениях.
import cvxpy as cp
import numpy as np
# Определите переменные
m = cp.Variable(1, pos=True)
n = cp.Variable(1, pos=True)
T = 10 # Например, 10 временных шагов
soc = cp.Variable(T, pos=True)
t_step = 0.3333
ch_eff = 0.99
E_bt = m * 100
# Объявите ваши массивы p_pv и p_load как numpy массивы с float значениями
# Пример (замените на ваши значения)
p_pv = np.random.rand(T).astype(float) # генерация случайных значений для P_pv
p_load = np.random.rand(T).astype(float) # генерация случайных значений для P_load
constraints = []
constraints += [soc <= 0.9]
constraints += [soc >= 0.1]
constraints += [soc[0] == 0.4]
# Рекурсивное отношение
for t in range(1, T):
constraints += [
soc[t] == soc[t-1] + ((n * p_pv[t-1] - p_load[t-1]) * t_step * ch_eff) / E_bt
]
cost_pv = 100000 # $ стоимость солнечной панели
cost_battery = 50000 # $ стоимость аккумулятора
objective = cp.Minimize(m * cost_battery + n * cost_pv)
# Постановка задачи
prob = cp.Problem(objective, constraints)
# Решение задачи
prob.solve()
# Проверка статуса решения
if prob.status == cp.OPTIMAL:
print("Optimal solution found!")
else:
print("Problem status:", prob.status)
Убедитесь в следующем:
p_pv
иp_load
действительно являются массивами, и их элементы используются правильно.- Все операции, включая деление, должны выполняться с учетом DCP: делить необходимо на положительное значение.
Если после этих изменений ошибка все еще сохраняется, вы также можете добавить вывод промежуточных выражений и проверять, является ли каждая часть DCP-совместимой. Это поможет вам более точно diagnose DCP-проблемы.