Python 3.x SLSQP错误:边界的长度与x0的长度不兼容
您好,我正在使用python上的SLSQP解算器和mystic软件包中的diffev2 对于多个参数,以下格式适用:Python 3.x SLSQP错误:边界的长度与x0的长度不兼容,python-3.x,numpy,scipy,minimization,Python 3.x,Numpy,Scipy,Minimization,您好,我正在使用python上的SLSQP解算器和mystic软件包中的diffev2 对于多个参数,以下格式适用: bnds = ((0, 1e3), (0, 1e-4)) optimize.minimize(Error, [1e-8, 1e-7], args=(E, Bt, L, dt, TotT, nz, Co, Exmatrix), method = 'SLSQP', bounds = bnds) 我只想优化一个参数,那就是当我遇到错误时:SLSQP error:边界的长度与x0的长度
bnds = ((0, 1e3), (0, 1e-4))
optimize.minimize(Error, [1e-8, 1e-7], args=(E, Bt, L, dt, TotT, nz, Co, Exmatrix), method = 'SLSQP', bounds = bnds)
我只想优化一个参数,那就是当我遇到错误时:SLSQP error:边界的长度与x0的长度不兼容。
我使用如下所示的语法:
bnds = ((1e-9, 1e-2))
optimize.minimize(Error, [1e-8], args=(U, E, Bt, L, dt, TotT, nz, Co, Exmatrix), method = 'SLSQP', bounds = bnds)
我不确定哪里出了问题,因为我在bnds变量中只有一个元组对和一个猜测,不确定哪里出了问题 直接来自python:
只有创建一个元组(也称为单元组)才需要后面的逗号;它在所有其他情况下都是可选的。没有尾随逗号的单个表达式不会创建元组,而是生成该表达式的值。(要创建空元组,请使用一对空括号:())
工作备选方案:
bnds = ((1e-9, 1e-2),)
bnds = [(1e-9, 1e-2)]
,这种情况会发生:
bnds = ((1e-9, 1e-2))
np.array(bnds, float).shape
# (2,)
bnds = ((1e-9, 1e-2),)
np.array(bnds, float).shape
# (1, 2)
# and then N is compared to the size of the first dimension (2 vs. 1)
(请确保您有理由不使用
最小化标量)谢谢,这对SLSQP有效,但对于mystic软件包中的Differencev2解算器,它似乎将参数作为序列,并在我的代码中产生一个错误,即:不能将序列乘以“float”类型的非整数。非整数是另一个值为0.5的参数,与优化参数相乘。我没有想到minimize_scalar
,因为我刚刚将SLSQP用于多变量,最近才将变量减少到一个。但这与上面的问题无关。如果答案解决了这个问题,请将其标记为这样,如果您遇到了新问题,请详细询问新问题!(并正确地标记它;这里您错过了与此相关的scipy示例)不能将序列与“float”类型的非int相乘。
通常类似于:您使用了列表,其中numpy.array(正如[0,1,2]*0.2
不适用于列表,而它适用于numpy)。谢谢您,这对SLSQP很有效。我还将尝试最小化标量函数。我在其他一些工作中一直在尝试Differv2全局解算器,当我尝试这种语法时,出于某种原因,它似乎将我的参数作为序列来读取。我们将进一步调查,也许会发表另一条评论。