matlab的fmincon函数程序运行问题求助

作者&投稿:旁兰 (若有异议请与网页底部的电邮联系)
关于matlab@fmincon函数运行出错问题,高分求高人指点~

如果你想听我的意见,请按下面要求修改,看起来很麻烦,当然如果你不想就罢了。
既然出问题的函数是fmincon,所以请不要把与此无关的函数贴上来,我也不会管。
目标函数是beta_myfun。但是这个函数的代码却没有出现,当然加入你确定不会有问题就算了。
非线性约束函数是beta_consfun。但个函数里竟然出现了load和assignin之类“奇特”的代码,请改写程序,把它们去掉。没有什么参数是不可以写到参数列表里的。
请参阅matlab帮助文档中的Anonymous Functions一节,学习使用匿名函数的技巧更好的封装函数。

你的约束条件:
A=[-1,0,0;1,0,0;0,-1,6;0,1,-8;0,0,-1;0,0,1]
b=[-15;-19;0;0;-19;32]
是不是:
x(1) >= 15 第1列
x(1) <= 19 第2列
x(3) >= 19 第5列
x(3) <= 32 第6列

将其整合到:
LB=[15,113,19];UB=[19,160,32];

此后:
A=[0,-1,6;0,1,-8];
b=[0;0];

........
完整代码(7.1以上版本)

lian = @(x) -37.57./((x(1)/19).^1.08.*(0.71332+0.0085.*x(2)./x(3)-(x(2)./x(3)).^2/3000));

A=[0,-1,6;0,1,-8];
b=[0;0];

LB=[15,113,19];UB=[19,160,32];

x0=[15,114,19]';

[x,fval,exitflag,output]=fmincon(lian,x0,A,b,[],[],LB,UB)

命令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 .


洪雅县13276633198: matlab中的fmincon函数的用法!急x0=[1;1;1;1]; A=[] b=[] Aeq=[1 1 1 1]; beq=[100000]; VLB=[0;0;0;0]; VUB=[]; w=[100000]; [x,favl]=fmincon('100000/(x(1)*0.... -
相话迪巧:[答案] 可以把'10000/(x(1).......'这个写成如下形式: w=[100000,w(2),...,w(n)]; for i=1:length(w) y=@(x)w(i)/(x(1)*0.971/33.5.........; [x,favl]=fmincon(y,x0,A,b,Aeq,beq,VLB,VUB); end 或者:可以写一个函...

洪雅县13276633198: Matlab之fmincon函数 -
相话迪巧: 首先说明一点,fmincon不是拟合函数,而是极值函数.用于求解函数的最大值或最小值.其次,matlab的拟合函数,主要有线性回归(拟合)函数regress(),非线性回归(拟合)函数nlinfit(),非线性拟合函数lsqcurvefit()等.这些函数基本解决大部分拟合函数系数的拟合.针对你的问题,最好把问题写清楚,把原题贴出来看一看.

洪雅县13276633198: 求matlab中fmincon函数格式的中文解释?谢谢!!
相话迪巧: 优化工具箱提供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,...

洪雅县13276633198: matlab中fmincon函数如何求解全局最优解 -
相话迪巧: 由于fmincon函数的最优解依赖于x0的初值,所以要求解全局最优解,要根据具体问题具体来对待.只有在合理的x0的初值条件,才能得到全局最优解.如你有具体的极值问题,请贴出来这样好帮你解决.如有不便也可以私信交流.

洪雅县13276633198: matlab多元函数条件极值 fmincon -
相话迪巧: 求极值问题,首先,必须编写有函数表达式或目标函数的m文件;其次,还要编写有有约束函数(条件)和非约束函数(条件)的m文件;再次,编写求函数极值的m文件. 求解方法: 1、求f1(X)=(x(1)*3200+x(2)*4045+x(3)*5900-x(4)*5800的最优解; 2、求f2(X)=(x(1)+x(2)+x(3)-x(4)的最优解; 3、构造统一的目标函数f(X)=(f1(X)-fval1)/fval1)²+(f2(X)-fval2)/fval2)²,利用fmincon()求解. 4、得到f1(X)、f2(X)

洪雅县13276633198: 求这个线性规划问题的matlab函数
相话迪巧: 求这个线性规划问题,可以用matlab的最小值函数fmincon.fmincon极小值函数适应用于求约束非线性多变量函数的最小值.该问题求解方法如下:1、建立目标函数,即 z=80*x11+90*x12+75*x13+60*x21+85*x22+95*x23+92*x31+80*x32+110*x...

洪雅县13276633198: 求教matlab fmincon函数如何修改迭代次数 -
相话迪巧: 定义目标函数时,用function f=objfun(x,a) 调用fmincon时,事先定义好变量a,然后:.. = fmincon(@(x) objfun(x,a), ...)

洪雅县13276633198: Matlab的fmincon函数非线性等式不等式约束优.pdf -
相话迪巧: 您好,un为目标函数,它可用前面的方法定义;x0为初始值;A、b满足线性不等式约束 ,若没有不等式约束,则取A=[ ],b=[ ];Aeq、beq满足等式约束 ,若没有,则取Aeq=[ ],beq=[ ];lb、ub满足 ,若没有界,可设lb=[ ],ub=[ ];nonlcon的作用是通过...

洪雅县13276633198: 在matlab中fmincon函数 -
相话迪巧: 原因就是:because the size of the current step is less than the selected value of the step size tolerance and constraints are satisfied to within the selected value of the constraint tolerance.意思是:当前的步长已经小于所给步长公差,且约束已满足所给要求.

洪雅县13276633198: 谁能给我详细讲讲matlab中fmincon函数的应用 -
相话迪巧: 上面给出的是这个函数能够解决的问题的类型,线性约束或者非线性约束或者是边界约束 X = FMINCON(FUN,X0,A,B) starts at X0 and finds a minimum X ,TQsIhj

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网