我试着用极小标量来计算一维多项式的最小值和最大值。你知道吗
多项式是x^{6}-2x^{5}-26x^{4}+28x^{3}+145x^{2}-26x-80
代码如下所示
import numpy as np
from scipy.optimize import *
ppar = np.array([1, -2, -26, 28, 145, -26, -80])
p = np.poly1d(ppar)
print p
maximum = minimize_scalar(-p, bounds=(-3.978, 3.068), method = 'bounded')
print "(-3.978, 3.068)", -maximum.fun
print maximum
minimum = minimize_scalar(p, bounds=(-3.978, 3.068), method = 'bounded')
print "(-3.978, 3.068)", minimum.fun
print minimum
结果是
6 5 4 3 2
1 x - 2 x - 26 x + 28 x + 145 x - 26 x - 80
(-3.978, 3.068) 86.0883584933
status: 0
nfev: 12
success: True
fun: -86.0883584932823
x: -1.5444720061831096
message: 'Solution found.'
(-3.978, 3.068) -81.1476243092
status: 0
nfev: 11
success: True
fun: -81.147624309245643
x: 0.08767224353999728
message: 'Solution found.'
然而,一维多项式的实际解应该是最大值:在x=2.176时为264.155,在x=-3.391时为最小值-436.947
有没有人知道我的代码出了什么问题,或者我遗漏了什么?你知道吗
谢谢你的帮助和评论。你知道吗
简单的答案是使用scipy.optimize.minimize_scalar可以找到局部最小值。详情见@ev-br answer。但是,可以使用global optimization方法在给定的范围内找到函数的全局最小值。即使在这种情况下,你也应该准备好,这些方法也可能失败,因为在引擎盖下使用了局部极小值。在下一个示例中,您可以看到shgo优化器无法找到全局最小值:
多项式是振荡的,并且有几个极值。你得到的只是不同的。请注意,局部极小值找到a极小值,如果有多个,则报告其中一个。你知道吗
对于多项式,最好使用专门的极小值。例如,使用伴随矩阵方法区分并找到导数的根:
伴随矩阵的特征值是导数的根(反之亦然),因此原始多项式的极值:
必须注意的一点是,最好避免使用高次多项式,因为它们是不稳定的。你知道吗
相关问题 更多 >
编程相关推荐