Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用scipy.optimize.brute在给定时间间隔内最小化函数_Python_Scipy_Mathematical Optimization - Fatal编程技术网

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)