对于形式为y = a * x ^ 2 + b * x + c的二次方程,max / min出现在x = -b / 2a处。对于更高的多项式(x> = 4),是否存在这样的硬和快等式。对于这样的多项式,我上网的解决方案建议绘制曲线并找到。如何在没有图形的情况下找到绝对最大值?
答案 0 :(得分:2)
如果您只处理多项式,那么您应该检查libmatheval。我不会详细说明这背后的数学理论和所需的C代码,你会找到一个完整的参考here。但是,这是算法的草图:
f
f
的衍生物,称之为g
(f'
)g
的零(可能是[MININT, MAXINT]
或类似的东西)。f
。f
。特别是,第6点的声明由a theoretical proof支持。
注意如果你考虑在任何限制区间之外的多项式(即从-inf到+ inf),那么它们是无界的,因为它们的最大值或最小值(或两者)都是无穷大。可能你对有限max / min(如果它们存在)感兴趣。您可以检查max或min是否应该是无限的,但是您不会从上面的算法中找到它,因为计算会对值施加数值限制:
min = -inf
和max = +inf
。max
和min
之间的值是有限的。答案 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是其最小值和最大值时,您还应检查等式的值。