在没有绘图的情况下找到多项式的最大值/最小值的算法

时间:2014-01-26 18:32:38

标签: algorithm math algebra polynomial-math

对于形式为y = a * x ^ 2 + b * x + c的二次方程,max / min出现在x = -b / 2a处。对于更高的多项式(x> = 4),是否存在这样的硬和快等式。对于这样的多项式,我上网的解决方案建议绘制曲线并找到。如何在没有图形的情况下找到绝对最大值?

2 个答案:

答案 0 :(得分:2)

如果您只处理多项式,那么您应该检查libmatheval。我不会详细说明这背后的数学理论和所需的C代码,你会找到一个完整的参考here。但是,这是算法的草图:

  1. 将多项式解析为函数f
  2. 计算f的衍生物,称之为gf'
  3. 在指定的时间间隔内使用您最喜欢的数值方法找到g的零(可能是[MININT, MAXINT]或类似的东西)。
  4. 根据上面的列表,在每个点评估f
  5. 还会在第3点使用的搜索间隔的上限和下限中评估f
  6. 保留第4点和第5点的最大值和最小值。这些是绝对最大值和最小值。
  7. 特别是,第6点的声明由a theoretical proof支持。

    注意如果你考虑在任何限制区间之外的多项式(即从-inf到+ inf),那么它们是无界的,因为它们的最大值或最小值(或两者)都是无穷大。可能你对有限max / min(如果它们存在)感兴趣。您可以检查max或min是否应该是无限的,但是您不会从上面的算法中找到它,因为计算会对值施加数值限制:

    1. 如果多项式具有奇数度,则为min = -infmax = +inf
    2. 如果多项式具有偶数度,maxmin之间的值是有限的。

答案 1 :(得分:0)

您可以通过区分和求解等于0的梯度,使用sympy对度为< = 5的多项式进行分析求解。

请注意,这将为解决方案提供多个潜在位置(包括最小值和最大值),因此您必须评估潜在答案以找到实际最大值。

例如,使用sympy,我们可以通过以下方式计算四分之一的最大位置:

from sympy import solve
from sympy.abc import a,b,c,d,e,x
f=a*x*x*x*x+b*x*x*x+c*x*x+d*x+e
A=solve(f.diff(x),x)
for sol in A:
    print sol

给出3个潜在职位:

(((d/(4*a) - b*c/(8*a**2) + b**3/(32*a**3))**2/4 + (c/(6*a) - b**2/(16*a**2))**3)**(1/2) + d/(8*a) - b*c/(16*a**2) + b**3/(64*a**3))**(1/3)*(1/2 + I*3**(1/2)/2) - (c/(6*a) - b**2/(16*a**2))/((1/2 + I*3**(1/2)/2)*(((d/(4*a) - b*c/(8*a**2) + b**3/(32*a**3))**2/4 + (c/(6*a) - b**2/(16*a**2))**3)**(1/2) + d/(8*a) - b*c/(16*a**2) + b**3/(64*a**3))**(1/3)) - b/(4*a)

(((d/(4*a) - b*c/(8*a**2) + b**3/(32*a**3))**2/4 + (c/(6*a) - b**2/(16*a**2))**3)**(1/2) + d/(8*a) - b*c/(16*a**2) + b**3/(64*a**3))**(1/3)*(1/2 - I*3**(1/2)/2) - (c/(6*a) - b**2/(16*a**2))/((1/2 - I*3**(1/2)/2)*(((d/(4*a) - b*c/(8*a**2) + b**3/(32*a**3))**2/4 + (c/(6*a) - b**2/(16*a**2))**3)**(1/2) + d/(8*a) - b*c/(16*a**2) + b**3/(64*a**3))**(1/3)) - b/(4*a)

(c/(6*a) - b**2/(16*a**2))/(((d/(4*a) - b*c/(8*a**2) + b**3/(32*a**3))**2/4 + (c/(6*a) - b**2/(16*a**2))**3)**(1/2) + d/(8*a) - b*c/(16*a**2) + b**3/(64*a**3))**(1/3) - b/(4*a) - (((d/(4*a) - b*c/(8*a**2) + b**3/(32*a**3))**2/4 + (c/(6*a) - b**2/(16*a**2))**3)**(1/2) + d/(8*a) - b*c/(16*a**2) + b**3/(64*a**3))**(1/3)

如评论中所述,当x是其最小值和最大值时,您还应检查等式的值。