我有以下功能:
((sin(((x-8)**2+y**2)**0.5))/((((x-8)**2+y**2)**0.5)))+0.8*((sin(((x+8)**2+y**2)**0.5))/(((x+8)**2+y**2)**0.5))
我想在Python中使用暴力方法找到此函数的全局最大值和最小值。我看过scipy.optimize.brute,但我不确定如何为2个变量的函数做同样的事情。
y = np.linspace(-20,20,1000)
x = np.linspace(-20,20,1000)
def f(x,y):
return (((sin(((x-8)**2+y**2)**0.5))/((((x-8)**2+y**2)**0.5)))+0.8*((sin(((x+8)**2+y**2)**0.5))/(((x+8)**2+y**2)**0.5)))
rranges = (slice(-4, 4, 0.25), slice(-4, 4, 0.25))
val = scipy.optimize.brute(f, rranges, finish=optimize.fmin)
到目前为止,这是我的代码。它给出了一个错误:
Traceback (most recent call last):
File "C:/Users/Aravind_Sampathkumar/Desktop/PY/Bruteforce.py", line 11, in <module>
val = scipy.optimize.brute(f, rranges, finish=optimize.fmin)
File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 2825, in brute
Jout = vecfunc(*grid)
File "C:\Python27\lib\site-packages\numpy\lib\function_base.py", line 2755, in __call__
return self._vectorize_call(func=func, args=vargs)
File "C:\Python27\lib\site-packages\numpy\lib\function_base.py", line 2834, in _vectorize_call
res = array(outputs, copy=False, subok=True, dtype=otypes[0])
ValueError: setting an array element with a sequence.
感谢任何帮助
答案 0 :(得分:1)
来自scipy文档:
scipy.optimize.brute(func,ranges,args =(),Ns = 20,full_output = 0,finish =,disp = False)
func:callable
要最小化的目标函数。必须采用f(x, * args),其中x是1-D数组形式的参数,args是完全需要的任何其他固定参数的元组 指定功能。
范围:元组
范围元组的每个组件必须是“切片对象”或 形式的范围元组(低,高)。该程序使用这些 创建目标函数所在的点网格 计算。有关详细信息,请参阅注释。
在您的情况下,您应该指定函数中的变量作为一维数组。它应该在你的情况下看起来像这样:
from math import sin
from scipy import optimize
# There's no parameter here, just like in your code
def f(z):
x,y=z
return (-((sin(((x-8)**2+y**2)**0.5))/((((x-8)**2+y**2)**0.5)))+0.8*((sin(((x+8)**2+y**2)**0.5))/(((x+8)**2+y**2)**0.5)))
#
rranges = (slice(-20, 20, 0.2), slice(-20, 20, 0.2))
resbrute = optimize.brute(f, rranges, full_output=True, finish=optimize.fmin)
请注意,我已将您的rranges
从np.linspace
更改为slice
。虽然np.linspace
参数为(start, stop, nb_samples)
,但slice
参数为(start, stop, step)
。请注意他们不会做同样的事情。如果步骤数对您不重要,可以进行简化:
# Simply indicate lower_bound and upper_bound for each variable
resbrute = optimize.brute(f,((-20,20),(-20,20)))
要获得全局最低要求,请查看val[0]
。它应该是包含x
和y
的优化值的元组。