非线性规划拉格朗日乘子法python、Excel求解

拉格朗日乘子法实现非线性规划

  • 拉格朗日算子法原理
  • 拉格朗日乘子法python代码

拉格朗日算子法原理

通常我们需要求解的最优化问题有如下几类:

(i) 无约束优化问题,可以写为:

min f(x);

(ii) 有等式约束的优化问题,可以写为:

min f(x),

s.t. h_i(x) = 0; i =1, …, n

(iii) 有不等式约束的优化问题,可以写为:

min f(x),

s.t. g_i(x) <= 0; i =1, …, n

h_j(x) = 0; j =1, …, m

对于第(i)类的优化问题,常常使用的方法就是Fermat定理,即使用求取f(x)的导数,然后令其为零,可以求得候选最优值,再在这些候选值中验证;如果是凸函数,可以保证是最优解。

对于第(ii)类的优化问题,常常使用的方法就是拉格朗日乘子法(Lagrange Multiplier) ,即把等式约束h_i(x)用一个系数与f(x)写为一个式子,称为拉格朗日函数,而系数称为拉格朗日乘子。通过拉格朗日函数对各个变量求导,令其为零,可以求得候选值集合,然后验证求得最优值。

对于第(iii)类的优化问题,常常使用的方法就是KKT条件。同样地,我们把所有的等式、不等式约束与f(x)写为一个式子,也叫拉格朗日函数,系数也称拉格朗日乘子,通过一些条件,可以求出最优值的必要条件,这个条件称为KKT条件。

(a) 拉格朗日乘子法(Lagrange Multiplier)

对于等式约束,我们可以通过一个拉格朗日系数a 把等式约束和目标函数组合成为一个式子L(a, x) = f(x) + a*h(x), 这里把a和h(x)视为向量形式,a是横向量,h(x)为列向量,之所以这么写,完全是因为csdn很难写数学公式,只能将就了…。

然后求取最优值,可以通过对L(a,x)对各个参数求导取零,联立等式进行求取,这个在高等数学里面有讲,但是没有讲为什么这么做就可以,在后面,将简要介绍其思想。

(b) KKT条件

对于含有不等式约束的优化问题,如何求取最优值呢?常用的方法是KKT条件,同样地,把所有的不等式约束、等式约束和目标函数全部写为一个式子L(a, b, x)= f(x) + ag(x)+bh(x),KKT条件是说最优值必须满足以下条件:

  1. L(a, b, x)对x求导为零;

  2. h(x) =0;

  3. a*g(x) = 0;

求取这三个等式之后就能得到候选最优值。其中第三个式子非常有趣,因为g(x)<=0,如果要满足这个等式,必须a=0或者g(x)=0。 这是SVM的很多重要性质的来源,如支持向量的概念。

拉格朗日乘子法python代码

非线性规划拉格朗日乘子法python、Excel求解_第1张图片
代码实现为:

from sympy import *
x1,x2,k = symbols('x1,x2,k')
f = 60-10*x1-4*x2+(x1)**2+(x2)**2-x1*x2
g = x1+x2-8

#构造拉格朗日等式
L=f-k*g


#求导,构造KKT条件
dx1 = diff(L, x1)   # 对x1求偏导
print("dx1=",dx1)

dx2 = diff(L,x2)   #对x2求偏导
print("dx2=",dx2)

dk = diff(L,k)   #对k求偏导
print("dk=",dk)

dx1= -k + 2*x1 - x2 - 10
dx2= -k - x1 + 2*x2 - 4
dk= -x1 - x2 + 8

#求出个变量解
m= solve([dx1,dx2,dk],[x1,x2,k])   
print(m)

{x1: 5, x2: 3, k: -3}

#给变量重新赋值
x1=m[x1]
x2=m[x2]
k=m[k]

#计算方程的值
f = 60-10*x1-4*x2+(x1)**2+(x2)**2-x1*x2
print("方程的极小值为:",f)
方程的极小值为: 17

你可能感兴趣的:(非线性规划拉格朗日乘子法python、Excel求解)