matlab解决一般的一元/多元函数的非线性优化问题

您所在的位置:网站首页 梯度法求解非线性规划问题 matlab解决一般的一元/多元函数的非线性优化问题

matlab解决一般的一元/多元函数的非线性优化问题

2024-03-24 13:22| 来源: 网络整理| 查看: 265

  在之前《matlab中解决线性规划问题》与《matlab解决有约束的的二次规划问题》两篇博文中,我们已经成功解决了两种多项式优化问题,现在我们来看更一般的情况。

  这里需要使用函数fmincon()。

  先使用help fmincon查看fmincon()的调用格式

help fmincon fmincon - Find minimum of constrained nonlinear multivariable function This MATLAB function starts at x0 and attempts to find a minimizer x of the function described in fun subject to the linear inequalities A*x ≤ b. x = fmincon(fun,x0,A,b) x = fmincon(fun,x0,A,b,Aeq,beq) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) x = fmincon(problem) [x,fval] = fmincon(___) [x,fval,exitflag,output] = fmincon(___) [x,fval,exitflag,output,lambda,grad,hessian] = fmincon(___)

   与《matlab解决有约束的的二次规划问题》(matlab解决有约束条件的二次规划问题_Konata的博客-CSDN博客_matlab 二次规划)中quadprog()函数对比,可以看到,fmincon的调用格式与求解非线性约束的二次规划时所用的quadprog()函数基本相同,在线性约束部分,同样含有A,b,Aeq,beq,lb,ub,这些参数,并且意思完全相同,不同之处在于非线性约束函数目标函数fun的定于与非线性约束条件nonlcon的定义。

任然使用例子来解释

【例1】求解优化问题

\begin{gathered} \min f(s, t)=s^{4}-4 s-8 t+15 \\ \text { s.t. }\left\{\begin{array}{c} 9-s^{2}-t^{2} \leq 0 \\ 2 s+3 t \leq 2 \\ t-s \leq 5 \end{array}\right. \end{gathered}

【分析】

目标函数的定义

需要使用函数句柄定义,或者新建一个脚本文件,对

\min f(s, t)=s^{4}-4 s-8 t+15

把s和t分别当作x(1)与x(2)

新建一个脚本fun.m,并且输入

function y=fun(x) y=x(1)^4-4*x(1)-8*x(2)+15; 非线性约束条件的定义

同目标函数的定义,使用函数句柄或者新建脚本来创建约束条件。

\text { s.t. }\left\{\begin{array}{c} 9-s^{2}-t^{2} \leq 0 \\ 2 s+3 t \leq 2 \\ t-s \leq 5 \end{array}\right.

对照约束函数的标准形式:

\min _{x} f(x) \text { such that }\left\{\begin{aligned} c(x) & \leq 0 \\ c e q(x) &=0 \\ A \cdot x & \leq b \\ \text { Aeq } \cdot x &=b e q \\ l b & \leq x \leq u b \end{aligned}\right.

可以知道:

1.需要将约束条件转化成“不等式左边为式子,右边为0”的形式。

(注意不等号的方向!)

2.标准形式中这里的Ceq表示等式约束,与二次规划中是类似的,当不含有等式约束时,Ceq为空,即Ceq=[]

新建脚本cons.m

function [c,ceq]=cons(x) c=[9-x(1)^2-x(2)^2]; ceq=[];

注意这个函数的函数头function [c,eq]=cons(x),有两个返回参数,c与ceq。同时注意返回参数的计算方法!

以上便完成了非线性约束条件的定义(线性约束条件还未定义!)

注:如果含有多个非线性约束条件

这个为例,则需要写成

function [c,eq]=cons(x)

c=[x(1)*x(2)+x(1)-x(2)+1.5;

10-x(1)*x(2)];

ceq=[];

fmincon()函数的调用

按照上文中利用help fmincon找出的调用格式,调用fmincon()即可。注意下面代码中的[1 2]这个参数,分别表示s和t的迭代初值是1和2。所谓“迭代”,这一词源于matlab中fmincon()函数的求解方法——迭代法,可以理解为一个接近与s和t的解的初值。   

其中A和b表示线性约束部分,可以参考matlab解决有约束条件的二次规划问题_Konata的博客-CSDN博客_matlab 二次规划一文

%A与b表示线性约束部分 A=[2 3;1 -1]; b=[2;5]; [x,fval,exitflag,output]=fmincon(@fun,[1 2],A,b,[],[],[],[],@cons)

输出结果:

x = -2.1454 2.0969 val = 27.9921 exitflag = 1 output = 包含以下字段的 struct: iterations: 9 funcCount: 37 constrviolation: 0 stepsize: 8.8282e-06 algorithm: 'interior-point' firstorderopt: 2.4874e-05 cgiterations: 0 message: '太长省略'

成功完成!

[例2]表示如下约束问题

\begin{array}{r} \min f\left(x_{1}, x_{2}\right)=\left(x_{1}-\frac{9}{4}\right)^{2}+\left(x_{2}-2\right)^{2} \\ \text { s.t. } x_{1}^{2}-x_{2} \leq 0 \\ x_{1}+x_{2} \leq 6 \\ x_{1}, x_{2} \geq 0 \end{array}

[代码]

非线性约束,有不等式非线性约束与等式非线性约束。在matlab中调用fmincon时,规定传入作为参数的非线性约束必须返回两个值,因此无法用@定义匿名函数完成,只能新建一个脚本,例如这里新建conv_opt_cons.m

function [c,ceq]=conv_opt_cons(x) c=x(1)^2-x(2); ceq=[];

下面是主代码:

fun=@(x)(x(1)-2.25)^2+(x(2)-2)^2; % f为一函数句柄 Aeq=[1 1]; % x1+x2 beq=6; % 与上面结合,表示x1+x20 x0=[0 0]; % 迭代初始点 options=optimset('Algorithm','sqp','TolFun',1e-16); [x,fval]=fmincon(fun,x0,[],[],Aeq,beq,lb,[],@conv_opt_cons,options)

Remark:

1. 目标函数可以新建脚本表示,但推荐使用更简单的匿名函数机制。这里又要注意,fmincon规定目标函数自变量只能有一个,因此要把这个自变量看成矩阵才能表示多元函数,用x(1)、x(2)等表示各个变量

2. 线性等式约束应表示为Aeq*x=beq的格式(回想线代,每行是一个等式),表示出Aeq和beq

3. 注意option的设定options=optimset('Algorithm','sqp','TolFun',1e-16);意思是Algorithm=sqp,TolFun=1e-16。其实就是键值对,但matlab没这个数据格式= =所以用逗号隔开



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3