Комментарий 1
Примечание. Я делаю изменения в первой копийной копии, как указано в описании вопроса.
Попробуйте это: удалите оператор global
, чтобы функция objective
выглядела как
def objective (x):
# [`global` removed here]
if (It[i-1] - d[i] + Qt[i-LT]) >= 0:
sumIp = sumIp + x[2]
sumIm = sumIm + 0
else:
sumIp = sumIp + 0
sumIm = sumIm - x[2]
return h*sumIp+b*sumIm
Таким образом, значения sumIp
и sumIm
для x[2]
на данный момент равны создается локально при каждом вызове objective
, а не редактируется глобально.(Вы можете захотеть переименовать локальные переменные, чтобы избежать путаницы.)
Затем, после завершения minimize
, вы вносите изменения для окончательного, оптимального значения x[2]
, например:
def test(T):
global i
while i < T:
# [...]
sol = minimize(objective, x0, constraints=cons)
if (It[i-1] - d[i] + Qt[i-LT]) >= 0:
sumIp = sumIp + sol.x[2]
sumIm = sumIm + 0
else:
sumIp = sumIp + 0
sumIm = sumIm - sol.x[2]
# [...]
i += 1
return Qt, NIt, It
Комментарий 2
Хорошо, так.x[0] == Qt[i]
, не Qt[i-1]
, верно?Если это так, то вы не можете поменять местами Qt[i-1]
и x[0]
.Также имеет смысл тот факт, что оптимизатор перестает работать, когда вы удаляете x[0]
;единственное, что можно изменить при попытке свести к минимуму ваши выражения - это значения x
, и если вы их удалите, у минимизатора будет меньше, чем разрешено делать.
По поводу общего "странного [ness]msgstr ", это может быть связано с тем, что ограничения используют if
-статемы, что в основном делает их кусочными функциями.Хотя существуют методы минимизации, которые работают с нелинейными ограничениями, я не уверен, существуют ли методы, которые работают с недифференцируемыми ограничениями.
Исправитьпосмотрите, какие изменения я сделал в этой пасте .Я заменил x[2]
на две строго неотрицательные переменные x[2]
и x[3]
, где старое значение теперь x[2] - x[3]
.Это исключает необходимость использования if-операторов в цели.Чтобы сделать переменные неотрицательными, я добавил граничные условия в задачу с x_bounds
.(Обратите внимание, что это устраняет необходимость в функции constraint1
, поэтому я удалил ее. В коде гораздо больше возможностей для других упрощений, но поскольку это не является необходимым, я оставил все остальное в покое.)
Так чтоединственная оставшаяся часть, которую я не совсем понимаю, это constraint2
: можете ли вы еще раз объяснить, что она должна делать?