# Tailoring ode output efficiently for a large system

1 view (last 30 days)
L Wright on 9 Nov 2018
Answered: L Wright on 9 Nov 2018
I have a large system of odes (1000s of variables). I wish to output the full solution at a small number of times (5 or so), and a weighted average of part of the solution at every time step. I have an OutputFcn for the weighted average, and I can split the time interval such that the times at which I want the full solution are the end points of a series of sub-intervals.
However, I can't get Matlab to give me the full solution only at the ends of each interval and the OutputFcn value at all solution times. It either gives me the full solution throughout the interval or the OutputFcn value only at the times I specify.

#### 1 Comment

Jan on 9 Nov 2018
Please post the relevant part of the code. Then it is much easier to post a suggestion for modifications.

L Wright on 9 Nov 2018
OK, this is a hugely simplified example on a much much smaller and simpler system, and this is not the same ODE at all, but the question is generic. My code is too big to post usefully. What I have as a test is given below.
If I set tspan such that it's just the end points, it gives me y(1) and y(2) and yout at every successfully calculated time step within the interval tspan; if I put any intermediate points into tspan, it gives me y(1), y(2), and yout at only those points. What I want is y(1) and y(2) at the ends only, and yout at all intermediately calculated points.
Code:
function [t,y, yout]=opctest
tspan = [0, 10*pi]; y0=[0,1]; opts=odeset('OutputFcn',@opc); county = 0; [t,y] = ode45(@myfun,tspan,y0,opts);
function f = myfun(t,y)
f(1,1) = cos(t) + y(2);
f(2,1) = sin(t) - y(1);
end
function status = opc(t,y,flag)
if(strcmp(flag,'init'))
status=0;
yout(county+1) = y0(1);
county=county+1;
else
if (strcmp(flag,'done'))
status=0;
else
status = 0;
ny = size(y,2);
yout(county+1:county+ny) = y(1, 1:ny);
county = county+ny;
end
end
end
end