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

Learn moreOpportunities for recent engineering grads.

Apply TodayTo resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

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.

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.

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

Show 6 older 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

Answer by Guy Rouleau on 5 Dec 2012

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

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.

Show 1 older comment

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 ?

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;

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.

## 2 Comments

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/55705#comment_115365

What is your goal?

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/55705#comment_115533

Please see http://www.mathworks.com/matlabcentral/answers/55705#answer_67551