在 scipy 中的给定范围内优化函数
Optimizing a function within a given range in scipy
我一直在尝试获取单个变量函数的最小值。函数是:
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 时爆炸,当 x 大于它(例如,-4)但小于 18(为了简单起见,我们在这里可以忽略)时,广告变得复杂,因为第一个学期。因此,我编写的代码只对 -6 和 -10 之间的 x 求函数(通过检查,我可以看到最小值在 -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'”
,无法将输入安全地强制转换为任何受支持的类型
有人可以帮我解决这个问题吗?
此致,
至尊宝
我不认为 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.')
我一直在尝试获取单个变量函数的最小值。函数是:
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 时爆炸,当 x 大于它(例如,-4)但小于 18(为了简单起见,我们在这里可以忽略)时,广告变得复杂,因为第一个学期。因此,我编写的代码只对 -6 和 -10 之间的 x 求函数(通过检查,我可以看到最小值在 -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'”
,无法将输入安全地强制转换为任何受支持的类型有人可以帮我解决这个问题吗?
此致,
至尊宝
我不认为 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.')