主要内容

用于优化基础的代码生成

生成代码粉刺

此示例显示如何为此生成代码粉刺优化求解器。代码需要一个马铃薯®编码器™执照。有关代码生成要求的详细信息,请参阅代码生成在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.

也可以看看

||(MATLAB编码器)

相关话题