主要内容

的静态内存分配fmincon代码生成

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

该问题是一个简单的非线性极小化问题,同时具有非线性约束函数和线性约束。线性约束矩阵的大小在每次迭代中都有所变化,这导致每次迭代的内存需求增加。的示例展示了如何使用coder.varsize命令为静态内存分配设置适当的可变大小。

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

函数nlp_for_loop%驱动程序的一个示例fmincon用例。添加约束会增加%最小值,并使用更多的内存。maxIneq = 4;%线性不等式约束的个数nVar = 5;问题变量x的百分比A = 0 (0,nVar);B = 0 (0,1);静态内存支持需要下一步。金宝app因为你连起来了%的约束,则需要限制%约束矩阵。%编码器。varsize('var name', [maxRows, maxCols], [canRowsChange, canColsChange]);coder.varsize (“一个”[maxIneq,据nVar],[真,假]);coder.varsize (“b”[maxIneq, 1],[真,假]);Aeq = [1,0,0,0,1];Beq = 0;Lb = [];Ub = [];%起始点X0 = [2;-3;0; -2];选项= optimoptions(“fmincon”“算法”“sqp”“显示”“没有”);idx = 1:maxIneq在每次迭代中添加一个新的线性不等式约束。A = [A;]circshift ([1 1 0, 0, 0), idx-1)];B = [B;]1);[x,fval,exitflag] = fmincon(@rosenbrock_nd,x0,A,b,Aeq,beq,...磅,乌兰巴托,@circleconstr选项);将初始点设置为发现点X0 = x;%打印fval,确保数据类型与%对应的fprintf格式说明符流('%i不等式约束;fval: % f;Exitflag: %i \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)半径= 2;Ceq = [];C = sum(x.^2) - radius^2;结束

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

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

nlp_for_loop.m文件。

codegen配置cfgnlp_for_loop

运行生成的MEX文件。

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

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

相关的话题