万能的nga, 求问拉格朗日乘数法的对偶解法, 我用python算出来的结果为什么和正确答案不一样...

Altitude-avatar

Altitude

2020-11-04T09:12:09+00:00

*************下面贴代码*************

import sympy

print('定义未知数')
w1, w2, b, lam1, lam2, lam3 = sympy.symbols('w1 w2 b lam1 lam2 lam3')

print('定义目标函数和约束函数')
f = (w1**2 + w2**2) / 2
st1 = 1 - (3 * w1 + 3 * w2 + b) # <= 0
st2 = 1 - (4 * w1 + 3 * w2 + b) # <= 0
st3 = 1 - (-1 * w1 + -1 * w2 + -b) # <= 0

print('定义拉格朗日乘子式')
L = f + lam1 * st1 + lam2 * st2 + lam3 * st3
print('L=', L)
#L= lam1*(-b - 3*w1 - 3*w2 + 1) + lam2*(-b - 4*w1 - 3*w2 + 1) + lam3*(b + w1 + w2 + 1) + w1**2/2 + w2**2/2

print('求导')
d_w1 = sympy.diff(L, w1)
d_w2 = sympy.diff(L, w2)
d_b = sympy.diff(L, b)
print('d_w1=', d_w1)
print('d_w2=', d_w2)
print('d_b=', d_b)
#d_w1= -3*lam1 - 4*lam2 + lam3 + w1
#d_w2= -3*lam1 - 3*lam2 + lam3 + w2
#d_b= -lam1 - lam2 + lam3

print('解方程组')
x_solve = sympy.solve([d_w1, d_w2], w1, w2)
print('x_solve=', x_solve)
#x_solve= {w2: 3*lam1 + 3*lam2 - lam3, w1: 3*lam1 + 4*lam2 - lam3}
w1 = x_solve[w1]
w2 = x_solve[w2]

print('带回拉格朗日乘子式')
L = L.subs(x_solve)
print('L=', L)
#L= lam1*(-b - 18*lam1 - 21*lam2 + 6*lam3 + 1) + lam2*(-b - 21*lam1 - 25*lam2 + 7*lam3 + 1) + lam3*(b + 6*lam1 + 7*lam2 - 2*lam3 + 1) + (3*lam1 + 3*lam2 - lam3)**2/2 + (3*lam1 + 4*lam2 - lam3)**2/2

print('求导')
d_lam1 = sympy.diff(L, lam1)
d_lam2 = sympy.diff(L, lam2)
d_lam3 = sympy.diff(L, lam3)
d_b = sympy.diff(L, b)
print('d_lam1=', d_lam1)
print('d_lam2=', d_lam2)
print('d_lam3=', d_lam3)
print('d_b=', d_b)
#d_lam1= -b - 18*lam1 - 21*lam2 + 6*lam3 + 1
#d_lam2= -b - 21*lam1 - 25*lam2 + 7*lam3 + 1
#d_lam3= b + 6*lam1 + 7*lam2 - 2*lam3 + 1
#d_b= -lam1 - lam2 + lam3

print('解方程组')
lam_solve = sympy.solve([d_lam1, d_lam2, d_lam3, d_b], lam1, lam2, lam3, b)
print('lam_solve=', lam_solve)
#lam_solve= {lam1: 3/2, lam2: -1, lam3: 1/2, b: -2}

solve = lam_solve
solve['w1'] = w1.subs(lam_solve)
solve['w2'] = w2.subs(lam_solve)
print('solve=', solve)
#solve= {lam1: 3/2, lam2: -1, lam3: 1/2, b: -2, 'w1': 0, 'w2': 1}

subs = f.subs(solve)
print('subs=', subs)
#subs= 1/2


*************运算结果:*************

定义未知数
定义目标函数和约束函数
定义拉格朗日乘子式
L= lam1*(-b - 3*w1 - 3*w2 + 1) + lam2*(-b - 4*w1 - 3*w2 + 1) + lam3*(b + w1 + w2 + 1) + w1**2/2 + w2**2/2
求导
d_w1= -3*lam1 - 4*lam2 + lam3 + w1
d_w2= -3*lam1 - 3*lam2 + lam3 + w2
d_b= -lam1 - lam2 + lam3
解方程组
x_solve= {w1: 3*lam1 + 4*lam2 - lam3, w2: 3*lam1 + 3*lam2 - lam3}
带回拉格朗日乘子式
L= lam1*(-b - 18*lam1 - 21*lam2 + 6*lam3 + 1) + lam2*(-b - 21*lam1 - 25*lam2 + 7*lam3 + 1) + lam3*(b + 6*lam1 + 7*lam2 - 2*lam3 + 1) + (3*lam1 + 3*lam2 - lam3)**2/2 + (3*lam1 + 4*lam2 - lam3)**2/2
求导
d_lam1= -b - 18*lam1 - 21*lam2 + 6*lam3 + 1
d_lam2= -b - 21*lam1 - 25*lam2 + 7*lam3 + 1
d_lam3= b + 6*lam1 + 7*lam2 - 2*lam3 + 1
d_b= -lam1 - lam2 + lam3
解方程组
lam_solve= {lam1: 3/2, lam2: -1, lam3: 1/2, b: -2}
solve= {lam1: 3/2, lam2: -1, lam3: 1/2, b: -2, 'w1': 0, 'w2': 1}
subs= 1/2

*************正确答案*************

{'w1': 1/2, 'w2': 1/2, 'b': -2, 'lam1': 1/4, 'lam2': 0, 'lam3': 1/4}

跟我的算出来的不一样, 是哪里有问题...是我对对偶法的理解就有问题吧, 但是我找遍了知乎 , b站, 都没有能很好得解释并给出计算过程例子的, 都是讲讲概念.