Algorithm 无需作图求多项式最大值/最小值的算法
对于形式为y=a*x^2+b*x+c的二次方程,最大/最小值出现在x=-b/2a处。对于更高的多项式(x>=4),有没有像这样的硬性方程。对于这样的多项式,我在网上找到的解决方案建议绘制曲线并找到。如何在不作图的情况下找到绝对最大值?如果您只处理多项式,那么您应该检查。我不会详细介绍这背后的数学理论,也不会详细介绍所需的C代码,您可以找到完整的参考资料。但是,下面是算法的示意图: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]或类似
f
f
的导数,称之为g
(f'
)[MININT,MAXINT]
或类似的方法),使用您最喜欢的数值方法查找g
的零f
进行评估f
<强>注释< /强>如果你考虑任何限制区间外的多项式(即从-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)