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

# 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 ?

Azzi Abdelmalek on 4 Dec 2012

## Products

Answer by Ryan G on 4 Dec 2012

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

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.

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.

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;
```
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.