我一直在尝试求一个单变量函数的最小值。该函数为:
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):
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'’,无法将输入安全地强制转换为任何支持的类型
有人能帮我解决这个问题吗?
致以敬意,
普拉萨纳
发布于 2020-04-29 00:44:49
我不认为numpy和渐近在一起很好,除非你lambdify你的渐近方程。我也不确定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.')

https://stackoverflow.com/questions/61473713
复制相似问题