Python非线性规划中Scipy库的应用是怎样的
Admin 2022-09-20 群英技术资讯 1148 次浏览
在日常操作或是项目的实际应用中,有不少朋友对于“Python非线性规划中Scipy库的应用是怎样的”的问题会存在疑惑,下面小编给大家整理和分享了相关知识和资料,易于大家学习和理解,有需要的朋友可以借鉴参考,下面我们一起来了解一下吧。
今天重点讲非线性规划中scipy.optimize.minize库在非线性规划中的应用。Scipy 是 Python 算法库和数学工具包,包括最优化、线性代数、积分、插值、特殊函数、傅里叶变换、信号和图像处理、常微分方程求解等模块。
scipy.optimize 模块中提供了多个用于非线性规划问题的方法,适用于不同类型的问题。
brent():单变量无约束优化问题,混合使用牛顿法/二分法。
fmin():多变量无约束优化问题,使用单纯性法,只需要利用函数值,不需要函数的导数或二阶导数。
leatsq():非线性最小二乘问题,用于求解非线性最小二乘拟合问题。
minimize():约束优化问题,使用拉格朗日乘子法将约束优化转化为无约束优化问题。
scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)
解释:

import numpy as np
from scipy.optimize import minimize
#目标函数
def fun(args1):
a,b,c,d=args1
r=lambda x:(a*x[0]*x[0]+b*x[1]*x[1]+c*x[2]*x[2]+d)
return r
def con(args2):
x0min,x1min,x2min=args2
cons=({'type':'eq','fun':lambda x:-x[0]-x[1]**2+2},
{'type':'eq','fun':lambda x:x[1]+2*x[2]**2-3},
{'type':'ineq','fun':lambda x:x[0]**2-x[1]+x[2]**2},
{'type': 'ineq', 'fun': lambda x: -(x[0]+x[1]**2+x[2]**2-20)},
{'type':'ineq','fun':lambda x:x[0]-x0min},
{'type':'ineq','fun':lambda x:x[1]-x1min},
{'type':'ineq','fun':lambda x:x[2]+x2min})
return cons
def main():
args1=(1,2,3,8)
args2=(0,0,0)
cons=con(args2)
x0=np.array((1,2,3)) #初值
res=minimize(fun(args1),x0,method='SLSQP',constraints=cons)
print('minf(x):',res.fun)
print(res.success)
print('x:',[np.around(i) for i in res.x])
print('x1:',res.x[0])
print('x2:',res.x[1])
print('x3:',res.x[2])
#另一种表述
print("optimization problem(res):{}".format(res.x))
print("Xopt={}".format(res.x))
print("minf(x)={:.4f}".format(res.fun))
if __name__ == "__main__":
main()
输出结果
minf(x): 13.878994794551044
True
x: [1.0, 1.0, 1.0]
x1: 0.6743061260520056
x2: 1.1513878035150682
x3: 0.961408393062538
optimization problem(res):[0.67430613 1.1513878 0.96140839]
Xopt=[0.67430613 1.1513878 0.96140839]
minf(x)=13.8790
Process finished with exit code 0
#from sko.DE import DE #差分进化法
from sko.GA import GA #遗传算法
def obj_func(p):
x1, x2, x3 = p
return x1 ** 2 + 2*x2 ** 2 + 3*x3 ** 2+8
constraint_eq = [
lambda x: -x[0]-x[1]**2+2,
lambda x: x[1]+2*x[2]**2-3
]
constraint_ueq = [
lambda x: -x[0]**2+x[1]-x[2]**2,
lambda x: x[0]+x[1]**2+x[2]**2-20
]
#de = DE(func=obj_func, n_dim=3, size_pop=50, max_iter=800, lb=[0, 0, 0],constraint_eq=constraint_eq, constraint_ueq=constraint_ueq)
ga = GA(func=obj_func, n_dim=3, size_pop=50, max_iter=800, lb=[0, 0, 0],
constraint_eq=constraint_eq, constraint_ueq=constraint_ueq)
#best_x, best_y = de.run()
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)
输出结果
best_x: [1. 1. 1.]
best_y: [14.]
Process finished with exit code 0

import numpy as np
from scipy.optimize import minimize
#目标函数(FG1+FG2+FG3)
def fun(args1):
a0,a1,a2,b0,b1,b2,c0,c1,c2=args1
v=lambda x:(a0+a1*x[0]+a2*x[0]*x[0]
+b0+b1*x[1]+b2*x[1]*x[1]
+c0+c1*x[2]+c2*x[2]*x[2])
return v
def con(args2):
D,x0min,x0max,x1min,x1max,x2min,x2max=args2
cons=({'type':'eq','fun':lambda x:D-x[0]-x[1]-x[2]},
{'type':'ineq','fun':lambda x:x[0]-x0min},
{'type':'ineq','fun':lambda x:-x[0]+x0max},
{'type':'ineq','fun':lambda x:x[1]-x1min},
{'type':'ineq','fun':lambda x:-x[1]+x1max},
{'type':'ineq','fun':lambda x:x[2]-x2min},
{'type':'ineq','fun':lambda x:-x[2]+x2max})
return cons
def main():
args1=(4,0.3,0.0007,3,0.32,0.0004,3.5,0.3,0.00045)
args2=(700,100,200,120,250,150,300)
cons=con(args2)
x0=np.array((150,250,200)) #初值
res=minimize(fun(args1),x0,method='SLSQP',constraints=cons)
print('FGi-代价:',res.fun)
print(res.success)
print('PGi—解:',[np.around(i) for i in res.x])
print('PG1:',res.x[0])
print('PG2:',res.x[1])
print('PG3:',res.x[2])
if __name__ == "__main__":
main()
输出结果
FGi-代价: 305.9673913046252
True
PGi—解: [176.0, 250.0, 274.0]
PG1: 176.0874477123534
PG2: 250.0
PG3: 273.9125522876465
Process finished with exit code 0
pyswarm是一个支持带约束的粒子群优化包,sko.PSO中的pso仅支持带上下限的约束,不支持等式和不等式约束,所以不太喜欢。
from pyswarm import pso
def object_func(x):
return (4+0.3*x[0]+0.0007*x[0]*x[0]+3+0.32*x[1]+0.0004*x[1]*x[1]+3.5+0.3*x[2]+0.00045*x[2]*x[2])
#不等式约束
def cons1(x):
return [x[0]+x[1]+x[2]-700]
lb = [100, 120, 150]#
ub = [200, 250, 300]
xopt, fopt = pso(object_func,lb,ub,ieqcons=[cons1], maxiter=100,swarmsize=1000)
print(xopt)
print(fopt)
输出结果
Stopping search: Swarm best objective change less than 1e-08
[179.34039956 250. 270.65960045]
305.97956393103044
Process finished with exit code 0
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
序列解包也可以用于列表、字典、enumerate对象、filter对象等等,但是对字典使用时,默认是对字典“键”进行操作,如果需要对“键:值”对进行操作,需要使用字典的items()方法说明,如果需要对字典“值”进行操作,则需要使用字典的values()方法明确指定。
这篇文章主要为大家介绍了python的集合类型,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
这篇文章主要介绍了利用Python代码提取音乐高潮部分,文章围殴绕Python代码的相关详情展开提取音乐的内容,需要的小伙伴可以参考一下
这篇文章主要介绍了python 中[0]*2与0*2的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
这篇文章主要介绍Python中requests做接口测试的内容,下面有具体的过程和步骤,对新手学习和了解requests做接口测试的方法有一定借鉴价值,感兴趣的朋友可以参考下。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008