MATLAB基础问题 |
2010-11-20 51自学网 |
|
麻烦高手帮个忙,请问解有约束非线性规划问题,用MATLAB中的哪个函数?谢谢
再麻烦各位把函数的调用格式也写清楚吧,谢谢!
命令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 searchdirection less than 2*options.TolFun and maximum constraint violation is less than options.TolCon.No active inequalities.x = 55.3467 74.3034fval = 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程序为:clearfun='(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.2176fval =-1.1312exitflag = 1output = iterations: 13funcCount: 13algorithm: '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程序如下:clearfun1='sin(x)+cos(y)'fun2='sin(x(1))+cos(x(2))'ezmesh(fun1)[X,fval]=fminsearch(fun2,[0,0])X = -1.5708 3.1416fval = -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程序为clearfun='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)运行结果为:IterationFunc-countf(x)Step-sizeDirectional derivative1210.2-10280.3694710.134277-0.020 . |
|
|
|
|