Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Represent Simulink Integrator block as Matlab Function

Asked by George Sterpu on 4 Dec 2012

Hi.

I need to implement the following behavior :

The Integrator and my_Integrator blocks have to be equivalent I/O.

How should I write the Matlab Function ?

Thanks for any reply.

George Sterpu

Products

5 Answers

Answer by Ryan G on 4 Dec 2012
Accepted answer

As this looks like a homework problem, I can't answer directly. However I will point you in the direction of persistent variables.

0 Comments

Ryan G
Answer by Azzi Abdelmalek on 7 Dec 2012
Edited by Azzi Abdelmalek on 8 Dec 2012

I don't know why do you need this, maybe if you explain exactly what you need, there is better way

9 Comments

George Sterpu on 8 Dec 2012

The solution it's already posted above. But since you and Guy disapprove this, I am waiting for the better solution.

I didn't need any clock input , please see http://www.mathworks.com/matlabcentral/answers/55705-represent-simulink-integrator-block-as-matlab-function#comment_115977

And even if I did, I guess it could have been fetched using the get_param command (never tried this though)

Azzi Abdelmalek on 8 Dec 2012

Ok, I see, If T is constant, you must then set, in model configuration parameters your fixed step time to T, and also your step block sample time to T. In this case you don't need a clock.

function y = fcn(u)
persistent   uold yold
T=0.01;
if isempty(uold)
 uold=0;yold=0;
end
y = u*T+yold-(u-uold)*T/2
yold=y;uold=u;
George Sterpu on 8 Dec 2012

Changing the sample time of the Step block to 0.01 removed the previous offset. Thanks

Azzi Abdelmalek
Answer by Guy Rouleau on 5 Dec 2012

This is not a good idea. The MATLAB function is not designed for this purpose.

0 Comments

Guy Rouleau
Answer by George Sterpu on 5 Dec 2012
Edited by George Sterpu on 6 Dec 2012

My main goal is to implement the differential equations of a physical system using a single Matlab Function. As the sums and gains were easy to represent, I couldn't find any alternative for the integration.

4 Comments

George Sterpu on 5 Dec 2012

Your idea would be to declare a persistent variable for the numeric integration ?

Y(s) = U(s) / s => y(z) = yOld + u(z)

so you declare persistent x = y to stand for yOld ?

Can I avoid this low-level arithmetic and call a predefined method instead (ode45 for example) ?

Ryan G on 5 Dec 2012

What you have written is close it would be more like:

y(z) = yOld+u(z)/SampleTime

You cannot use the ODE solver in the MATLAB function block.

George Sterpu on 7 Dec 2012

Any idea on how to get rid of this offset ?

http://i.imgur.com/cxr5H.png

Code looks like:

function y = fcn(u)
%#codegen
T=0.01;
persistent yOld;
persistent uOld;
if (isempty(yOld))
    yOld = 0;
end
if (isempty(uOld))
    uOld = 0;
end
y = yOld + (T/2)* (u + uOld);
%y=yOld + u*T;
yOld = y;
uOld = u;
George Sterpu
Answer by George Sterpu on 5 Dec 2012

Can anybody suggest a better way of implementing the numerical integration ? The code has to be written inside the Matlab Function Block though.

0 Comments

George Sterpu

Contact us