Python 使用scipy.optimize.brute在给定时间间隔内最小化函数
我试图在给定的区间内最小化一个函数;在我的例子中,间隔是Python 使用scipy.optimize.brute在给定时间间隔内最小化函数,python,scipy,mathematical-optimization,Python,Scipy,Mathematical Optimization,我试图在给定的区间内最小化一个函数;在我的例子中,间隔是[-pi/2,pi/2] 以下是我在脚本中写的内容: ranges = slice(-pi/2, pi/2, pi/200) res = optimize.brute(g, (ranges,)) 与 结果res为 array([-3.14159265]) 我在绘制解决方案时遇到的问题是,最小化的一些解决方案超出了区间[-pi/2,pi/2]。有什么帮助吗?问题在于默认的“整理功能”:brute可以选择提供整理最小化功能。它这样做是为了使
[-pi/2,pi/2]
以下是我在脚本中写的内容:
ranges = slice(-pi/2, pi/2, pi/200)
res = optimize.brute(g, (ranges,))
与
结果res
为
array([-3.14159265])
我在绘制解决方案时遇到的问题是,最小化的一些解决方案超出了区间[-pi/2,pi/2]
。有什么帮助吗?问题在于默认的“整理功能”:brute
可以选择提供整理最小化功能。它这样做是为了使用蛮力方法作为第一个猜测,然后使用更好的最小化函数对结果进行“抛光”
如果将此函数设置为“无”,则不会发生任何事情,这很可能就是您在此处想要的。不幸的是,在这种情况下,默认设置为fmin
,这是下坡单纯形(Nelder-Mead)方法,这将忽略任何范围/网格规范。因此,对于像sin(0.5*x)
这样的函数,它将从brute
函数找到的最低点(-pi/2
)开始,并从那里继续,发现-pi
是(最接近的)全局最小值
解决方案很简单:
res = optimize.brute(g, (ranges,), finish=None)
我会给你想要的
指向的强制链接。如果传递的参数超出所需范围,则只需编写目标函数即可返回np.inf。例如:
def g(x, x_limit):
if x > x_limit:
return np.inf
else:
return (-(z+1) * (((a/4) * (3*cos(x/3) + cos(3*x/2)) +
(b/4) * (-3*sin(x/2)-3*sin(3*x/2)))**2 +
((a/4) * (sin(x/3) + sin(3*x/2)) + (b/4)*
(cos(x/2) + 3*cos(3*x/2)))**2) + 4*(c*cos(x/2))**2)
当解决方案超过间隔时,您是否有
g
的实际示例?而结果的价值呢?回答我自己的评论,看起来像是def g(x):return sin(0.5*x)
已经符合要求了。这是我的函数:-(z+1)*(((a/4)*(3*cos(x/3)+cos(3*x/2)+(b/4)*(-3*sin x(x/2)-3*sin 3*x/2))****(sin 2+(sin 3*x/3*x/2))+(b/4)*(cos(x+3*x+3*x/2)),如果我想知道的话,请记住sin(0.5*x)example?;-)。我已经用您给出的输入和输出更新了您的问题。这比把它放在评论里更清楚,但我想你还没有足够的声誉来自己编辑这个问题。这不是第一次有人对brute
的默认行为感到惊讶,其中finish=fmin
:@WarrenWeckesser谢谢。我正要寻找这个(我不使用brute
,所以看到这个我很惊讶)。不幸的是,没有将finish=None
作为默认设置的明显原因是向后兼容。由于还没有1.0版本,它可能会被更改(但是,是的,许多科学家会感到惊讶,甚至不会注意到错误的结果,因为我不期望大多数scipy用户仔细阅读版本之间的发行说明)。没有办法对fmin设置界限,并使它们在默认情况下匹配?
def g(x, x_limit):
if x > x_limit:
return np.inf
else:
return (-(z+1) * (((a/4) * (3*cos(x/3) + cos(3*x/2)) +
(b/4) * (-3*sin(x/2)-3*sin(3*x/2)))**2 +
((a/4) * (sin(x/3) + sin(3*x/2)) + (b/4)*
(cos(x/2) + 3*cos(3*x/2)))**2) + 4*(c*cos(x/2))**2)