我正在尝试使用scipy优化来最小化Beale函数,它是一个具有两个变量的函数,使用以下代码:
import math
import numpy as np
from scipy.optimize import minimize
#define function f(x)
def beale(position):
return (1.5-position[0]+position[0]*position[1])**2+(2.25-position[0]+position[0]*position[1]**2)**3+(2.2625-position[0]+position[0]*position[1])**3
res =minimize(beale, [-4.5,4.5], method="Nelder-Mead")
print (res)
但是我遇到以下错误:
RuntimeWarning: overflow encountered in double_scalars
res =optimize.minimize(f, [2, -1], method="Nelder-Mead")
此错误是什么意思,我该如何解决?
答案 0 :(得分:1)
“此错误是什么意思,我该如何解决?”
这意味着求解器没有收敛到最小值,而是采取了将其移至更大的坐标值的步骤,其中多项式表达式太大,以至于溢出了64位浮点数的限制。
如果我将公式更正为实际的Beale函数,并且使用的起点更接近预期结果,则该函数有效。这个脚本
from scipy.optimize import minimize
def beale(position):
x, y = position
return (1.5 - x + x*y)**2 + (2.25 - x + x*y**2)**2 + (2.625 - x + x*y**3)**2
x0 = [1.0, 1.0]
res = minimize(beale, x0, method="Nelder-Mead")
print(res)
产生输出
final_simplex: (array([[3.00002489, 0.50000749],
[2.99993609, 0.49998427],
[3.00005157, 0.50000776]]), array([1.39263183e-10, 6.54120047e-10, 1.00978644e-09]))
fun: 1.392631830241483e-10
message: 'Optimization terminated successfully.'
nfev: 107
nit: 56
status: 0
success: True
x: array([3.00002489, 0.50000749])
已知的精确解是(3,0.5)。