How can I implement the following blocks and code in function block ?
Show older comments
I would use the following integral equation as function block in my simulation. I know I can do it as what I attached but I need a way to implement it by code inside function block.

Answers (1)
Mehmed Saad
on 8 Apr 2020
Edited: Mehmed Saad
on 8 Apr 2020
This is an example of matlab given in integral help
% Without For loop
fun = @(x,c) 1./(x.^3-2*x-c);
q_f = integral(@(x)fun(x,5),0,2);
q_f = -0.4605
Now i just change the time of integration and sum them
% With For loop
t = 0:0.1:2;
q =0;
for i =2:length(t)
q =q+ integral(@(x)fun(x,5),t(i-1),t(i));
end
q = -0.4605
6 Comments
Willim
on 9 Apr 2020
Mehmed Saad
on 9 Apr 2020
Edited: Mehmed Saad
on 9 Apr 2020
Yes, so what you have to do is divide the integral interval in small intervals
suppose your time starts from 0 and ends at 10s with 1s second step (so there will ber 11 steps of time)
0 1 2 3 4 5 6 7 8 9 10
Iteration 1:
y=integral(your_function,0,1);
Iteration 2:
y = integral(your_function,1,2);
Iteration 3:
y = integral(your_function,2,3);
.
.
.
Iteration 10:
y = integral(your_function,9,10);
So you have 10 different outputs
Similarly you can do it for 3000 time steps, what you need is current time step and previous time step (feedback).
I am not much familiar with simulink, if it doesnot work, try setting the xmin =0 for every iteration
(integral(fun,xmin,xmax))
Willim
on 9 Apr 2020
Walter Roberson
on 9 Apr 2020
Is this for continuous or discrete work?
What is the expected output for these three cases:
- current time is "close enough" to the end of one of the defined intervals
- previous time and current time are both in the middle of one of the defined intervals
- previous time was in the previous defined interval compared to the current time
Willim
on 10 Apr 2020
Walter Roberson
on 10 Apr 2020
With variable-step solvers, the block will be called at irregular intervals that might not match the interval that you want solutions at. The variable-step solvers can also go backwards in time (I encountered a case in which this really happened within the last few days.) ode45() invokes the function 6 times per step, using slightly different times and slightly different boundary conditions in order to make projections and check the error measurement.
In order to get results for a fixed time interval, because the function could be called for times spanning multiple intervals, you would have to emit a variable number of results -- and you would have to be prepared to have the values "revoked" if ode45 decided that the step was a failure. ode45 does not always go backwards in time when it decides that a step is a failure.
What is the reason that you are trying to replace those blocks with a MATLAB Function Block ? Are you trying to move to a discrete time system, using MATLAB Function Block to replace the ode45() work over a known interval?
Categories
Find more on Programmatic Model Editing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!