Matlab/simulink中‘quadprog’函数代码生成解决方案

问题描述

本人使用matlab/simulink desktop real-time进行快速控制原型实验时,在simulink模型中将‘quadprog’函数应用于matlab function,但在编译生成c代码时出现如下错误:“The extrinsic function ‘quadprog’ is not available for standalone code generation. It must be eliminated for stand-alone code to be generated. It could not be eliminated because its outputs appear to influence the calling function. Fix this error by not using ‘quadprog’ or by ensuring that its outputs are unused.”。本文围绕该问题做简单的讨论。

解决思路

本人查阅了很多资料,也参考了C站上一些博主的解决方案,目前主流的解决方案是:
(1)使用codegen函数将‘quadprog’函数生成c代码
(2)使用mex函数将c代码mex成sfunction builder可以调用的代码
(3)使用sfunction builder调用(2)的代码
链接: https://blog.csdn.net/weixin_43321489/article/details/114683275?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164337528516780261918535%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164337528516780261918535&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-114683275.first_rank_v2_pc_rank_v29&utm_term=quadprog%E5%87%BD%E6%95%B0%E7%94%9F%E6%88%90&spm=1018.2226.3001.4187.
该方案可行但稍微繁琐,后经调研发现:自matlab2020a版本后,‘quadprog’函数已经支持代码生成。因此本文的方法是直接将‘quadprog’函数应用于matlab function中,并将需要注意的细节公开讨论。

实施细节

matlab function中的‘quadprog’函数代码如下:
Matlab/simulink中‘quadprog’函数代码生成解决方案_第1张图片
需要注意的细节:
(1)‘quadprog’函数在生成代码时,需要填满10个参数,其中H、f、x0和opts是非空参数,其余参数可以为空。且opts须设置为‘active-set’。
(2)不要在使用‘quadprog’函数前将其声明为外部函数,即无需加coder.extrinsic(‘quadprog’)语句,否则也会导致代码无法生成。
(3)安装MinGW64 Compiler ©编译器,并将其设置为matlab的c语言编译器。使用VS编译器有可能出现问题。
(4)当编译时出现知识维度无法确定的问题时,可修改model library中的变量维度为可变维度,并指定最大上限。

经过上述步骤,mpc的matlab代码已经可以成功的在simulink desktop real-time模式下运行。
Matlab/simulink中‘quadprog’函数代码生成解决方案_第2张图片
如有错误,欢迎补充指正。

参考文献:
[1]: https://ww2.mathworks.cn/support/search.html/answers/643960-code-generation-for-quadprog.html?fq[]=asset_type_name:answer&fq[]=category:coder/index&page=1
[2]: https://ww2.mathworks.cn/help/optim/release-notes.html
[3]: https://ww2.mathworks.cn/help/releases/R2020a/optim/ug/code-generation-for-quadprog-example.html

你可能感兴趣的:(matlab/simulink,matlab,simulink)