Format和fmincon优化函数
近来在学习利用matlab书写的优化算法,其中用到了format和fmincon函数,正好之前没有对这两个函数有所了解过,所以就趁这个机会学习一下两个函数的使用方法。
-
format函数(设置命令行窗口的输出显示格式)
-
通过官方的帮助文档可以看到有以下使用语法:
format(style) fmt = format fmt = format(style)
-
针对以上的语法
% 第一个语法 format(style) 的使用,是事先指定接下来所使用的变量的数据格式 format ("long") % 或者 format long a = 0.1234850 a;% 此时若是在matlab中进行输入,得到的结果将会是后面补零的共 16 位的数据。 b = format; % 此时会输出当前工作空间中数据的具体数据格式 c = format("short"); % 会将当前的数据格式设置为short,并把上一个设置的数据格式信息存进c中 format(b); % 会把b的数据格式重新加载进工作空间中 a; c;
上述代码运行的结果如下图:
- 上述语法中的style的类型有以下几种,比较常用的也就前面两种。
-
-
fmincon函数
官方解读:寻找约束非线性多变量函数的最小值
% 语法格式 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(___)
- 针对以上语法需要注意的是该优化函数使用时候的通式
图中主要是优化函数的大体格式,其中
$A*x<=b$ 和 $Aeq*x=beq$ 这俩公式是线性等式和不等式的约束。
$lb<=x<=ub$ 是优化条件中的上下边界。
$C(x)<=0 和 Ceq(x) = 0$ 是非线性等式和不等式约束,一般在设置nonlcon中实现。
$f(x)$ 则表示优化的函数。
如若没有对应的约束条件,则只需要将相应的位置**设置为空**矩阵即可。
针对以上的参数,举例说明:
```matlab
fun = @(x) 100*(x(2)-x(1)^2)^2 + (1-x(1))^2; %设置目标函数,属于匿名函数
lb = [0,0.2];
ub = [0.5,0.8]; % x1和x2的最佳值在[0,0.5]及[0.2,0.8]范围内寻找,相当于上文提到的边界值
A = [];
b = [];
Aeq = [];
beq = []; % 无线性约束,上面四个参数设置为空
x0 = [1/4,1/4]; % 定义初始值
nonlcon = @circlecon % 设置非线性约束的函数
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon); % 调用优化函数
function [c,ceq] = circlecon(x) % 该函数应用时,理应单独设置一个文件
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2
ceq = [];
```
-
除上外,在官方提供的语法里,还有个参数是:options——该参数为非默认参数,也就是说可以不设置。
-
option选项的语法是以下的格式:
option = optimoptions('fmincon','display','iter','Algorithm','sqp'); % 上段语法中包含了算法的计算显示和算法选择两个参数。对于有梯度的目标函数优化,可以进行以下的代码设置 option = optimoptions('fmincon','SpecifyObjectiveGradient','ture');
具体的可以参考optimoptions参数设置。
-
-
有了输入就要有输出,针对fmincon函数的输出,从函数的语法结构上最后一个可以看到共有以下的几种输出参数。
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(___)
其中:官网参数释义参考
- x:表示优化的函数的最优解,x(1)、x(2)、x(3)…等
- fval:表示优化后的函数值
- exitflag:该值为1的话,表示fval值为该优化的的局部最小值,并不是最小值。
- output:该参数是一个结构体,其中可以参考的有,iterations——迭代次数;funcCount——函数计算次数;constrviolation——表示可行性。
- lambda:也是一个结构体,一般用不到。
- grad:表示在解 x 处的目标函数梯度值。
- hessian:逼近黑塞矩阵。(不太懂,可参考Hessian矩阵输出)
-
针对fmincon函数的具体使用基本就是上面的这些,如果需要再深入研究可以参考官方文档:fmincon函数