首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2变量函数的Python蛮力

2变量函数的Python蛮力
EN

Stack Overflow用户
提问于 2018-04-03 07:09:05
回答 1查看 1.4K关注 0票数 2

我的职能如下:

代码语言:javascript
复制
((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,但我不知道如何对两个变量的函数执行相同的操作。

代码语言:javascript
复制
   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)

到目前为止这是我的密码。它给出了一个错误:

代码语言:javascript
复制
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.

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-03 07:53:51

来自所涉文件:

Scipy.optimize.brute(函数,范围,args=(),Ns=20,full_output=0,finish=,disp=False) 功能:可调用 被最小化的目标函数必须以f(x,* args )形式表示,其中x是一维数组形式的参数,而args是完全指定函数所需的任何附加固定参数的元组。 范围:元组 范围元组的每个组件必须是窗体的“片对象”或范围元组(低、高)。该程序使用这些来创建计算目标函数的点的网格。有关更多细节,请参见注2。

在这种情况下,您应该将函数中的变量指定为一维数组。在你的情况下应该是这样的:

代码语言:javascript
复制
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更改为slicenp.linspace参数是(start, stop, nb_samples)slice参数是(start, stop, step)。请注意,他们不做同样的事情。如果步骤的数量对你不重要,简化是可能的:

代码语言:javascript
复制
# Simply indicate lower_bound and upper_bound for each variable
resbrute = optimize.brute(f,((-20,20),(-20,20)))

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49624208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档