matlab ga函数的非线性约束和目标函数能不能不单独写M文件,把所有的代码都放到一个M文件可以吗?

作者&投稿:皇享 (若有异议请与网页底部的电邮联系)
关于matlab中ga函数和fmincon函数等在求解非线性规划问题中的异同~

GA是智能优化算法,求解出的结果不能保证是问题的最优解。
fmincon是嵌入最优化算法的NLP求解模块,如果问题是凸的,能够保证求出问题的最优解。
如果问题的规模较小(变量数和约束数目),GA显示不出求解速度,反倒是fmincon求解更快;大规模问题,GA在求解速度方面应该有优势。
“但是按照遗传算法来说,得到的应该是更优化一些的解呀”这是错误的理解,在不计较计算时间的情况下,GA的结果应该不如fmincon,原因前面解释了。
适用情况:GA适合求解问题复杂,希望计算时间少,且对解的精度要求不高情况;fmincon适合问题相对简单些,不计较计算时间,要求最优解情况。
希望对你有帮助。

使用匿名函数句柄就可以了
fmincon 需要的函数fun只有一个输入参数 fun(x)

而你的函数需要多一个能改变的变量 那么形式变成 myfun(p,x)
p就是你要传递的参数,x还是原来的输入

当然首先,你得写个m文件,假设为myfun.m,其内容大致如下
function [out]=myfun,(p,x)
...........
end
就是根据参数p和输入x,求的输出,当然名字可以自己取,然后就是主程序了

for p=p0:pn %参数p的取值
[x,fval]=fmincon(@(x) myfun(p,x),Bt0,[],[],[],[],lb,ub,@constr);

.......
end

其中关键就是@(x) myfun(p,x)
这会返回一个匿名的函数句柄,会使用当时的p值代入myfun
得到一个只有一个输入x的函数,这样就能把额外的参数传递给需要优化的函数
如果你的函数有等多的参数例如
myfun(a,b,c,x)
a=..
b=..
c=..
同样用@(x) myfun(a,b,c,x)把a,b,c参数的值传给要优化的函数

在以上的基础上,加几句,存储每次的参数p和对应的优化结果
然后画图就可以了

可以,将所有函数都写到一个文件中

不过这个文件也只能是函数文件


你可以为你的函数文件先写一个总函数,类似于C语言的main函数

然后其它的函数写在后面

写在同一个函数文件中的函数是可以互相调用的


例如:

function []=main()
   .....
   .....
   x = ga(@objfun,nvars,.....);
   .....
end

function output=objfun(x)
  .....
  .....
end

实际上,就是将原来要在命令行里运行的代码

或者要写在脚本m文件中要运行的代码写到main函数中

当然不一定要命名为main,可以改其它名字

只要将该函数放在最先的位置就可以了

函数m文件以第一个定义的函数作为主函数

而后面可以定义更多的函数,都可以被主函数调用



这样就是将优化函数、约束函数、和主函数写在同一个文件的办法

但是,由于主体运行的代码被被封装为一个函数

所以不能像脚本m文件那样调用base工作空间中变量

生成的变量也不保存在base工作空间中

当函数运行完毕,退出的时候,它运行时所产生的变量将会被清空

你可以将要输入和输出的变量以函数输入参数和输出参数的形式传递

实际上不及用脚本m文件方便

但是脚本m文件中是不能用function语句定义函数的




邵阳县14749519734: ga函数中非线性约束应该怎么设置 -
秦服美克: 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(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options,P1,P2,)[x,fval]=fmincon()[x,fval,exitflag]=fmincon()[x,fval,exitflag,output]=fmincon()

邵阳县14749519734: 用MATLAB编程怎样解决对非线性约束条件的编写 -
秦服美克: 用遗传算法可求GA(FITNESSFCN,NVARS,A,b,Aeq,beq,LB,UB,NONLCON)5 o* q) K2 Y/ Y% M! f可在MATLAB命令窗口中输入help ga 并按回车查看参数的含义~

邵阳县14749519734: MatLab求解整数规划 -
秦服美克: 各种主流的方法不让用,各种主流的程序也不让用,老师到底想要你们做什么?MATLAB的整数规划能力比较有限,早期主要就是0-1二值规划的bintprog,后来遗传算法ga可以求解不带等式约束的非线性规划,再后来还有个整数线性规划的函数intlinprog.第三方比较著名的有个个人作者编写的分支定界法函数bnb20.

