問題描述
在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)
輸出:
以上
參考
如何在Simulink Matlab函數中使用符號變量和函數 Syms..