我有一个凸函数,输入向量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})
答案 0 :(得分:2)
上次更新后编辑:
您正在传递一个长度为2的边界序列,但是您要优化的变量的长度为30。bounds参数的每个变量的元组长度为2。在元组中使用None
表示该端无界(-inf
或inf
)。
在您的情况下,第一个变量为(0,0)
,第二个变量为None
(表示无边界)。但是,您要传递30个变量进行优化。
您要么需要将边界更改为:
bnds = [(0, 0)] + [(None, None)]*29
对于T = 30
的情况。
要自动执行bounds变量的大小,请使用:
bnds = [(0, 0)] + [(None, None)]*(T-1)