邵阳县14749519734: matlab求解非线性不等式约束问题 -
秦服美克: function zhidao0429 f=@(x)x(1)+2*x(2); function [c,ceq] = nonlcon(x) c=x(1)+x(2)+3*x(2)*x(2)-15; ceq=[]; end Aeq=[]; Beq=[]; A=[]; B=[]; lb=[0,0]; ub=[]; x0=[1,2]; [x,fval] =fmincon(f,x0,Aeq,Beq,A,B,lb,ub,@nonlcon) end 保存为m文件运行即可x = 0 0fval = 0

邵阳县14749519734: 如何用matlab求解非线性约束优化问题 -
秦服美克: 此题的问题描如下图.由于本经验主要是谈非线性约束下的最优化问题,对于其他线性约束就不再考虑.然后启动matlab.新建一个函数文件,用来写目标函数.在编辑器窗口中写入我们要求的目标函数,并保存,注意使函数名与文件名相同.然后再新建一个函数文件,用来编写非线性约束条件.步骤及其注意事项同上.额外需要注意的是,需要将两个函数文件放在同一个文件夹中.最后,在命令行窗口处写入fmincon命令.此处需要注意的是,对于没有的线性约束条件的位置药用空矩阵代替,并且初始条件需要满足非线性约束条件(本例中写的是[1,2]).敲下键盘上的enter建,结果得出.可以发现exitflag=1是大于0的,所以结果正确.

邵阳县14749519734: 如何用Matlab解决带参数的非线性约束问题? -
秦服美克: 如何用Matlab解决带参数的非线性约束问题?从目前matlab软件的能力,还不具备解决这类问题.fmincon函数可以解决下列类型的问题:min f(x)=100*(x2-x1^2)^2 + (1-x1)^2 st. x1+2x2≤1; x1、x2>0 求解过程:fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(...

邵阳县14749519734: matlab遗传算法怎么输入参数 -
秦服美克: 遗传算法工具箱的函数GA基本调用格式如下:X = GA(FITNESSFCN,NVARS,A,b,Aeq,beq,lb,ub) 其中前两个参数分别是适应度函数和变量个数,第三、四个参数(A和b)即为线性不等式约束.你现在需要做的是,增加几个线性约束条件:x1 x2 x3 x4 不过,有个问题,遗传算法等优化工具对不等式约束的要求,都必须是闭集(带等号的不等式),也就是说,要的是类似下面这样的约束:x1 x2 x3 x4

邵阳县14749519734: 如何用Matlab求有限制条件的目标函数的最小值求解一个优化问题(目标函数非线性,约束函数线性)? -
秦服美克: x(1) = -4.0301e+016 x11 x(2) = -5.3913e+016 x12 x(3) = -4.4068e+016 x13 x(4)= -4.5546e+016 x14 x(5) = -4.5676e+016 x21 x(6)= -4.9899e+016 x22 x(7) = -4.7096e+016 x23 x(8) = -5.1703e+016 x24 x(9) = -4.1011e+016 x31 x(10)= -5.6188e+016 ...

邵阳县14749519734: matlab非线性约束条件function [c,ce] = nonlcon1(x) -
秦服美克: 有以下几种方式:1、用全局变量,不建议; 2、传递附加参数:把非线性约束条件定义成函数 function [c,ce] = nonlcon1(x,a)并且调用fmincon的时候用:fmincon(FUN,X,A,B,Aeq,Beq,LB,UB,@nonlcon1,options,a)其中,附加参数a在options后...

邵阳县14749519734: 请教关于用Matlab在非线性约束条件下的最优解 -
秦服美克: 这种简单的问题,不需要用遗传算法 M文件:function f = fun1(x) f = -cos(x(1))-cos(x(2))-cos(x(3))-cos(x(4)); function [c, ceq] = fun2(x) c = []; ceq = [cos(5*x(1))+cos(5*x(2))+cos(5*x(3))+cos(5*x(4)); cos(7*x(1))+cos(7*x(2))+cos(7*x(3))+cos(7*x(4)); cos...

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