python非线性最优化问题,python 非线性优化

  python非线性最优化问题,python 非线性优化

  Python中的建模和规划——非线性编程

  基本介绍

  当目标函数或约束包含非线性函数时,这类规划问题称为非线性规划问题。

  标题。一般来说,求解非线性规划比求解线性规划要困难得多。另外,它不像线性规划。

  在单纯形法的一般方法中,目前还没有适用于各种问题的非线性规划通用算法。每种方法

  都有自己特定的适用范围。

  这是非线性规划问题的一般形式。

  鉴于实际问题,将其归类为非线性规划问题,一般应注意以下几点:

  (一)决定选项)首先收集有关问题的信息和数据,在充分熟悉问题的基础上,确定问题的选项是什么,并用一系列变量表示出来。

  (二)提出追求目标)经过数据分析,根据实际需要和可能,提出追求最小化或最大化的目标。并运用各种科学技术原理,表示为数学关系。

  (三)指明价值标准)在提出所要追求的目标后,确立所要考虑的目标的“好”或“坏”的价值标准,并以某种量化的形式加以描述。

  ()约束条件)一般所追求的目标需要找到所有提出问题的约束条件,才能在一定条件下达到最小或最大的效果。这些条件通常用变量之间的不等式或方程来表示。

  线性规划和非线性规划的区别

  如果线性规划存在最优解,则只能在其可行域的边界(尤其是可行域的顶点)达到最优解;当存在最优解时,非线性规划的最优解可能在其可行域的任何一点上实现。

  非线性规划的Matlab求解

  它的返回值是向量x .其中FUN是M文件中定义的函数F(x);X0是x初始值;a,B,Aeq和Beq定义了线性约束a*xb,Aeq * X=Beq。如果没有线性约束,那么A=[],B=[],Aeq=[],BEQ=[];而LB UB是变量x的上下界,如果上下界无约束,LB=[],UB=[],如果x无界,LB的所有分量都是-inf,如果x无界,UB的所有分量都是INF;NONLCON是非线性向量函数c(x),CEQ))x;在M文件中定义;选项定义优化参数,并允许使用Matlab的默认参数设置。

  让我们举个例子

  多余的我就不说了,matlab可以详细阅读。

  仔细看看非线性规划问题的解决方案。

  用Python求解非线性规划

  非线性规划可以简单地分为两类,目标函数是凸的或非凸的。

  凸函数的非线性编程,比如fun=x2 y2 xy,在很多常见的库中都有(比如cvxpy)

  对于非凸函数的非线性规划(求极值),请尝试以下方法:

  用纯数学方法求极值。

  神经网络,深度学习(反向传播算法中的链导数过程)))))))))。

  scipy。选择imize。最小化

  scipy.optimize.minimize(fun,x0,args=),method=None,jaC=None,hess=None,hes sp=None,bounds=None

  寻找乐趣:最小值的目标函数

  参数:常数值

  方法:极值的计算方法通常是默认的。

  约束条件:

  X0:变量的初始推测值。请注意,最小化是局部最佳选择。

  1.等式约束的拉格朗日乘子法。

  2.Python实现了约束非线性规划的求解。

  用Python编程解决

  介绍sympy软件包,用于方程的推导和求解等。

  从系统导入*

  #设置变量

  x1=符号(x1)).

  x2=符号(x2)))).

  Alpha=符号(Alpha())))))。

  # beta=符号( beta)).

  构建拉格朗日方程

  l=60-10 * x1-4 * x2 x1 * x1 x2 * x2-x1 * x2-alpha *(

  #寻求指导,建立KKT条件

  Diyl _ x1=export diff (l,x1) #变量x1

  Diyl _ x2=Export diff (l,x2) #变量x2

  Diyl _ alpha=diff (l,alpha) #请求alpha引导

  求解KKT方程

  aa=solve([difYL_x1,difyL_x2,difyL_alpha],[x1,x2,alpha]))))))))

  /p打印(aa)

  使用python SciPy库解决问题

  来自scipy.optimize导入最小化

  将numpy作为np导入

  #目标函数:

  定义函数(参数):

  fun=lambda x:60-10 * x[0]-4 * x[1]x[0]* * 2 x[1]* * 2-x[0]* x[1]

  返回乐趣

  #约束,包括等式约束和不等式约束

  def con(参数):

  cons=({type: eq , fun: lambda x: x[0] x[1]-8})

  退货单

  if __name__==__main__ :

  args=()

  args1=()

  cons=con(args1)

  X0=np.array((2.0,1.0)) #设置初始值。初始值的设定很重要,容易收敛到另一个极值点。建议多尝试几个值。

  #解决#

  res=minimize(func(args),x0,method=SLSQP ,constraints=cons)

  打印(研究和娱乐)

  打印(成功)

  打印(分辨率x)

  结果比较

  1.通过普通法寻求结果

  2.Scipyzjym结果

  通过对两个Python程序的解的比较分析,发现两个程序的解是相似的,误差在一定范围内,可以认为两个程序的解是一致的。

  1个示例

  计算1/x x的最小值

  如果我们对这个函数的性质足够熟悉,我们很容易得到它。在x0,它的最小值是2,因为是双钩函数,是奇函数。我们可以从基本不等式中得到它的最小值,但是怎么用程序实现呢?

  来自scipy.optimize导入最小化

  将numpy作为np导入

  #计算1/x x的最小值

  定义乐趣(参数):

  a=args

  v=x:a/x[0]x[0]

  返回v

  if __name__==__main__ :

  args=(1) #a

  X0=np.asarray((2)) #初始猜测值

  res=minimize(fun(args),x0,method=SLSQP )

  打印(分辨率)

  #打印(研究和娱乐)

  #打印(res.success)

  #打印(分辨率x)

  我们可以得到下面的结果,我们可以得到函数的最小值大于2点,我们可以看到最小值就是局部最优。

  示例2

  计算(2 x1)/(1 x2)-3x1 4x3的最小值,其中x1、x2和x3的范围为0.1到0.9。

  来自scipy.optimize导入最小化

  将numpy作为np导入

  #计算(2 x1)/(1 x2)-3x1 4x3的最小值,其中x1、x2和x3的范围为0.1到0.9。

  定义乐趣(参数):

  a,b,c,d=args

  v=x:(a x[0])/(b x[1])-c * x[0]d * x[2]

  返回v

  def con(参数):

  #约束分为eq和ineq

  #eq表示函数结果等于0;Ineq表示表达式大于或等于0。

  x1min,x1max,x2min,x2max,x3min,x3max=args

  cons=({type:ineq , fun:lambda x:x[0]-x1min},\

  {type:ineq , fun: lambda x:-x[0] x1max},\

  {type:ineq , fun: lambda x:x[1]-x2min},\

  {type:ineq , fun: lambda x:-x[1] x2max},\

  {type:ineq , fun: lambda x:x[2]-x3min},\

  {type:ineq , fun: lambda x:-x[2] x3max})

  退货单

  if __name__==__main__ :

  #定义常数值

  args=(2,1,3,4) #a,b,c,d

  #设置参数范围/约束

  args1=(0.1,0.9,0.1,0.9,0.1,0.9) #x1min,x1max,x2min,x2max

  cons=con(args1)

  #设置初始猜测值

  x0=np.asarray((0.5,0.5,0.5))

  res=minimize(fun(args),x0,

  方法=SLSQP ,约束=cons)

  打印(分辨率)

  打印(研究和娱乐)

  打印(成功)

  打印(分辨率x)

  可以看出,对于这类简单函数,局部最优解与真实最优解相差不大,但对于复杂函数,x0的初值会极大地影响最优解的结果。

  添加:

  全局优化函数:scipy.optimize.basinhopping

  一个缺点是无法设置约束,无法找到全局最优解函数。

  https://docs . scipy . org/doc/scipy/reference/generated/scipy . optimize . basin hopping . html

  每日一句

  不要太努力去找,最好的总会在最不经意的时候出现。

  不要太努力去找,最好的总会在最不经意的时候出现。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: