为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白猪掌柜的 2022-10-25 15:52:16
我一直在尝试获得单个变量函数的最小值。功能是: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 等于 -5 ad 变得复杂,因为 x 大于(例如,-4)但小于 18(为了简单起见,我们可以在这里忽略)。因此,我编写的代码只评估 x 在 -6 和 -10 之间的函数(通过检查,我可以看到最小值在 -8.6 左右,所以我选择了 -10):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'' 无法安全地将输入强制转换为任何支持的类型有人可以帮我解决这个问题吗?
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

我不认为 numpy 和 sympy 一起玩得很好,除非你lambdify的 sympy 方程。而且我也不确定NaN值,这似乎在您的等式中。


你可以用数字试试。在绘制函数时,我发现该范围内没有最小值,但导数中有最大值:


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.')

//img1.sycdn.imooc.com//635795d3000161e803990244.jpg

查看完整回答
反对 回复 2022-10-25
  • 1 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信