关于quadprog无法生成embed C代码

尝试过的方法:

1. coder.extrinsic('quadprog');      只能适用于能运行matlab的平台(调用matlab引擎),无法生成embed code

2. MEX   生成mex文件,要求生成mex时quadprog传进去确定的参数H,f,A,b,Aeq,beq,opt。  同样不适用于embed code,只在matlab2019b以后版本兼容。命令:

codegen -config:mex test_quadp

3. 将quadprog函数生成dll文件,直升使用用友操作系统的平台,不适用于embed code 。

4.  先用codegen  生成C/C++代码,在matlabfunction中用coder.ceval.电泳c函数????

经过老夫多次试验,终于呼之欲出:

- 关于quadprog生成embed C代码的办法如下:

使用条件:quadprog(H,f,A,b,Aeq,beq,x0)中的H,f,A,b,Aeq,beq,x0矩阵(或向量)的维度必须固定下来,知识维度固定,值可以实时改变。

方法:s-function builder  +  mex   +  matlab function + embedded Coder

1.  matlbb function:负责H,f,A,b,Aeq,beq,x0的每个采样时刻的赋值工作。

2.  embedded coder负责将H,f,A,b,Aeq,beq,x0矩阵(或向量)维度固定的quadprog函数(matlab系统函数)转换成C代码。

3.  mex负责将第2步中生成的C代码mex成 s-function builder 可以调用的代码。

4. s-function builder : 负责调用第三步生成的代码。

slx图:

matlab fuction 如下:

function [H,f,A,b] = fcn()
H = [2 -1; -1 2]; 
f = [-5; -2];
A = [1 1; -1 2; 2 1];
b = [2; 2; 3];

s-function builder 模块:

diagnostic Viewer 对生成embed code的报告:

### Starting build procedure for: myquadprog
### Generating code and artifacts to 'Model specific' folder structure
### Generating code into build folder: E:\matlabworkspace\matlab2020a\quadprog1\myquadprog_ert_rtw
### Invoking Target Language Compiler on myquadprog.rtw
### Using System Target File: E:\Program Files\MATLAB\R2020a\rtw\c\ert\ert.tlc
### Loading TLC function libraries
### Generating TLC interface API for custom data
### Initial pass through model to cache user defined code
### Caching model source code
    ### Writing header file myquadprog_types.h
    ### Writing source file myquadprog.c
    ### Writing header file myquadprog_private.h
    ### Writing header file myquadprog.h
.
    ### Writing header file rtwtypes.h
    ### Writing source file ert_main.c
### TLC code generation complete.
### Using toolchain: Microsoft Visual C++ 2015 v14.0 | nmake (64-bit Windows)
### Creating 'E:\matlabworkspace\matlab2020a\quadprog1\myquadprog_ert_rtw\myquadprog.mk' ...
### Building 'myquadprog': nmake  -f myquadprog.mk all
E:\matlabworkspace\matlab2020a\embedcode\2\codegen\lib\quadprog1\myquadprog1_wrapper.c(38): warning C4100: “y1”: 未引用的形参
E:\matlabworkspace\matlab2020a\embedcode\2\codegen\lib\quadprog1\myquadprog1_wrapper.c(37): warning C4100: “y0”: 未引用的形参
E:\matlabworkspace\matlab2020a\embedcode\2\codegen\lib\quadprog1\myquadprog1_wrapper.c(36): warning C4100: “b1”: 未引用的形参
E:\matlabworkspace\matlab2020a\embedcode\2\codegen\lib\quadprog1\myquadprog1_wrapper.c(35): warning C4100: “A1”: 未引用的形参
E:\matlabworkspace\matlab2020a\embedcode\2\codegen\lib\quadprog1\myquadprog1_wrapper.c(34): warning C4100: “f1”: 未引用的形参
E:\matlabworkspace\matlab2020a\embedcode\2\codegen\lib\quadprog1\myquadprog1_wrapper.c(33): warning C4100: “H1”: 未引用的形参
    cl  -c -nologo -GS -W4 -DWIN32 -D_MT -MT -D_CRT_SECURE_NO_WARNINGS  /Od /Oy- -DCLASSIC_INTERFACE=0 -DALLOCATIONFCN=0 -DTERMFCN=1 -DONESTEPFCN=1 -DMAT_FILE=0 -DMULTI_INSTANCE_CODE=0 -DINTEGER_CODE=0 -DMT=0  -DTID01EQ=0 -DMODEL=myquadprog -DNUMST=1 -DNCSTATES=0 -DHAVESTDIO -DMODEL_HAS_DYNAMICALLY_LOADED_SFCNS=0 @myquadprog_comp.rsp -Fo"ert_main.obj" E:\matlabworkspace\matlab2020a\quadprog1\myquadprog_ert_rtw\ert_main.c
