Переменная Длина оптимизатора Python - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть выпуклая функция с входным вектором X длины (переменной) T, и у меня есть условие, что X_0 = 0. Я пытаюсь настроить функцию оптимизации в scipy так, чтобы X_0 = 0 не обращал внимания наостальные значения.

Я получаю ошибку «длина х0! = длина границ», когда я настраиваю свою функцию со следующими границами

bnds = ((0, 0), None)

Я уверен, чтоОтвет прост, но я еще не понял.Спасибо.

Код:

import pandas as pd
import numpy as np
import scipy as scipy
import scipy.optimize as opt
import matplotlib.pyplot as plt
def c(delta):
    x = delta/40
    c = delta*(1/2 * x + np.sign(x)*np.abs(x)**(3/5))
    return c

def u(X):
    return -sum(X[1:] - X[1:]**2 - c(X[1:] - X[:-1]))

T = 30 # user defined variable


bnds = ((0, 0), None)
X = [0]*T
res = opt.minimize(u, X, #method = 'Nelder-Mead',
               bounds = bnds,
               options={'xtol': 1e-8, 'maxiter' : 1e6, 'disp': True})

1 Ответ

0 голосов
/ 23 сентября 2018

Изменено после вашего последнего обновления:

Вы передаете последовательность длины 2 для границ, но переменные, для которых вы оптимизируете, имеют длину 30. Параметр границ имеет кортеж длины 2 для каждогопеременная;использование None в кортеже означает отсутствие ограничения для этого конца (-inf или inf).

В вашем случае у вас есть (0,0) для первой переменной и None (что означает отсутствие границ) для второй.Тем не менее, вы передаете 30 переменных для оптимизации.

Вам либо нужно изменить границы на:

bnds = [(0, 0)] + [(None, None)]*29

для случая, когда T = 30.

Для автоматизацииразмер переменной bounds, используйте:

bnds = [(0, 0)] + [(None, None)]*(T-1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...