命令fminunc().
单独写个.M文件,把约束条件写进去,在约束区有个“Nonlinear constraint function” @+"约束文件名"
例子:
求解如附件图片所示的有约束非线规划问题,分三个步骤
1.建立名为myobjfunc的m文件如下
function RES = myobjfunc(x)
RES=(x(3)*(1/(2*(x(3)^2 + x(5))*(x(4)^2 + x(3) + x(1)*x(2))^(1/2)) ...
- (2*x(3)*(x(4)^2 + x(3) + x(1)*x(2))^(1/2))/(x(3)^2 + x(5))^2))...
/(2*((x(4)^2 + x(3) + x(1)*x(2))^(1/2)/(x(3)^2 + x(5)) + 1)^(1/2)) ...
+ x(4)^2/(2*((x(4)^2 + x(3) + x(1)*x(2))^(1/2)/(x(3)^2 + x(5)) + 1)^(1/2)...
*(x(3)^2 + x(5))*(x(4)^2 + x(3) + x(1)*x(2))^(1/2)) ...
- (x(5)*(x(4)^2 + x(3) + x(1)*x(2))^(1/2))/(2....
*((x(4)^2 + x(3) + x(1)*x(2))^(1/2)/(x(3)^2 + x(5)) + 1)...
^(1/2)*(x(3)^2 + x(5))^2) + (x(1)*x(2))/(2*((x(4)^2 + x(3) + x(1)*x(2))...
^(1/2)/(x(3)^2 + x(5)) + 1)^(1/2)*(x(3)^2 + x(5))...
*(x(4)^2 + x(3) + x(1)*x(2))^(1/2));
2. 建立名为mymodelcons的m文件如下
function [C,CEQ]=mymodelcons(x)
C(1)=x(1)+x(2)^2-10;
C(2)=1-x(1)-x(2)^2;
CEQ=[];
3.在matlab命令窗口中输入以下命令并执行
lb=[0.5 0.5 0.5 1 1];
ub=[5 5 5 3 4];
[X,Y,FLAG]=fmincon(@myobjfunc,[1 1 1 1 1],[],[],[],[],lb,ub,@mymodelcons)
结果为
Active inequalities (to within options.TolCon = 1e-006):
lower upper ineqlin ineqnonlin
5 1 1
4
X = 5.0000 2.2361 1.2359 3.0000 1.0000.
==================================================
在天涯回答上有类似的问题的两个解答供参考
http://wenda.tianya.cn/wenda/thread?tid=29980be1cb2bb991
参考解答一
--------------------------------------------------
fun=@(x)sqrt(x(1)^2+x(2)^2)+sqrt(x(1)^2+(x(2)-52)^2)+sqrt(x(1)^2+(x(2)-139.5)^2)+sqrt(x(1)^2+(x(2)-228)^2)+sqrt(x(1)^2+(x(2)-288)^2)+sqrt((x(1)-65)^2+x(2)^2)+sqrt((x(1)-84)^2+x(2)^2)+sqrt((x(1)-110)^2+(x(2)-288)^2)+sqrt((x(1)-110)^2+(x(2)-217)^2)+sqrt((x(1)-110)^2+(x(2)-93)^2)+sqrt((x(1)-110)^2+x(2)^2)+sqrt((x(1)-65)^2+x(2)^2);
lb=[0;0];
ub=[110;228];
options=optimset('PlotFcns',{@optimplotx,@optimplotfirstorderopt,@optimplotstepsize,@optimplotfval});
[x,fval]=fmincon(fun,rand(2,1),[],[],[],[],lb,ub,[],options)
Optimization terminated: magnitude of directional derivative in search
direction less than 2*options.TolFun and maximum constraint violation
is less than options.TolCon.
No active inequalities.
x =
55.3467
74.3034
fval = 1.3748e+003
参考解答二
-------------------------------------------
(一)非线性一元函数的最小值
Matlab函数为fminbnd(),其使用格式为:
X=fminbnd(fun,x1,x2)
[X,fval,exitflag,output]= fminbnd(fun,x1,x2)
其中:fun为目标函数,x1,x2为变量的边界约束,即x1≤x≤x2,X为返回的满足fun取得最小值的x的值,而fval则为此时的目标函数值。 exitflag>0表示计算收敛,exitflag=0表示超过了最大的迭代次数,exitflag<0表示计算不收敛,返回值 output有3个分量,其中iterations是优化过程中迭代次数,funcCount是代入函数值的次数,algorithm是优化所采用的算法。
例1:求函数 在区间 的最小值和相应的 值。
解决此问题的Matlab程序为:
clear
fun='(x^5+x^3+x^2-1)/(exp(x^2)+sin(-x))'
ezplot(fun,[-2,2])
[X,fval,exitflag,output]= fminbnd(fun,-2,2)
结果为:
X = 0.2176
fval =-1.1312
exitflag = 1
output = iterations: 13
funcCount: 13
algorithm: 'golden section search, parabolic interpolation'
(二)无约束非线性多变量优化问题
这里我们介绍两个命令:fminsearch()和fminunc(),前者适合处理阶次低但是间断点多的函数,后者则对于高阶连续的函数比较有效。
命令fminsearch()的格式为:
X= fminsearch(fun,X0)
[X,fval,exitflag,output]= fminsearch(fun,X0,options)
该命令求解目标函数fun的最小值和相应的x值,X0为x的初始值,fval为返回的函数值,exitflag=1表示优化结果收敛,exitflag=0 表示超过了最大迭代次数。返回值output有3个分量,其中iterations是优化过程中的迭代次数,funcCount是代入函数值的次数,algorithm是优化所采用的算法。options是一个结构,里面有控制优化过程的各种参数,参考optimset()命令来设置,一般情况下我们不必改动它,即使用缺省设置就可以了。
例2:求函数 的最小值以及最小值点。
完成该计算的Matlab程序如下:
clear
fun1='sin(x)+cos(y)'
fun2='sin(x(1))+cos(x(2))'
ezmesh(fun1)
[X,fval]=fminsearch(fun2,[0,0])
X = -1.5708 3.1416
fval = -2.0000
其中语句ezmesh()是为了画出函数的图形,注意这里fun1和fun2的不同,考虑如果用相同的是否可行。
命令fminunc()的格式为:
X=fminunc(fun,X0)
[X,fval,exitflag,output,grad,hessian]=fminunc(fun,X0,options)
命令fminunc()通过计算寻找多变量目标函数fun的最小值,X0为优化的初始值,X为返回的变量的值,grad返回解点的梯度,hessian返回解点的汉森矩阵。其它参数的意义和命令fminsearch()相同。
例3:求函数 的最小值。
解:Matlab程序为
clear
fun='exp(x(1))*(2*x(1)^2+3*x(2)^2+2*x(1)*x(2)+3*x(2)+1)';
x0=[0,0];
options=optimset('largescale','off','display','iter','tolx',1e-8,'tolfun',1e-8);
[x,fval,exitflag,output,grad,hessian]=fminunc(fun,x0,options)
运行结果为:
Iteration
Func-count
f(x)
Step-size
Directional derivative
1
2
1
0.2
-10
2
8
0.369471
0.134277
-0.020 .