CVXPY выражение не DCP

Вопрос или проблема

У меня есть три переменные

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-регулярными.

Вот основные моменты, на которые следует обратить внимание:

  1. Проверка DCP: В CVXPY операции между переменными должны обладать свойствами, позволяющими сохранить выпуклость. Убедитесь, что все операции, используемые в ограничениях, операции сложения, умножения, сравнения и применения функций, являются DCP-совместимыми.

  2. Корректность выражений: В данном случае ошибка показывает, что выражение в правой части вашего рекурсивного ограничения не является DCP-выражением. Особенно это может быть связано с использованием переменных, как n * p_pv[t-1] - p_load[t-1], где необходимо убедиться, что p_pv и p_load являются совместимыми с DCP. Они должны быть либо константами, либо также должны быть переменными CVXPY.

  3. Исправление кода: Вот ваш код с возможными исправлениями. Обратите внимание на то, что переменные должны быть совместимы с 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-проблемы.

Оцените материал
Добавить комментарий

Капча загружается...