Как создать объективную функцию для минимизации scipy - PullRequest
0 голосов
/ 14 декабря 2018

Правильно, извиняюсь за изобилие вопросов, но я новичок в Python, и я изо всех сил.

Мне кажется, я наконец-то создал несколько функциональный код.Тем не менее, я не могу правильно определить целевую функцию.Все остальное, похоже, рассчитывается правильно (основываясь на значениях, которые дает мне цель).Это моя целевая функция прямо сейчас:

def objective (x):
    global sumIp, sumIm
    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

x [2] предназначено быть моим It [i].sumIp и sumIm должны быть равны> = 0.

Вот полный код, если кто-то хочет взглянуть: https://pastebin.com/AxC7fTVv - я считаю, что это единственная часть, которой мне не хватает для достижения того, чегоЯ хочу, но я не могу понять, как сделать это для моей жизни, был вокруг этого в течение нескольких дней!Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Резюме

Хорошо, так.Я собираюсь подвести итог вашей проблемы (вроде как для вас, но в основном, чтобы помочь мне: p).

У вас есть последовательность значений, которую вы хотите вычислить, и все вращаются вокруг вычисления Qt[i].Это:

  • d[i] - некоторый список значений, предоставляемый извне в сценарии «реального мира», но для ваших целей эмулируется случайными значениями;самое главное, это не то, что нужно вычислять .(Еще одно примечание: я предполагаю, что мы не можем «заглянуть в будущее» и использовать d[i+1], или что-нибудь подобное.)
  • It[i] - дано It[i] = It[i-1] - d[i] + Qt[i-LT]Qt часть опущена для i < LT);это вычисляется из значений предыдущего цикла и значений d, поэтому это может быть легко вычислено
  • Ip[i], Im[i] - они оба рассчитываются непосредственно из It[i]Итак, еще раз, легко вычислить
  • NIt[i] - задано NIt[j] = NIt[j-1] - d[j] + Qt[j-1], а можно легко вычислить аналогично It[i]
  • Qt[i] - ...?

Короче говоря: единственное, что нужно выяснить, это Qt[i].Поэтому, если вы решите использовать оптимизатор, например scipy.minimize, переменная only вам нужна x[0].Но если у вас есть только одна переменная, скорее всего, вам даже не понадобится для использования оптимизатора;более вероятно, что вы можете придумать какую-то функцию / выражение, которое даст вам оптимизированный результат напрямую.

Решение

... пока не совсем уверен: \ извините

0 голосов
/ 14 декабря 2018

Комментарий 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: можете ли вы еще раз объяснить, что она должна делать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...