Я использую SCIPY для оптимизации хранилища, которое использует форвардные цены на срок сделки 1 год. Газ может закачиваться и забираться с этого объекта на основе месячных спрэдов (например, спред 21 марта по сравнению с 20 мая), которые достаточно высоки для покрытия переменных затрат на эксплуатацию. Прикрепленное изображение представляет проблему (значения здесь произвольные, не соответствуют значениям в коде; pi c только для концепции)
Ячейки синего цвета - это «изменяющиеся ячейки», объемы, которые SCIPY будет корректировать, чтобы максимизировать прибыль. Ограничения необходимо устанавливать для каждого месяца отдельно. Я получаю ошибки, когда пытаюсь установить эти ограничения в SCIPY. Вот воспроизводимая версия проблемы:
import numpy as np
import scipy.optimize as opt
p= np.array([4, 5, 6.65, 12]) #p = prices
pmx = np.triu(p - p[:, np.newaxis]) #pmx = price matrix, upper triangular
q =np.triu(np.ones((4,4))) # q = quantity, upper triangular
def profit(q):
profit = -np.sum(q.flatten() * pmx.flatten())
return profit
bnds = (0,10)
bnds = [bnds for i in q.flatten()]
def cons1(q):
np.sum(q,axis=1) - 10
#def cons2(q):
# np.sum(q,axis=0) - 8
#con1 = {'type':'ineq','fun':cons1}
#con2 = {'type':'ineq','fun':cons2}
cons = [con1] # using only 1 constraint (con1) to test the model
#sol = opt.minimize(profit,q,method='SLSQP', bounds= bnds,constraints = cons)
sol = opt.minimize(profit,q,method='SLSQP', bounds= bnds)
sol
Модель работает нормально, когда я исключаю ограничения. Когда я добавляю одно из ограничений, я получаю следующее сообщение об ошибке:
AxisError: axis 1 is out of bounds for array of dimension 1
Я думаю, это связано с тем, как я указываю ограничения ... Я не уверен. Что касается ограничений, мне нужно определить инъекции и изъятия, а также установить ограничения, как показано на рисунке. Помощь будет оценена. Спасибо!