使用优化模块的 Scipy 错误。将数组转换为 fortran 失败
Posted
技术标签:
【中文标题】使用优化模块的 Scipy 错误。将数组转换为 fortran 失败【英文标题】:Scipy error using optimization module. Failure converting array to fortran 【发布时间】:2013-04-13 02:21:21 【问题描述】:尝试使用 scipy 的优化模块来查找使用 slsqp 的函数的最小值,但我遇到了一些问题。调用函数的实际代码如下所示:
def minimizeWebEnergyLost(x, parameters):
"""values = [theta, velocity]"""
firstTerm = lambda values: (x * values[1]**2 / 2.0)
sqrtTerm = lambda values: np.sqrt((parameters.gravity**2 * x**2) / (4 * values[1]**4 * np.cos(values[0])**4) + 1)
secondTerm = lambda values: (values[1]**4 * np.cos(values[0])**2) / parameters.gravity
arcsinhTerm = lambda values: np.arcsinh((parameters.gravity * x) / (2 * values[1]**2 * np.cos(values[0])**2))
costFunction = lambda values: firstTerm(values)*sqrtTerm(values)+secondTerm(values)*arcsinhTerm(values)
bounds = ((-math.pi/2,math.pi/2),(0,parameters.maxSlingSpeed))
minimum = minimize(costFunction, (pi/4, 20), method="SLSQP", bounds=bounds)
return minimum
由于某种原因,我得到的错误如下:
_slsqp.error: failed in converting 8th argument `g' of _slsqp.slsqp to C/Fortran array
不太清楚发生了什么,但如果有帮助,我可以提供更多可能有用的代码。
【问题讨论】:
使用scipy.optimize.fmin_slsqp
版本是否也出现同样的错误?
当我使用那个版本时,完全一样的错误。
一个非常简单的例子对你有用吗?例如。 def costFunction(x): retun x[0]**2 + x[1]**2
等。另外,你使用的是什么版本的 scipy?
是的,一个简单的功能似乎可以正常工作。使用 0.12.0。
你能创建一个最小的独立示例来生成错误并将代码添加到问题中吗?
【参考方案1】:
当用户指定的目标函数未返回标量时,会发生此神秘错误。 b-carter 现在在补丁中返回了一条明确的错误消息,
"Objective function must return a scalar"
文档已更新,请参阅this 讨论帖。
【讨论】:
以上是关于使用优化模块的 Scipy 错误。将数组转换为 fortran 失败的主要内容,如果未能解决你的问题,请参考以下文章