图书序言
主题3. 最佳化演算(Optimization) 求极值
前面的主题是解满足一阶导函数的根,因此,我们必须先微分求出导函数。但是,最简单的方法是直接对目标函数求解:同时解出目标极值和临界值。
Python完成这件事有sympy和scipy,笔者觉得sympy需要宣告的参数太多,尤其是在带限制式时。所以我们使用模组scipy内的函数optimize()和minimize(),Python程式码的步骤解说如下。
5.3-1 单变数
我们先看本章范例1的简单方程式,如下:
第1步:定义函数
from scipy import optimize
def f(x, sign=-1):
return sign*(2*x**3+3*x**2-12*x-7)
两行就OK,相当简易。待会我们再解释sign的意义。接下来执行求极值:
第2步:求解与结果
Result1 = optimize. minimize_scalar(f)
Result1.x
Result1.fun
f(Result1.x)
optimize. minimize_scalar()是求解函数。Result1内有许多物件,主要有三个:
(1) Result1.x: 解出的x值。
(2) Result1.fun: 解出的极小值,可以和f(Result1.x)对照是否一样。
(3) Result1.success: 回传求解是否成功(True/False)。
我们看看列印在萤幕的结果,如下:
Result1.x
Out[2]: 1.0
Result1.fun
Out[3]: -14.0
f(Result1.x)
Out[4]: -14.0
我们回去看范例1的图形,可能的临界值有两个,从图形看的出来,我们解出的只是极小值(1, -14)。那另一极大值的解呢?根据scipy说明文件,须把函数取负值 ,这也是我们为什么写函数时,要增加一个参数 sign,因为这样比较方便,判断极大值时,可以如下这样处理:
第1步:定义函数
def f(x, sign = -1):
return sign*(2*x**3+3*x**2-12*x-7)