主要内容

优化基础的代码生成

生成代码Fmincon

此示例显示了如何生成代码Fmincon优化求解器。代码生成需要一个MATLAB®CODER™执照。有关代码生成要求的详细信息,请参见Fmincon背景中的代码生成

该示例使用以下简单的目标函数。要在您自己的测试中使用此目标函数,请将代码复制到名称的文件Rosenbrockwithgrad.m。将文件保存在MATLAB路径上。

功能[f,g] = rosenbrockwithgrad(x)%计算目标ff = 100*(x(2)-x(1)^2)^2 +(1 -x(1))^2;如果nargout> 1需要梯度%g = [-400*(x(2)-x(1)^2)*x(1)-2*(1- x(1));200*(x(2)-x(1)^2)];结尾

使用Rosenbrockwithgrad目标函数,创建一个名称的文件test_rosen.m包含此代码:

功能[x,fval] = test_rosen opts = optimoptions('fmincon',,,,'算法',,,,'SQP');[x fval] = fmincon(@RosenBrockwithGrad,[ -  1,1],[],[],[],[],[],[ -  3,-3],[3,3],[3,3],[],[],opts)

生成代码test_rosen文件。

代码根-Config:Mextest_rosen

一段时间后,代码根创建一个名称的MEX文件test_rosen_mex.mexw64(根据您的系统,文件扩展名将有所不同)。您可以通过输入来运行生成的C代码test_rosen_mex。结果如下或类似:

x = 1.0000 1.0000 fval = 1.3346e-11 ans = 1.0000 1.0000

修改效率示例

遵循一些建议实时应用程序的优化代码生成,设置生成代码的配置以减少检查并使用静态内存分配。

cfg = coder.config('Mex');cfg.integritychecks = false;cfg.saturateonintegeroverflow = false;cfg.dynamicmemoryallocation ='离开';

收集问题的界限[-3,3][-2,2]。另外,设置比默认值宽松的最优性公差1E-6

功能[x,fval] = test_rosen2 opts = optimoptions('fmincon',,,,'算法',,,,'SQP',,,,...“最佳耐受性”,1E-5);[x fval eflag output] = fmincon(@RosenBrockWithGrad,[ -  1,1],[],[],[],[],[],[],,,,,...[-2,-2],[2,2],[],opts)

生成代码test_rosen2文件。

代码根-configCFGtest_rosen2

运行结果代码。

test_rosen2_mex
x = 1.0000 1.0000 fval = 2.0057e-11 eflag = 2输出=带字段的结构:迭代:40 funccount:155算法:'sqp'约束:0步骤:5.9344e-08 lssteplength:1 ans = 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000

该解决方案几乎与以前的解决方案一样好,FVAL输出2e-11与以前相比1E-11

尝试将允许迭代的数量限制为先前计算中采用的迭代次数的一半。

功能[x,fval] = test_rosen3 options = optimoptions('fmincon',,,,'算法',,,,'SQP',,,,...“最大”,20);[x fval eflag output] = fmincon(@RosenBrockWithGrad,[ -  1,1],[],[],[],[],[],[],,,,,...[-2,-2],[2,2],[],选项)

test_rosen3在Matlab。

test_rosen3
x = 0.2852 0.0716 fval = 0.5204 eflag = 0输出=带有字段的结构:迭代:20 funccount:91算法:'sqp'消息:'solver tregaturaly stoped streated.ichfmincon停止了。= 2.000000E+01.Chorm'约束:0步骤:0.0225 lssteplength:1 FirstOrderOpt:1.9504 ANS = 0.2852 0.0716

由于这种严重的迭代限制,Fmincon没有达到好的解决方案。准确性和速度之间的权衡很难管理。

为了节省功能评估并可能提高准确性,请通过设置示例的内置衍生物指定目标gradient选项真的

功能[x,fval] = test_rosen44 options = optimoptions('fmincon',,,,'算法',,,,'SQP',,,,...“指定目标gradient”,真的);[x fval eflag output] = fmincon(@RosenBrockWithGrad,[ -  1,1],[],[],[],[],[],[],,,,,...[-2,-2],[2,2],[],选项)

生成代码test_rosen4使用与test_rosen2

代码根-configCFGtest_rosen4

运行结果代码。

test_rosen4_mex
x = 1.0000 1.0000 fval = 3.3610e-20 eflag = 2输出=带字段的结构:迭代:40 funccount:113算法:'sqp'限制:0步骤:0步骤:9.6356e-08 lssteplength:1 ans = 1.0000 1.0000 1.0000 1.0000 1.0000。

相比test_rosen2,迭代次数在40时相同,但功能评估的数量较低。113代替155。结果具有更好的(较低)的目标函数值3E-20相比2e-11

也可以看看

|(MATLAB编码器)|

相关话题