Python Optimizer可变绑定长度

时间:2018-09-23 15:43:57

标签: python optimization scipy

我有一个凸函数,输入向量X的长度为(变量)T,并且条件X_0 =0。我试图在scipy中设置一个优化函数,以使X_0 = 0不在乎其余的值。

使用以下边界设置函数时,我不断收到错误消息“ x0的长度!=边界的长度”

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 :(得分:2)

上次更新后编辑:

您正在传递一个长度为2的边界序列,但是您要优化的变量的长度为30。bounds参数的每个变量的元组长度为2。在元组中使用None表示该端无界(-infinf)。

在您的情况下,第一个变量为(0,0),第二个变量为None(表示无边界)。但是,您要传递30个变量进行优化。

您要么需要将边界更改为:

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

对于T = 30的情况。

要自动执行bounds变量的大小,请使用:

bnds = [(0, 0)] + [(None, None)]*(T-1)