機器學習6 python實現拉格朗日乘子法

2021-10-05 06:30:55 字數 2193 閱讀 7145

題目如下:等式約束下的拉格朗日乘子法求解過程

題目如上:

from scipy.optimize import minimize

import numpy as np

#目標函式:

deffunc

(args)

: fun =

lambda x:60-

10*x[0]

-4*x[1

]+ x[0]

**2+ x[1]

**2- x[0]

*x[1

]#fun = lambda x: 10 - x[0]**2 - x[1]**2

return fun

#約束條件,包括等式約束和不等式約束

defcon

(args)

: cons =()

#cons = (,

# )

return cons

if __name__ ==

"__main__"

: args =()

args1 =()

cons = con(args1)

x0 = np.array(

(2.0

,1.0))

#設定初始值,初始值的設定很重要,很容易收斂到另外的極值點中,建議多試幾個值

#求解#

res = minimize(func(args)

, x0, method=

'slsqp'

, constraints=cons)

print

(res.success)

print

("x1="

,res.x[0]

,"; x2="

,res.x[1]

)print

("最優解為:"

,res.fun)

結果如下:

題目如上:

#匯入sympy包,用於求導,方程組求解等等

from sympy import

*#設定變數

x1 = symbols(

"x1"

)x2 = symbols(

"x2"

)alpha = symbols(

"alpha"

)#beta = symbols("beta")

#構造拉格朗日等式

l =60-10

*x1 -

4*x2 + x1*x1 + x2*x2 - x1*x2 - alpha *

(x1 + x2 -8)

#求導,構造kkt條件

difyl_x1 = diff(l, x1)

#對變數x1求導

difyl_x2 = diff(l, x2)

#對變數x2求導

difyl_alpha = diff(l, alpha)

#對alpha求導

#求解kkt等式

aa = solve(

[difyl_x1, difyl_x2, difyl_alpha]

,[x1, x2, alpha]

)print

(aa)

x1=aa.get(x1)

x2=aa.get(x2)

alpha=aa.get(alpha)

print

("最優解為:",60

-10*x1 -

4*x2 + x1*x1 + x2*x2 - x1*x2 - alpha *

(x1 + x2 -8)

)

結果如下:

三種方法,結果一致!!

筆記 6 Python學習 函式

def 函式名 呼叫 函式名 乙個函式引數 def second name print name 我愛你!second 花花 花花我愛你!多個函式引數 def add num1,num2 result num1 num2 print result add 1,2 3函式的返回值return def ...

6 Python學習筆記 列表,元祖

列表 列表建立 var 1,2,3 列表訪問 索引以及切片訪問列表的區域性內容 列表的修改 1 可以通過索引切片的方式修改列表中已經存在的元素 刪除元素 del var 通過索引刪除元素 列表的方法 extend seq 將seq序列的每乙個元素依次追加到列表末尾 pop index 彈出指定索引位...

6 python學習之執行python的方式

python的直譯器 使用python 2.x直譯器 python py 使用python 3.x直譯器 python3 py 其他直譯器 知道 python的直譯器如今有多個語言的實現,包括 1 互動式執行python的優缺點 優點缺點 2 退出官方的直譯器 1 直接輸入exit exit 2 使...