規(guī)劃問題之非線性規(guī)劃【筆記】
前言
若移動端查看數(shù)學(xué)公式不全或顯示錯誤
可以復(fù)制文章鏈接至PC端進(jìn)行查看
預(yù)備知識
語法
scipy.optimize.minimize(fun,?x0,?args=(),?method=None,?jac=None,?hess=None,?hessp=None,?bounds=None,?constraints=(),?tol=None,?callback=None,?options=None)
參數(shù)(部分)
fun: 目標(biāo)函數(shù) x0:變量的初始值。如果有多個變量,則需要給每個變量一個初始值。 args:常數(shù)值,fun中一般沒有數(shù)字,都以變量的形式表示,對于常數(shù)項(xiàng)及未知數(shù)前面的系數(shù),需要以參數(shù)的形式傳入 method:求極值的方法,一般使用默認(rèn)為SLSQP constraints:未知數(shù)的約束條件
API官方文檔:https://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.optimize.minimize.html
例題 - 1
題目
計(jì)算1/x + x 的「最小值」
解答
先畫出函數(shù) 1/x + x 的圖像(區(qū)間:-10 ~+10)
import?matplotlib.pyplot?as?plt
import?numpy?as?np
?
x?=?np.linspace(-10,10,num=100)
y?=?1/x?+?x
plt.plot(x,y)
plt.show()
可以發(fā)現(xiàn) 該函數(shù)沒有全局最優(yōu)解 , 有 「局部最優(yōu)解」

「使用scipy.optimize.minimize進(jìn)行求解」
當(dāng)設(shè)置初值x0為 2 時
from?scipy.optimize?import?minimize
import?numpy?as?np
#?目標(biāo)函數(shù)
def?fun(args):
????a?=?args?#?傳參
????v?=?lambda?x:a/x[0]?+?x[0]
????return?v
args?=?(1)
x0?=?np.asarray((2))
res?=?minimize(fun(args),?x0,?method='SLSQP')
res
求解局部最優(yōu)解為:fun: 2.0000000815356342

當(dāng)設(shè)置初值x0為 9 時
from?scipy.optimize?import?minimize
import?numpy?as?np
def?fun(args):
????a?=?args
????v?=?lambda?x:a/x[0]?+?x[0]
????return?v
args?=?(1)
x0?=?np.asarray((9))
res?=?minimize(fun(args),?x0,?method='SLSQP')
res
返回:fun: -2980232238769548.0 ,message: 'Rank-deficient equality constraint subproblem HFTI'

總結(jié):
因?yàn)閙inimize求解的是函數(shù)局部最優(yōu)解,所以不同的變量初始值x0,會產(chǎn)生不同的結(jié)果。 建議在不明確函數(shù)具體圖像的時候,多試試x0
例題 - 2
題目
求 的最小值
解答
評論
圖片
表情
