Python蛮力为2个变量的函数

时间:2018-04-03 07:09:06

标签: python scipy

我有以下功能:

((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.

感谢任何帮助

1 个答案:

答案 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)

请注意,我已将您的rrangesnp.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]。它应该是包含xy的优化值的元组。