非线性规划可以简单分两种,目标函数为凸函数or非凸函数
凸函数的非线性规划,比如,有很多常用库完成,比如cvxpy
非凸函数的非线性规划(求极值),可以尝试以下方法:
纯数学方法,求导求极值
神经网络、深度学习(反向传播算法中链式求导过程)
scipy. optimize. minimize
scipy.optimize.minimize(fun,x,args=(),method=None,jac=None,hess=None,hessp=None,bounds= None,constaints=() , tol= None,Callback= None, options=None)fun:求最小值的目标函数args:常数值 constraints :约束条件 method:求极值方法,一 般默认。 xO:变量的初始猜测值,注意minimize是局部最优
计算/x + x 的最小值
from scipy.optimize import minimizeimport numpy as np def fun(args): a = args v = lambda x:a/x[] + x[] return v args = () x = np.asarray(()) res = minimize(fun(args), x, method=SLSQP) res
运行结果
计算的最小值,其中、、范围在. 到 . 之间
# 运行环境 Vs Code from scipy.optimize import minimizeimport numpy as np def fun(args): a,b,c,d = args v = lambda x: (a + x[]) / (b + x[]) - c * x[] + d * x[] return v def con(args): xmin,xmax,xmin,xmax,xmin,xmax = args cons = ({type:ineq,fun:lambda x : x[] - xmin}, {type:ineq,fun:lambda x:-x[] + xmax}, {type:ineq,fun:lambda x:x[] - xmin}, {type:ineq,fun:lambda x:-x[] + xmax}, {type:ineq,fun:lambda x:x[] - xmin}, {type:ineq,fun:lambda x:-x[] + xmax}) return cons args = (,,,) args = (., .,., .,., .) cons = con(args) x = np.asarray((.,.,.)) res = minimize(fun(args), x, method=SLSQP,constraints=cons) res.fun,res.success,res.x,res.status# 结果 (-., True, array([., ., .]), )
学习来源:B站及其课堂PPT,对其中代码进行了复现
希望对您有所帮助,如有错误欢迎小伙伴指正~