针对2个变量函数的Python暴力

针对2个变量函数的Python暴力,python,scipy,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

我有以下功能:

((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.
回溯(最近一次呼叫最后一次):
文件“C:/Users/Aravind_Sampathkumar/Desktop/PY/Bruteforce.PY”,第11行,在
val=scipy.optimize.brute(f,rranges,finish=optimize.fmin)
文件“C:\Python27\lib\site packages\scipy\optimize\optimize.py”,第2825行,以brute格式
Jout=vecfunc(*网格)
文件“C:\Python27\lib\site packages\numpy\lib\function\u base.py”,第2755行,在调用中__
返回self.\u矢量化\u调用(func=func,args=vargs)
文件“C:\Python27\lib\site packages\numpy\lib\function\u base.py”,第2834行,在_vectorize\u调用中
res=array(输出,copy=False,subok=True,dtype=otypes[0])
ValueError:使用序列设置数组元素。

感谢scipy文档中的任何帮助

scipy.optimize.brute(func,ranges,args=(),Ns=20,full_输出=0,finish=,disp=False)

func:可调用

要最小化的目标函数。必须采用f(x, *args),其中x是1-D数组形式的参数,args是完成此操作所需的任何附加固定参数的元组 指定函数

范围:元组

范围元组的每个组件必须是“切片对象”或 形式的范围元组(低、高)。程序使用这些 创建目标函数将在其上显示的点网格 计算。有关更多详细信息,请参见注释2

在本例中,您应该指定函数中的变量是什么,作为1D数组。在您的案例中应该是这样的:

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)
请注意,我已将您的
安排
np.linspace
更改为
slice
。而
np.linspace
参数是
(开始、停止、nb_示例)
slice
参数是
(开始、停止、步骤)
。请注意,它们做的不是同一件事。如果步骤的数量对您不重要,可以简化:

# Simply indicate lower_bound and upper_bound for each variable
resbrute = optimize.brute(f,((-20,20),(-20,20)))

要获得全局最小值,请查看
val[0]
。它应该是一个元组,包含优化值
x
y

不确定scipy做什么,但暴力强制在概念上非常简单:计算网格上的所有值并选择最高值(最低值)。可以选择从这些点开始使用非暴力例程进行优化。您拥有的不是一个函数,它忽略了
f(…)=
部分。代码中的函数
f
有一个参数
z
,但它没有被使用。我最初将x,y=z保存在我在scipy文档中看到的函数中。只是不确定如果我将f声明为f(x,y),如何在.optimize.brute调用中调用f这可能是一个输入错误,但您定义的等式实际上与代码中的等式相反。非常感谢。这很有效。所以z表示x和y为一维数组,对吗?这也给出了全局最小值。如何找到全局最大值?val[1]给出了全局最小值右侧的函数值?是的,
z
是一个一维数组,表示
(x,y)
。我记不起最大化函数了,但我想用
-f
而不是
f
应该可以做到这一点,-f就像在.brute函数调用中将f改为-f一样?好吧,那不行。如果我返回你猜对的函数的负数
val[1]
是函数的最小值。您需要在函数的等式中添加
-
。在
brute
调用中,
f
只是函数的名称,而不是它的方程式。你的想法可能行得通,但我不确定。试试看!