# How to load intermediate variable into workspace while using ode45 ?

2 views (last 30 days)
Pritesh Patel on 17 Jun 2022
Edited: Torsten on 24 Jun 2022
function dx=system (t,x)
dx=-x(1);
a=1;
end
%%
function main
tspan=1:100;
x0=0;
[t,x]=ode45(@system, tspan,x0)
end
how to load variable "a" into the workspace ?

Stephen23 on 17 Jun 2022
Edited: Stephen23 on 17 Jun 2022
Here is the neat, easy, robust approach which returns exactly the a values at the exact t and x output values:
tspan = 1:100;
x0 = 0;
[t,x] = ode45(@system, tspan,x0);
[~,a] = arrayfun(@system,t,x)
a = 100×1
1 1 1 1 1 1 1 1 1 1
function [dx,a] = system(t,x)
dx = -x(1);
a = 1;
end
Note that trying to obtain the value generated during the ODE-solver routine is much more complex (although this is often what beginners think of, it is practically unsolvable because you have no easy way to distinguish between points which are kept vs. discarded, e.g. when the solver goes backwards a few steps. Not every call of the objective function corresponds to output values, and you have no way to know which... consider the implications of that).
##### 2 CommentsShowHide 1 older comment
Stephen23 on 23 Jun 2022
Ah, so in your actual problem x0 is not scalar.
tspan = 1:200;
x0 = zeros(38,1);
[t,x] = ode45(@system, tspan,x0);
[~,ss] = cellfun(@system,num2cell(t),num2cell(x,2),'uni',0);
ss = [ss{:}];
plot(t,ss) function [dx,ss]=system(t,x)
dx=-x;
ts=40;
ssActive = [1,2,3,4,1,3,4,2,4,3,3,4,3,3,1,2,3,4,1,3,4,2];
k=floor(t/ts);
ss = ssActive(k+1);
end

Torsten on 23 Jun 2022
tspan = 1:200;
x0 = zeros(38,1);
[t,x] = ode45(@system, tspan,x0);
ts=40;
ssActive = [1,2,3,4,1,3,4,2,4,3,3,4,3,3,1,2,3,4,1,3,4,2];
k=floor(t/ts);
ss = ssActive(k+1);
plot(t,ss) function [dx]=system(t,x)
dx=-x;
end
Torsten on 24 Jun 2022
Edited: Torsten on 24 Jun 2022
Do you need these 4 lines of code for the solution of your differential equation or only for postprocessing and plotting ?
If you need these 4 lines of code for the solution of your differential equation, please show how. In your code above, they are not used to calculate "dx".
If you need them for plotting, do it after ode45 has finished as I showed in the code I posted.