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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。