主要内容

静态内存分配fmincon代码生成

这个例子展示了如何在代码生成中使用静态内存分配,即使在计算过程中一些矩阵的大小发生了变化。

问题是一个既有非线性约束函数又有线性约束的简单非线性极小化问题。线性约束矩阵的大小在每次迭代时都会发生变化,从而导致每次迭代时内存需求的增加。这个例子展示了如何使用coder.varsize命令为静态内存分配设置适当的变量大小。

nlp_for_loop.m文件中包含目标函数、线性约束函数和非线性约束函数。复制以下代码在MATLAB中创建此文件®路径。

函数nlp_for_loop%驱动程序的一个示例fmincon用例。添加约束会增加%最小,使用更多内存。maxIneq = 4;%线性不等式约束个数据nVar = 5;%问题变量个数一个= 0(0,据nVar);b = 0 (0, 1);%下一步需要静态内存支持。万博1manbetx因为你连接在"for"循环中,您需要限制%约束矩阵。%编码器。varsize('var name', [maxRows, maxCols], [canRowsChange, canColsChange]);coder.varsize (“一个”[maxIneq,据nVar],[真,假]);coder.varsize (“b”[maxIneq, 1],[真,假]);Aeq = [1, 0, 0, 0, 1];说真的= 0;磅= [];乌兰巴托= [];%初始点x0 = [2, 3, 0, 0; 2);选择= optimoptions (“fmincon”“算法”“sqp”“显示”“没有”);idx = 1: maxIneq%在每次迭代中添加一个新的线性不等式约束一个=[一个;circshift ([1 1 0, 0, 0), idx-1)];b = [b;1);[x, fval exitflag] = fmincon (Aeq @rosenbrock_nd x0, A, b,说真的,...磅,乌兰巴托,@circleconstr选项);设置初始点为发现点x0 = x;% Print fval,确保数据类型与%对应的fprintf格式说明符流(' %我不等式约束;fval: % f;Exitflag: % \ n”...int32(元素个数(b))、fval int32 (exitflag));结束结束函数fval fval = rosenbrock_nd (x) = 100 *总和((x(2:结束)- x (1: end-1)。^ 2)。^ 2 + (1 - x (1: end-1)) ^ 2);结束函数[c,ceq] = circleconstr(x) radius = 2;测查= [];C = sum(x.^2) - radius^2;结束

要使用静态内存分配从该文件生成代码,请按如下方式设置编码器配置。

cfg = coder.config (墨西哥人的);cfg。DynamicMemoryAllocation =“关闭”没有动态内存分配cfg。SaturateOnIntegerOverflow = false;%没有MATLAB整数饱和检查cfg。IntegrityChecks = false;没有检查数组中的越界访问

nlp_for_loop.m文件。

codegen配置cfgnlp_for_loop

运行生成的MEX文件。

nlp_for_loop_mex
1不等式约束;fval: 542.688894;Exitflag: 1 2不等式约束;fval: 793.225322;Exitflag: 3不等式约束;fval: 1072.945843;Exitflag: 4不等式约束;fval: 1400.000000;Exitflag: 1

函数值在每次迭代时都会增加,因为问题有更多的约束。

相关的话题