【问题标题】:Find maxima for a negative parabolic equation找到负抛物方程的最大值
【发布时间】:2021-07-18 03:22:40
【问题描述】:

我有以下负二次方程

-0.03402645959398278x^{2}+156.003469x-178794.025

我想知道当导数的斜率为零(最大值)时是否有直接的方法(使用 numpy/scipy 库或任何其他方法)来获取 x 的值。我知道我可以:

  • 更改等式的符号并应用 scipy.optimize.minima 方法或
  • 使用方程的导数,这样我就可以得到斜率为零时的值

例如:

from scipy.optimize import minimize


quad_eq = np.poly1d([-0.03402645959398278, 156.003469, -178794.025])

############SCIPY####################
neg_quad_eq = np.poly1d(np.negative(quad_eq))
fit = minimize(neg_quad_eq, x0=15)
slope_zero_neg = fit.x[0]
maxima = np.polyval(quad_eq, slope_zero_neg)
print(maxima)

##################numpy######################
import numpy as np

first_dev = np.polyder(quad_eq)
slope_zero = first_dev.r
maxima = np.polyval(quad_eq, slope_zero)
print(maxima)

有没有直接的方法可以得到相同的结果? 打印(最大值)

【问题讨论】:

  • quad_eq(quad_eq.deriv().roots) 不够直?

标签: python numpy scipy scipy-optimize


【解决方案1】:

您不需要所有这些代码...a x^2 + b x + c 的一阶导数是 2a x + b,因此将 2a x + b = 0 求解为 x 会产生 x = -b / (2a),这实际上是您要搜索的最大值

import numpy as np
import matplotlib.pyplot as plt

def func(x, a=-0.03402645959398278, b=156.003469, c=-178794.025):
    result = a * x**2 + b * x + c
    return result

def func_max(a=-0.03402645959398278, b=156.003469, c=-178794.025):
    maximum_x = -b / (2 * a)
    maximum_y = a * maximum_x**2 + b * maximum_x + c
    return maximum_x, maximum_y

x = np.linspace(-50000, 50000, 100)

y = func(x)
mx, my = func_max()

print('maximum:', mx, my)

maximum: 2292.384674478263 15.955750522436574

并验证

plt.plot(x, y)
plt.axvline(mx, color='r')
plt.axhline(my, color='r')

【讨论】:

    猜你喜欢
    • 2014-06-09
    • 2017-11-18
    • 2015-10-28
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多