问题描述
在Simulink中的User defined function使用syms函数,报错simulink无法使用外部函数。
具体来说:
我想在Predefined function定义如下符号函数作为输入信号,在后续模块传入函数参数赋值,以实现一次定义多次使用,并避免求导时手动修改函数形式:
syms t B A T Phi;
f = A*sin(2*pi/T*t + Phi)+B;
ps:赋值,符号变量到数值变量的计算过程可使用:
tmp = subs(f,{A,B,T,Phi,t},{A_,B_,T_,Phi_,t_});
value = double(tmp);
结果Sinmulink报错:独立代码生成不支持函数'syms,代码生成器不支持等..Function 'syms' not supported for code generation.
解决方案
思路:不在Simulink中显式使用syms定义变量,将该步骤放到Matlab脚本函数中运行。
举例:同上文例程,将该函数(Predefined function)写在Simulink外部,即Matlab工作目录;然后,在Simulink内部使用coder对象传入参数调用该函数。函数在外部的文件为symsSine.m。
function y = fcn(~)
%将值传入外部函数,返回值供内部使用
coder.extrinsic('symsSine');
A_ = 6;
B_ = 5;
T_ = 10*pi;
Phi_ = 2*pi;
t_ = pi;
y=zeros(1);
[f,u] = symsSine(A_,B_,T_,Phi_,t_)
y = u;
结果:
实现了期望功能,且syms定义的符号变量 f 并未在Simulink中报错。
进一步,可以实现在Simulink中继续使用返回的符号变量/函数..
如进行diff求导:
f1 = diff(f)
输出:
以上