粉刺
此示例显示如何为此生成代码粉刺
优化求解器。代码需要一个马铃薯®编码器™执照。有关代码生成要求的详细信息,请参阅代码生成在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('粉丝'那'算法'那'SQP');[x fval] = fmincon(@rosenbrockwithgrad,[ - 1,1],[],[],[],[],[ - 3,-3],[3,3],[],选择)
为此生成代码test_rosen.
文件。
Codegen.-config:mex.test_rosen.
一段时间后,Codegen.
创建一个名为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('粉丝'那'算法'那'SQP'那......'OptimalalcaltalTolerance',1E-5);[x fval eflag输出] = fmincon(@rosenbrockwithgrad,[ - 1,1],[],[],[],[],......[-2,-2],[2,2],[],选择)
为此生成代码test_rosen2.
文件。
Codegen.-Config.CFG.test_rosen2.
运行生成的代码。
test_rosen2_mex.
x = 1.0000 1.0000 FVAL = 2.0057E-11 EFLAG = 2输出=带有字段的结构:迭代:40 Funccount:155算法:'SQP'ConstRViroation:0步骤:5.9344E-08 LSSTeplenth:1 ANS = 1.0000 1.0000
这个解决方案几乎与前一个解决方案一样好fval.
输出周围2E-11.
与以前相比1E-11
。
尝试将允许的迭代的数量限制在以前计算中拍摄的一半。
功能[x,fval] = test_rosen3选项= Optimoptions('粉丝'那'算法'那'SQP'那......'maxtations'20);[x fval eflag输出] = 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过早停止。↵↵fmincon停止,因为它超出了迭代限制= 2.000000E +01.↵↵'CONSTRVIOLINATION:0步骤:0.0225 LSSTEPLENTE:1:1.9504 ANS = 0.2852 0.0716
凭借这种严重的迭代限制,粉刺
没有达成良好的解决方案。精度和速度之间的权衡可能很难管理。
为了节省函数评估并可能提高准确性,通过设置示例的内置衍生工具specifyobjectivegradient.
选择真的
。
功能[x,fval] = test_rosen4选项= Optimoptions('粉丝'那'算法'那'SQP'那......'specifyobjectivegrient',真的);[x fval eflag输出] = fmincon(@rosenbrockwithgrad,[ - 1,1],[],[],[],[],......[-2,-2],[2,2],[],选项)
生成代码test_rosen4.
使用与相同的配置test_rosen2.
。
Codegen.-Config.CFG.test_rosen4.
运行生成的代码。
test_rosen4_mex.
X = 1.0000 1.0000 FVAL = 3.3610E-20 EFLAG = 2输出=带有字段的结构:迭代:40 Funccount:113算法:'SQP'ConstRViolation:0步骤:9.6356E-08 Lssteplentth:1 ANS = 1.0000 1.0000
相比test_rosen2.
,迭代的数量在40处相同,但功能评估的数量较低113.
代替155.
。结果具有更好的(较低)目标函数值3E-20.
相比2E-11.
。