赞
踩
阅读本文前,请先阅读 参考网址1-基础使用 中的案例,本文适用于运行过 fmincon函数 案例的读者!!!
fmincon函数中,可以调用五种算法(具体每种算法的详细原理,可自行百度,如搜索“SQP算法原理”等),分别是:
一般情况下,默认采用的是内点法(interior-point),当然也可修改。
修改方法如下:
options = optimoptions('fmincon','Algorithm','interior-point');
[XXXXX]=fmincon( XXXXXXXXX,options);
添加“options ”项,并将Algorithm后的 interior-point 改为其余算法即可,如“sqp”。
这里着重声明一下内点法:
考虑到内点法一般有两种,一是障碍函数内点法,二是primal-Dual内点法(原对偶内点法)。根据“参考网址3”可知,fmincon函数采用的是前者——障碍函数内点法!而非原对偶内点法。截图如下:
fmincon函数运行后,总会显示各种输出,如下图。尤其是fmincon函数在循环中的时候,这种输出尤为碍眼。因此,如何让fmincon函数不显示各种输出项?
方法:
options = optimoptions('fmincon','Display','notify');
[XXXXX]=fmincon( XXXXXXXXX,options);
添加“options ”项,并在Display后添加’notify’或’off’或’none’
详细信息见下图:(截图选自 参考网址2 )
以参考网址1中的例子为例,我们向my_try_fun1.m函数中传递一个参数a写法如下:
function f = my_try_fun1(x,a)
f=x(1).^2+x(2).^2+x(3).^2+a;
function [g,h]=my_try_fun2(x)
g=[-x(1).^2+x(2)-x(3).^2
x(1)+x(2).^2+x(3).^3-20];
h=[-x(1)-x(2).^2+2
x(2)+2*x(3).^2-3];
主函数为:
clear all
clc
options = optimoptions('fmincon','Display','notify','Algorithm','interior-point'); %表示针对fmincon函数,Display一项选择notify,Algorithm一项选择interior-point。详见 https://ww2.mathworks.cn/help/optim/ug/fmincon.html#busow0w-1
a = 8 ;
[x,y]=fmincon( @(x) my_try_fun1(x,a),rand(3,1),[],[],[],[],zeros(3,1),[],'my_try_fun2',options)
当然, my_try_fun2 函数若要传递参数,也可按照 my_try_fun1 的句柄方法书写,同理。
运行结果:
非线性约束函数必须返回两个输出。
第一个输出对应于非线性不等式,第二个输出对应于非线性等式。
因此,前述 ‘my_try_fun2’ 约束中才会返回两个输出 g 与 h 。( [g,h]=my_try_fun2(x) )
当然了,若是没有非线性等式约束,则可写h = [ ]; 即可,但不可不写 h,因为非线性约束函数必须返回两个输出!
如:将前述的 my_try_fun2.m 函数改为下式:
function [g,h]=my_try_fun2(x)
g=[-x(1).^2+x(2)-x(3).^2
x(1)+x(2).^2+x(3).^3-20];
h=[];
如下图,表示迭代超过了允许的默认设置中的函数计算的最大次数(对应名称为 MaxFunEvals )!
默认的函数计算的最大次数是3000次,因此,上调即可。我改为了100000。修改方法如下:
options = optimoptions('fmincon','MaxFunEvals',100000);
options = optimoptions('fmincon','TolFun',10^(-2));
options = optimoptions('fmincon','ObjectiveLimit',10^(-3));
案例:
options = optimoptions('fmincon','PlotFcns','optimplotfval');
结果显示:
求解器使用逼近的 Hessian 矩阵,它可能与真实的 Hessian 矩阵相差甚远。所以,为了稳定性及准确性,可人为输入 Hessian 矩阵。
下图以求解 Rosenbrock函数 为例,展示如何书写 Hessian 矩阵,并给出函数调用时,出现的问题。
直接调用上述函数后,报错。错误信息如下:
点击报错信息中的 “documentation page”,查阅错误原因。得知:是MATLAB版本差异导致的。在本人使用的 MATLAB 2014a 中,函数信息不含“SpecifyObjectiveGradient”等选项。
继而查阅新旧名称得知(参考网址8),名称发生了变化,因此,修改名称即可!
因此,只需要替换新旧名称即可!
code 如下:
fun = @rosenboth;
nonlcon = @unitdisk2;
x0 = [-1;2];
% options = optimoptions('fmincon','Algorithm','interior-point',...
% 'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,...
% 'HessianFcn',@hessianfcn);
options = optimoptions('fmincon','Algorithm','interior-point',...
'GradObj','on','GradConstr','on','Hessian','user-supplied','HessFcn',@hessianfcn);
[x,fval,exitflag,output] = fmincon(fun,x0,[],[],[],[],[],[],@unitdisk2,options);
function [f, g, H] = rosenboth(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2; g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); 200*(x(2)-x(1)^2)]; H = [1200*x(1)^2-400*x(2)+2, -400*x(1); -400*x(1), 200]; % if nargout > 1 % gradient required % g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); % 200*(x(2)-x(1)^2)]; % % if nargout > 2 % Hessian required % H = [1200*x(1)^2-400*x(2)+2, -400*x(1); % -400*x(1), 200]; % end % % end
(注意:该函数不是仅有目标函数 f !因为主函数的 options 中,设置了’GradObj’,‘on’。因此,目标函数中,除了原始目标函数以外,还必须有梯度及Hessian信息。)
function [c,ceq,gc,gceq] = unitdisk2(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [ ];
gc = [2*x(1);2*x(2)];
gceq = [];
% if nargout > 2
% gc = [2*x(1);2*x(2)];
% gceq = [];
% end
(同理:该函数不是仅有约束函数 c 及 ceq (其中,c为不等式约束,ceq为等式约束)。因为主函数的 options 中,设置了’GradConstr’,‘on’。因此,约束函数中,除了原始约束函数以外,还必须有梯度信息。注:此处不需要Hessian信息,只写梯度即可,因为约束的Hessian矩阵写在另一个函数中了)
function Hout = hessianfcn(x,lambda)
% Hessian of objective
H = [1200*x(1)^2-400*x(2)+2, -400*x(1);
-400*x(1), 200];
% Hessian of nonlinear inequality constraint
Hg = 2*eye(2);
Hout = H + lambda.ineqnonlin*Hg;
1)初级资料:参考网址1
2)完备资料:参考网址2
3)进阶资料:参考网址3-对数障碍内点法原理
4)进阶资料:参考网址4-非线性约束
5)进阶资料:参考网址5
6)进阶资料:参考网址6
7)进阶资料:参考网址7
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。