ert_main.c
### Creating standalone executable "..\myquadprog.exe" ...
    link /RELEASE  /INCREMENTAL:NO /NOLOGO kernel32.lib ws2_32.lib mswsock.lib advapi32.lib -out:..\myquadprog.exe @myquadprog.rsp
### Created: ..\myquadprog.exe
### Successfully generated all binary outputs.
### Successful completion of build procedure for: myquadprog
### Simulink cache artifacts for 'myquadprog' were created in 'E:\matlabworkspace\matlab2020a\quadprog1\myquadprog.slxc'.
Build process completed successfully

设置:

注意问题:

s-funtion builder 的最后一步mex时,需要将所有C文件包含进去,不然会报错:“error LNK2019: 无法解析的外部符号”

如:

mex -output mpc_sfunc *.c    其中 mpc_sfunc是sfunction builder中的文件名

或老老实实:

mex myquadprog1.c myquadprog1_wrapper.c quadprog1.c addBoundToActiveSetMatrix_.c checkStoppingAndUpdateFval.c compute_deltax.c compute_lambda.c computeFirstOrderOpt.c computeFval.c computeFval_ReuseHx.c computeGrad_StoreHx.c computeQ_.c countsort.c deleteColMoveEnd.c driver.c factor.c factorQR.c factorQRE.c factoryConstruct.c feasibleratiotest.c feasibleX0ForWorkingSet.c fullColLDL2_.c iterate.c linearForm_.c main.c maxConstraintViolation.c myquadprog1.c myquadprog1_wrapper.c partialColLDL3_.c phaseone.c PresolveWorkingSet.c quadprog1.c quadprog1_data.c quadprog1_initialize.c quadprog1_terminate.c RemoveDependentIneq_.c rt_nonfinite.c rtGetInf.c rtGetNaN.c setProblemType.c solve.c squareQ_appendCol.c xgemm.c xgeqp3.c xnrm2.c xrotg.c xzgeqp3.c xzlarf.c xzlarfg.c


结果展示:

当参数为

H = [2 -1; -1 2]; 
f = [-1; -2];
A = [1 1; -1 2; 2 1];
b = [2; 2; 3];  

结果为: 1.167,0.833

参考文献:

matlab转C语言的操作步骤(1)——基本操作_野生猿-群号1025127672-CSDN博客_matlab转c语言

一文教你快速学会在matlab的simulink中调用C语言进行仿真_GREYWALL-CSDN博客_simulink调用c语言函数

假如你需要技术支持,请联系我!!!

### Matlab `quadprog` 函数在 Simulink 中的使用问题及其解决方案 当尝试通过 MATLAB/Simulink Desktop Real-Time 进行快速控制原型实验时,如果在 Simulink 模型中的 MATLAB Function 节点调用了 `quadprog` 函数,则可能会遇到代码生成失败的情况。具体表现为编译器提示 “extrinsic function ‘quadprog’ is not available for standalone code generation”,这是因为 `quadprog` 不支持独立于 MATLAB 的环境下的代码生成功能[^1]。 为了克服这一局限性并实现预期功能,可以考虑以下几种替代方法: #### 方法一:预计算优化解 对于某些应用场景而言,可以在仿真阶段预先求得最优解,并将其存储起来供实时控制系统读取。这种方法适用于那些目标函数和约束条件在整个运行期间保持不变的情形。然而,这并不总是可行的选择,特别是面对动态变化的目标或约束时。 #### 方法二:自定义 C/C++ 实现 另一种更为通用的方法是从头开始编写一个兼容 C 或者 C++ 的二次规划求解程序来代替内置的 `quadprog` 功能。此过程涉及移植现有的算法逻辑到选定的语言环境中去。例如,可以通过创建一个新的 M 文件(如名为 `C_QUADPROG.m`),其中封装了对原始 `quadprog` 接口的调用;随后利用第三方库或是自行开发相应的底层实现部分[^2]。 ```cpp // 示例性的 C++ 版本 QuadProg.cpp (仅示意性质) #include "QuadProg.h" void solveQP(double* H, double* g, double* A_cons, double* b_cons, double* lb, double* ub, int nVars, int nCons, double* result){ // 假设已经实现了具体的 QP 解算流程... } ``` 值得注意的是,在选择外部资源作为基础构建块之前应当仔细评估其稳定性和效率特性。开源项目如 [quadprog](https://gitcode.com/gh_mirrors/qu/quadprog)[^3] 可以为此类任务提供有价值的起点。 #### 方法三:采用其他工具箱内的相似组件 最后还可以探索 MathWorks 提供的不同产品线里是否有满足需求的功能模块存在——比如 Optimization Toolbox 下面可能有更适合当前项目的选项可供选用。不过这样做通常意味着要调整原有设计框架以适应新接口的要求。 综上所述,针对 `quadprog` 在 Simulink 编码过程中所引发的问题,推荐优先尝试第二种方案即转换成纯 C/C++ 形式的处理方式,这样不仅能够绕过原有限制还能更好地融入后续部署环节之中。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值