我的职能如下:
((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,但我不知道如何对两个变量的函数执行相同的操作。
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.任何帮助都是非常感谢的。
发布于 2018-04-03 07:53:51
来自所涉文件:
Scipy.optimize.brute(函数,范围,args=(),Ns=20,full_output=0,finish=,disp=False) 功能:可调用 被最小化的目标函数必须以f(x,* args )形式表示,其中x是一维数组形式的参数,而args是完全指定函数所需的任何附加固定参数的元组。 范围:元组 范围元组的每个组件必须是窗体的“片对象”或范围元组(低、高)。该程序使用这些来创建计算目标函数的点的网格。有关更多细节,请参见注2。
在这种情况下,您应该将函数中的变量指定为一维数组。在你的情况下应该是这样的:
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优化值的元组。
https://stackoverflow.com/questions/49624208
复制相似问题