主要内容

用于优化基础的代码生成

生成的代码fmincon

这个示例展示了如何为fmincon优化求解。代码生成需要MATLAB®编码器™许可证。有关代码生成需求的详细信息,请参见代码生成在fmincon背景

这个例子使用了以下简单的目标函数。要在您自己的测试中使用这个目标函数,请将代码复制到一个名为rosenbrockwithgrad.m.将文件保存在MATLAB路径上。

函数(f, g) = rosenbrockwithgrad (x)计算目标fF = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;如果nargout > 1%梯度要求[-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,[],选择)

test_rosen文件。

codegen配置:墨西哥人test_rosen

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

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

修改效率举例

下面是一些建议实时应用程序的优化代码生成,将生成代码的配置设置为更少的检查并使用静态内存分配。

cfg = coder.config (墨西哥人的);cfg。IntegrityChecks = false;cfg。SaturateOnIntegerOverflow = false;cfg。DynamicMemoryAllocation =“关闭”

从…收紧问题的界限(3、3)(2, 2).另外,设置一个比默认值更宽松的优化容忍度1 e-6

函数[x,fval] = test_rosen2 opts = optimoptions(“fmincon”“算法”“sqp”...“OptimalityTolerance”1 e-5);[x fval eflag输出]= fmincon (@rosenbrockwithgrad, [1,1 ],[],[],[],[],...(2, 2),(2, 2)[],选择)

test_rosen2文件。

codegen配置cfgtest_rosen2

运行生成的代码。

test_rosen2_mex
x = 1.0000 1.0000 fval = 2.0057e-11 eflag = 2 output = struct with fields: iterations: 40 funcCount: 155 algorithm: 'sqp' construct: 0 stepsize: 5.9344e-08 lssteplength: 1 ans = 1.0000 1.0000

这个解决方案几乎和之前的解决方案一样好fval输出在2 e-11与以前相比1 e-11

尝试将允许的迭代次数限制为前面计算的一半。

函数[x,fval] = test_rosen3 options = optimoptions(“fmincon”“算法”“sqp”...“MaxIterations”, 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 output = struct with fields: iterations: 20 funcCount: 91 algorithm: 'sqp' message: '↵Solver stopped过早。↵↵fmincon停止,因为它超过了迭代限制,↵选项。MaxIterations = 2.000000 e + 01。↵↵' construct: 0 stepsize: 0.0225 lssteplength: 1 firstderopt: 1.9504 ans = 0.2852 0.0716

在这种严格的迭代限制下,fmincon没有达成一个好的解决方案。精确度和速度之间的权衡很难处理。

为了节省函数的求值并可能提高精度,可以通过设置SpecifyObjectiveGradient选项真正的

函数[x,fval] = test_rosen4 options = optimoptions(“fmincon”“算法”“sqp”...“SpecifyObjectiveGradient”,真正的);[x fval eflag输出]= fmincon (@rosenbrockwithgrad, [1,1 ],[],[],[],[],...(2, 2),(2, 2)[]选项)

生成的代码test_rosen4使用与test_rosen2

codegen配置cfgtest_rosen4

运行生成的代码。

test_rosen4_mex
x = 1.0000 1.0000 fval = 3.3610e-20 eflag = 2 output = struct with fields: iterations: 40 funcCount: 113 algorithm: 'sqp' construct: 0 stepsize: 9.6356e-08 lssteplength: 1 ans = 1.0000 1.0000

相比test_rosen2,迭代次数与40次相同,但函数求值次数较低113而不是155.结果具有较好的(较低的)目标函数值3 e-20相比2 e-11

另请参阅

||(MATLAB编码器)

相关的话题