温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么使用Python求解带约束的最优化问题

发布时间:2021-04-25 14:12:54 来源:亿速云 阅读:879 作者:小新 栏目:开发技术

这篇文章主要介绍怎么使用Python求解带约束的最优化问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

python的五大特点是什么

python的五大特点:1.简单易学,开发程序时,专注的是解决问题,而不是搞明白语言本身。2.面向对象,与其他主要的语言如C++和Java相比, Python以一种非常强大又简单的方式实现面向对象编程。3.可移植性,Python程序无需修改就可以在各种平台上运行。4.解释性,Python语言写的程序不需要编译成二进制代码,可以直接从源代码运行程序。5.开源,Python是 FLOSS(自由/开放源码软件)之一。

题目:

怎么使用Python求解带约束的最优化问题

1. 利用拉格朗日乘子法

#导入sympy包,用于求导,方程组求解等等 from sympy import *    #设置变量 x1 = symbols("x1") x2 = symbols("x2") alpha = symbols("alpha") beta = symbols("beta")   #构造拉格朗日等式 L = 10 - x1*x1 - x2*x2 + alpha * (x1*x1 - x2) + beta * (x1 + x2)   #求导,构造KKT条件 difyL_x1 = diff(L, x1) #对变量x1求导 difyL_x2 = diff(L, x2) #对变量x2求导 difyL_beta = diff(L, beta) #对乘子beta求导 dualCpt = alpha * (x1 * x1 - x2) #对偶互补条件   #求解KKT等式 aa = solve([difyL_x1, difyL_x2, difyL_beta, dualCpt], [x1, x2, alpha, beta])   #打印结果,还需验证alpha>=0和不等式约束<=0 for i in aa:  if i[2] >= 0:  if (i[0]**2 - i[1]) <= 0:   print(i)

结果:

(-1, 1, 4, 6) (0, 0, 0, 0)

2. scipy包里面的minimize函数求解

from scipy.optimize import minimize import numpy as np    from mpl_toolkits.mplot3d import Axes3D from matplotlib import pyplot as plt    #目标函数: def func(args):  fun = lambda x: 10 - x[0]**2 - x[1]**2  return fun   #约束条件,包括等式约束和不等式约束 def con(args):  cons = ({'type': 'ineq', 'fun': lambda x: x[1]-x[0]**2},   {'type': 'eq', 'fun': lambda x: x[0]+x[1]})  return cons    #画三维模式图 def draw3D():  fig = plt.figure()  ax = Axes3D(fig)  x_arange = np.arange(-5.0, 5.0)  y_arange = np.arange(-5.0, 5.0)  X, Y = np.meshgrid(x_arange, y_arange)  Z1 = 10 - X**2 - Y**2  Z2 = Y - X**2  Z3 = X + Y  plt.xlabel('x')  plt.ylabel('y')  ax.plot_surface(X, Y, Z1, rstride=1, cstride=1, cmap='rainbow')  ax.plot_surface(X, Y, Z2, rstride=1, cstride=1, cmap='rainbow')  ax.plot_surface(X, Y, Z3, rstride=1, cstride=1, cmap='rainbow')  plt.show()   #画等高线图 def drawContour():  x_arange = np.linspace(-3.0, 4.0, 256)  y_arange = np.linspace(-3.0, 4.0, 256)  X, Y = np.meshgrid(x_arange, y_arange)  Z1 = 10 - X**2 - Y**2  Z2 = Y - X**2  Z3 = X + Y  plt.xlabel('x')  plt.ylabel('y')  plt.contourf(X, Y, Z1, 8, alpha=0.75, cmap='rainbow')  plt.contourf(X, Y, Z2, 8, alpha=0.75, cmap='rainbow')  plt.contourf(X, Y, Z3, 8, alpha=0.75, cmap='rainbow')  C1 = plt.contour(X, Y, Z1, 8, colors='black')  C2 = plt.contour(X, Y, Z2, 8, colors='blue')  C3 = plt.contour(X, Y, Z3, 8, colors='red')  plt.clabel(C1, inline=1, fontsize=10)  plt.clabel(C2, inline=1, fontsize=10)  plt.clabel(C3, inline=1, fontsize=10)  plt.show()     if __name__ == "__main__":  args = ()  args1 = ()  cons = con(args1)  x0 = np.array((1.0, 2.0)) #设置初始值,初始值的设置很重要,很容易收敛到另外的极值点中,建议多试几个值    #求解#  res = minimize(func(args), x0, method='SLSQP', constraints=cons)  #####  print(res.fun)  print(res.success)  print(res.x)    # draw3D()  drawContour()

结果:

7.99999990708696 True [-1.00000002 1.00000002]

怎么使用Python求解带约束的最优化问题

以上是“怎么使用Python求解带约束的最优化问题”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI