2017-02-16 5 views
3

Я хочу выполнить интеграл от expm(A*s) между a и b+tau, где tau - изменяющаяся во времени задержка.Как использовать сим в функциональном блоке Simulink Matlab

Я создал в Simulink функционального блока Matlab с tau в качестве входного сигнала, как это:

function y = compute_int(u, tau) 
syms s 
gamma=double(int(expm(A*s),s,a,b+tau)); 
B = [gamma; 1] 
y = B*u; 

с A, a и b определяется прежде. Однако есть проблема: функция syms не поддерживается simulink.

Любые идеи, как обращаться с интегралом? Я пробовал с

coder.extrinsic('syms'); 

но он не работает.

спасибо за любые предложения!

+0

Вы можете попытаться интегрировать его численно с помощью 'integral' –

ответ

1

Самый полезный способ:

Мы не можем использовать символьные переменные и анонимные функции в Simulink. Но мы можем создать еще один файл .m для выхода функции и загрузите его в Matlab функциональный блок в Simulink:

myIntegral.m

function out = myIntegral(in) 
    A = [1 2 3; 4 5 6; 7 8 9]; 
    myfun = @(s) expm(A.*s); 
    out = integral(myfun,0,in,'ArrayValued',true); 
    end 

Matlab код функционального блока:

function y = fcn(u) 
%#codegen 
coder.extrinsic('myIntegral'); 
y = zeros(3); 
y = myIntegral(u); 

Он работает: enter image description here

PS Кстати - я попытался

syms s1 

и нет никакой ошибки здесь, но Simulink до сих пор не может использовать эту переменную s1:

Неопределенная функция или переменная «s1».

+0

Спасибо, он работает с использованием интегральных! – Betelgeuse

+0

Я только что нашел, что другим способом вычисления интеграла может быть блок «интерпретируемый матлаб fnc» – Betelgeuse

+0

А также есть [непрерывный интеграл] (https://www.mathworks.com/help/simulink/slref/integrator. html) и [дискретный интеграл] (https://www.mathworks.com/help/simulink/slref/discretetimeintegrator.html). Они тоже могут быть полезны! –

Смежные вопросы