Algorithm 无需作图求多项式最大值/最小值的算法

Algorithm 无需作图求多项式最大值/最小值的算法,algorithm,math,algebra,polynomial-math,Algorithm,Math,Algebra,Polynomial Math,对于形式为y=a*x^2+b*x+c的二次方程,最大/最小值出现在x=-b/2a处。对于更高的多项式(x>=4),有没有像这样的硬性方程。对于这样的多项式,我在网上找到的解决方案建议绘制曲线并找到。如何在不作图的情况下找到绝对最大值?如果您只处理多项式,那么您应该检查。我不会详细介绍这背后的数学理论,也不会详细介绍所需的C代码,您可以找到完整的参考资料。但是,下面是算法的示意图: 将多项式解析为函数f 计算f的导数,称之为g(f') 在指定的时间间隔内(可能是[MININT,MAXINT]或类似

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

如果您只处理多项式,那么您应该检查。我不会详细介绍这背后的数学理论,也不会详细介绍所需的C代码,您可以找到完整的参考资料。但是,下面是算法的示意图:

  • 将多项式解析为函数
    f
  • 计算
    f
    的导数,称之为
    g
    f'
  • 在指定的时间间隔内(可能是
    [MININT,MAXINT]
    或类似的方法),使用您最喜欢的数值方法查找
    g
    的零
  • 给出上述各点的列表,对各点的
    f
    进行评估
  • 还应在第3点使用的搜索间隔的上下限中计算
    f
  • 保留第4点和第5点的最大值和最小值。这些是绝对最大值和最小值
  • 特别是,第6点的索赔有以下证据支持

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

  • 如果多项式有奇数次,则
    min=-inf
    max=+inf
  • 如果多项式的阶数为偶数,则
    max
    min
    之间的一个阶数是有限的

  • 你可以用次多项式的sympy来解析地解决这个问题。是的,你在寻找微分学,数学的一个分支,而不是编程。你的问题在这里离题了。这个问题似乎离题了,因为它属于“最大/最小发生在x=-b/2a。”-不完全是。以最大值为例。只有当
    a
    为负值时,你所说的才是真的。否则,曲线的两边都是无穷大的。找到最大值和最小值与微分和找到零点是一样的。在这里,您可以找到一个python实现,它可靠地求解方程直到4阶,然后使用牛顿方法:也许用非正替换“负”?你也可以完全忽略二阶导数;将使代码x2变慢,但更易于编写/理解。@anatolyg“non-positive”将同时包含最小值和拐点(尽管我认识到在浮点世界中检查0可能是危险的)。无论如何,我修改了算法,因为OP同时需要最小值和最大值,所以不再检查二阶导数:)“你也可以为阶多项式求解这个问题,仅解导数=0方程是不够的。函数可能没有界(它会达到+/-无穷大)。特别是,奇数次的多项式将是无包的,偶数次的第一个系数为正的多项式将有一个最小值,第一个系数为负的多项式将有一个最大值。@KarolyHorvath我的意思是,对于大于5次的多项式,此方法将失败(使用Symphy)因为没有一个分析性的解决方案。@Peterderivez:那就是糟糕的措辞。你这样说是为了一般的概念,而不是为了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
    
    (((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)