1)fmin_bfgs(,)
标量函数极值求解。
是求值的函数,是梯度下降的初始值。
返回函数最小值的x值,如果有局部最小值,会返回局部最小值。
>>>from scipy.optimize import fmin_bfgs
>>>import numpy as np
>>>import matplotlib.pyplot as plt
'''
求函数: f(x) = x^2 + 2x + 1的极小值
'''
>>># 函数
>>>def f(x):
>>> return (x**2 + 2*x + 1)
>>>x = np.arange(-5,5,0.1)
>>># 画出曲线
>>>plt.plot(x,f(x))
>>># 返回极小值
>>>x_cord = fmin_bfgs(f,0)
>>>x_min = x_cord[0]
>>>y_min = f(x_min)
>>># 画出点
>>>plt.scatter(x_min,y_min,s=20,c='b')
>>>plt.show()
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 2
Function evaluations: 9
Gradient evaluations: 3
2)basinhopping(,)
标量函数极值求解。
返回函数全局最小值的x值。
比fmin_bfgs()消耗更多资源,但不会返回局部最小值。
>>>from scipy.optimize import basinhopping
>>>import numpy as np
>>>import matplotlib.pyplot as plt
'''
求函数: f(x) = x**2 + 10*cos(x)的极小值
'''
>>># 函数
>>>def f(x):
>>> return (x**2 + 10*np.cos(x))
>>>x = np.arange(-5,5,0.1)
>>># 画出曲线
>>>plt.plot(x,f(x))
>>># 返回极小值
>>>x_cord = basinhopping(f,0)
>>>print(x_cord)
>>>x_min = x_cord.x[0]
>>>y_min = f(x_min)
>>># 画出点
>>>plt.scatter(x_min,y_min,s=20,c='b')
>>>plt.show()
fun: -1.8089833418214676
lowest_optimization_result: fun: -1.8089833418214676
hess_inv: array([[0.09479589]])
jac: array([1.78813934e-07])
message: 'Optimization terminated successfully.'
nfev: 18
nit: 4
njev: 6
status: 0
success: True
x: array([2.59573908])
message: ['requested number of basinhopping iterations completed successfully']
minimization_failures: 0
nfev: 1650
nit: 100
njev: 550
x: array([2.59573908])
3)brute(,)
函数蛮力法,与basinhopping()类似,但效率极低。
>>>from scipy.optimize import brute
>>>import numpy as np
>>>import matplotlib.pyplot as plt
'''
求函数: f(x) = x**2 + 10*cos(x)的极小值
'''
>>># 函数
>>>def f(x):
>>> return (x**2 + 10*np.cos(x))
>>>x = np.arange(-5,5,0.1)
>>># 画出曲线
>>>plt.plot(x,f(x))
>>># 返回极小值
>>>r = slice(-np.pi/2, np.pi/2, np.pi/200)
>>>x_cord = brute(f,(r,))
>>>print(x_cord)
>>>x_min = x_cord[0]
>>>y_min = f(x_min)
>>># 画出点
>>>plt.scatter(x_min,y_min,s=20,c='b')
>>>plt.show()
[-2.59572559]
4)fminbound(,,)
取一定范围内的函数最小值。
和是范围边界。
>>>from scipy.optimize import fminbound
>>>import numpy as np
>>>import matplotlib.pyplot as plt
'''
求函数: f(x) = x**2 + 10*cos(x)在π/2和3π/4之间的极小值
'''
>>># 函数
>>>def f(x):
>>> return (x**2 + 10*np.cos(x))
>>>x = np.arange(-5,5,0.1)
>>># 画出曲线
>>>plt.plot(x,f(x))
>>># 返回极小值
>>>x_min = fminbound(f,np.pi/2,3/4*np.pi)
>>>y_min = f(x_min)
>>># 画出点
>>>plt.scatter(x_min,y_min,s=20,c='b')
>>>plt.show()
5)fsolve(,)
函数求解,返回函数的根值。
>>>from scipy.optimize import fsolve
>>>import numpy as np
'''
求一元函数函数: f(x) = x**2 + 10*cos(x)的解
'''
>>># 函数
>>>def f(x):
>>> return (x**2 + 10*np.cos(x))
>>>res = fsolve(f,1)
>>>print(res)
[1.96887294]
'''
求解方程组:
f1(x+2y) = 0
f2(y-4)= 0
'''
>>>def f(x):
>>> return [
>>> x[0]+2*x[1],
>>> x[1]-4
>>> ]
>>>res = fsolve(f,[1,1])
>>>print(res)
[-8. 4.]
6)curve_fit(,,)
为函数创建拟合曲线。
,为样本数组
返回曲线的系数和协方差。
>>>from scipy.optimize import curve_fit
>>>import numpy as np
>>>import matplotlib.pyplot as plt
'''
根据函数生成数据: f(x) = x**2 + 10*cos(x)
'''
>>># 函数
>>>def f(x, a, b):
>>> return a*np.sin(x) + b
>>># 制作样本数据
>>>x_data = np.linspace(-10,10,10)
>>>y_data = f(x_data, 10, 1) + np.random.randn(x_data.size)# 加入噪声
>>># 生成曲线
>>>variables,variables_covariance = curve_fit(f,x_data,y_data)
>>>print("系数:{}".format(variables))
>>>print("协方差:{}".format(variables_covariance))
系数:[10.48927209 0.77088139]
协方差:[[ 8.79371473e-02 -9.99394876e-11]
[-9.99394876e-11 4.52348670e-02]]
7)leastsq(,,)
用最小二乘拟合法获得最符合函数的曲线。
表示初始参数值。
表示函数的其他参数。
>>>from scipy.optimize import leastsq
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>># 创建数据
>>>a = np.arange(0,100,5)
>>>b = np.array([0,5,14,24,34,36,41,43,47,53,56,61,63,65,71,75,76.80,85,95,100])
>>># 创建函数
>>>def f(x):
>>> x1,x2 = x
>>> return b-(x1*a+x2)
>>>res = leastsq(f,[1,10])
>>>k,p = res[0]
>>>print(k,p)
>>># 画图
>>>plt.figure(figsize=(8,6))
>>>plt.scatter(a,b,color="green",label="Samples",linewidth=2)
>>>x = np.linspace(0,100,100)
>>>y = k*x +p
>>>plt.plot(x,y,color="red",label="fit",linewidth=2)
>>>plt.legend()
>>>plt.show()
0.9414135338344587 7.522857142851741