ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

用拉格朗日乘子法求解带约束最优化问题

2020-03-10 16:04:06  阅读:566  来源: 互联网

标签:拉格朗 difyL 求导 beta x2 alpha x1 最优化 乘子法


 

 

 

 

 

 

 

 

# -*- 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)时取得极小值

 

参考:

1.浅谈拉格朗日乘子法

2.Python科学计算利器——SymPy库

3.使用Python求解带约束的最优化问题详解

标签:拉格朗,difyL,求导,beta,x2,alpha,x1,最优化,乘子法
来源: https://www.cnblogs.com/exciting/p/12456209.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有