https://blog.csdn.net/sinat_17697111/article/details/81534935
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
1.非凸函數的非線性規划
非線性規划包括凸函數的和非凸函數的兩種,minimize主要是針對非凸函數的 求極值的。
2.minimize函數
fun: 求最小值的目標函數
x0:變量的初始猜測值,如果有多個變量,需要給每個變量一個初始猜測值。
method:求極值的方法.
minimize是求局部最優解的。
x0是一個向量,可以存儲多個輸入進來的參數。
constraints可以給x0中對應的變量設置范圍。
3.例子
# coding=utf-8 from scipy.optimize import minimize import numpy as np #demo 1 #計算 1/x+x 的最小值 def fun(): v=lambda x:1/x[0] +x[0] #v=1/x0+x0#不能這么寫 return v if __name__ == "__main__": x0 = np.asarray((2)) # 初始猜測值 res = minimize(fun(), x0, method='SLSQP') print(res.fun)#這樣來調用 print(res.success) print(res.x) #輸出: 2.0000000815356342 True [1.00028559]
如果初始化為3的話
if __name__ == "__main__": x0 = np.asarray((3)) # 初始猜測值 res = minimize(fun(), x0, method='SLSQP') print(res.fun)#這樣來調用 print(res.success) print(res.x) #輸出: -305175768.37511855 True [-3.05175768e+08]
可以看到它計算出了新的極小值,該函數的圖像,那能計算出負的這么大的,也是很神奇了。
4.返回的結果
from scipy.optimize import minimize def fun(): v=lambda x:1/x[0] +x[0] return v coef=minimize(fun(),2) # >>> coef fun: 2.0 hess_inv: array([[0.50030262]]) jac: array([0.]) message: 'Optimization terminated successfully.' nfev: 24 nit: 6 njev: 8 status: 0 success: True x: array([1.])
其中x就是取極小值時x的取值,可以通過
>>> coef['x'] array([1.])
獲取到,用於其他計算。