1、概述
今天重点讲非线性规划中scipy.optimize.minize库在非线性规划中的应用。Scipy 是 Python 算法库和数学工具包,包括最优化、线性代数、积分、插值、特殊函数、傅里叶变换、信号和图像处理、常微分方程求解等模块。
scipy.optimize 模块中提供了多个用于非线性规划问题的方法,适用于不同类型的问题。
brent():单变量无约束优化问题,混合使用牛顿法/二分法。
fmin():多变量无约束优化问题,使用单纯性法,只需要利用函数值,不需要函数的导数或二阶导数。
leatsq():非线性最小二乘问题,用于求解非线性最小二乘拟合问题。
minimize():约束优化问题,使用拉格朗日乘子法将约束优化转化为无约束优化问题。
2、scipy.optimize.minimize参数scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)
解释:
fun: 求最小值的目标函数
x0:变量的初始猜测值,如果有多个变量,需要给每个变量一个初始猜测值。minimize是局部最优的解法,所以
args:常数值,后面demo会讲解,fun中没有数字,都以变量的形式表示,对于常数项,需要在这里给值
method:求极值的方法,官方文档给了很多种。一般使用默认。每种方法我理解是计算误差,反向传播的方式不同而已,这块有很大理论研究空间
constraints:约束条件,针对fun中为参数的部分进行约束限制
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 04、电力系统中应用——经济调度
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 05、参考文献
原文链接:https://blog.csdn.net/kobeyu652453/article/details/113876312
原文链接:https://blog.csdn.net/youcans/article/details/118396836
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)