首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在scipy中优化给定范围内的函数

在scipy中优化给定范围内的函数
EN

Stack Overflow用户
提问于 2020-04-28 14:10:00
回答 1查看 40关注 0票数 0

我一直在尝试求一个单变量函数的最小值。该函数为:

代码语言:javascript
复制
sym.sqrt((x+6)**2 + 25) + sym.sqrt((x-6)**2 - 121)

由于第一项的原因,函数的导数(即(x - 6)/sym.sqrt((x - 6)**2 - 121) + (x + 6)/sym.sqrt((x + 6)**2 +25)对于x等于-5ad变得复杂(例如,-4)但小于18 (为了简单起见,这里我们可以忽略它)。因此,我编写的代码只计算x在-6和-10之间的函数(通过检查,我可以看到最小值大约是-8.6,所以我选择了-10):

代码语言:javascript
复制
def h(x):

    for x in np.arange(-10,-5):

        sym.sqrt((x+6)**2 + 25) + sym.sqrt((x-6)**2 - 121)

    result = optimize.minimize_scalar(h,bounds=(-10,-5))

    x_min = result.x

    print(x_min)

不幸的是,我得到了这个错误:

TypeError:输入类型不支持ufunc 'isnan‘,根据转换规则''safe'’,无法将输入安全地强制转换为任何支持的类型

有人能帮我解决这个问题吗?

致以敬意,

普拉萨纳

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-29 00:44:49

我不认为numpy和渐近在一起很好,除非你lambdify你的渐近方程。我也不确定NaN的值,它似乎在你的方程式中。

你可以用数字来试一下。在绘制函数图时,我在范围内没有找到最小值,但在导数中有一个最大值:

代码语言:javascript
复制
import numpy as np
from matplotlib import pyplot as plt
from scipy.signal import argrelmax

x = np.linspace(-10, -6, 256) # generate x range of interest
y = np.sqrt((x+6)**2 + 25) + np.sqrt((x-6)**2 - 121)

dydx = (x - 6)/np.sqrt((x - 6)**2 - 121) + (x + 6)/np.sqrt((x + 6)**2 + 25)

maximum, = argrelmax(dydx) # returns index of maximum

x[maximum]
>>> -8.50980392

# plot it
plt.plot(x, y)
ax = plt.gca().twinx() # make twin axes so can see both y and dydx
ax.plot(x, dydx, 'tab:orange')
ax.plot(x[maximum], dydx[maximum], 'r.')

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

https://stackoverflow.com/questions/61473713

复制
相关文章

相似问题

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