Python 求函数极小值、极大值点
一、求极小值
1.不含参数的函数
例:求f(x)=sin(2*x)cos(3x)在x=0.2附近的极小值点。
利用scipy.optimize中的fmin函数求解,代码如下:
from scipy.optimize import fmin
import numpy as np
def f(x):
return np.sin(2*x)*np.cos(3*x)
result=fmin(f,0.2)#第一个参数是所求解的函数,第二个是x的初始迭代值
#result=fmin(f,0.2,disp=False,xtol=1e-8)
print(result[0])
fmin的第一个参数是所求解的函数,第二个是x的初始迭代值,这里选取在x=0.2处开始迭代,最终找到x=0.2附近的极小值点。如果函数有多个极小值点,则会得到靠近初始迭代值的那个极小值点。此外还可以设置参数disp=False来使得在求解时不输出任何消息,还可以修改参数xtol来设置误差,还可以设置参数args来求解含参数的函数(将在下面介绍)。
2.含参数的函数
例:求f(x)=sin(w1*x)cos(w2x)在x=0.2附近的极小值点,其中w1和w2是可任取的参数。
只需在fmin函数中设置参数args即可,代码如下:
from scipy.optimize import fmin
import numpy as np
def f(x,w1,w2):
return np.sin(w1*x)*np.cos(w2*x)
result=fmin(f,0.2,args=(2,3))#参数args=(2,3)代表w1=2, w2=3
#result=fmin(f,0.2,args=(2,3),disp=False,xtol=1e-8)
print(result[0])
二、求极大值
由于scipy.optimize中只有fmin函数,没有fmax函数,我们自定义一个fmax函数。代码如下:
from scipy.optimize import fmin
import numpy as np
def fmax(func, x0, args=(), **kwargs):
return fmin(lambda x:-func(x,*args),x0, **kwargs)#对函数加个负号相当于求极大值
def f(x):
return np.sin(2*x)*np.cos(3*x)
def f2(x,w1,w2):
return np.sin(w1*x)*np.cos(w2*x)
result=fmax(f,0.1)#,disp=False,xtol=1e-8
print(result[0])
result2=fmax(f2,0.1,args=(2,3))#,disp=False,xtol=1e-8
print(result2[0])
使用方法与fmin完全相同。