# -*- coding: utf-8 -*- #導入sympy包,用於求導,方程組求解等等 from sympy import * #設置變量 x1 = symbols("x1") x2 = symbols("x2") alpha = symbols("alpha") beta = symbols("beta") #構造拉格朗日等式 L = (x1-7/4)*(x1-7/4) + (x2-5/2)*(x2-5/2) + alpha*(5-x1-x2) + beta*(x1+x2*x2-5*x2) #求導,構造KKT條件 difyL_x1 = diff(L, x1) #對變量x1求導 difyL_x2 = diff(L, x2) #對變量x2求導 difyL_beta = diff(L, beta) #對乘子beta求導 dualCpt = alpha * (5-x1-x2) #對偶互補條件 #求解KKT等式 aa = solve([difyL_x1, difyL_x2, difyL_beta, dualCpt], [x1, x2, alpha, beta]) #打印結果,還需驗證alpha>=0,x1>=0,x2>=0和不等式約束<=0 for i in aa: if i[2]>=0 and i[0] >= 0 and i[1]>=0: if (i[0]+i[1]-5) >= 0: print(i) ''' output (2.25000000000000, 4.50000000000000, 0.0, -1.00000000000000) (4.00000000000000, 1.00000000000000, 2.62500000000000, -1.87500000000000) (6.25000000000000, 2.50000000000000, 0.0, -9.00000000000000) '''
求出的三個極點分別為目標圓與拋物線上半相切,與直線和拋物線相交,與拋物線頂點相切
其中(9/4,9/2)時取得極小值
參考: