How to (properly) use the solution of a simulation in ModelingToolkit

Hi there.

I am starting to use the amazing ModellingToolkit, but I am afraid I am missing something important. So I apologize if my questions is silly.

Suppose I have a model consisting of two differential equations, two dependent variables x1 and x2 and an independent variable t. For example:

 @parameters t a1 a2;
 @variables x1(t) x2(t);

 D = Differential(t);
 D2 = Differential(t)^2;

 f(t) = 0.1*sin(2*pi*t);
 T1 = a1*f(t)
 T2 = a2*f(t)

 eq = [  D2(x1)    ~ T1 - D(x2),
            D2(x2)    ~ T2 - D(x1) ];
 sys = ODESystem(eq);
 sys = ode_order_lowering(sys);

 tspan = (0.0,10.0);
 p =[a1   =>  1.0,
     a2   =>  2.0 ];

 u0 =[ D(x1)    => 0.0, 
       x1       => 0.0, 
       D(x2)    => 0.0, 
       x2       => 0.0, 

 prob = ODEProblem(sys,u0,tspan,p,jac=true)
 sol = solve(prob);

I can plot the solution x1(t) even without knowing the position of this variable in pos(t), since there is a Plot recipe


My question is. Suppose I want to make some mathematical operations on x1(t). For example, evaluate the integral of (x1(t)/(a+b))^2 over the time span.

How can I “recover” x1(t) from sol and use it along with the symbolic operations? For example,

expr = substitute( (x1/(a+b))^2, p) 

will substitute the values of a and b, as expected. But if I try to use it with QuadGK, for example, it will give me an error, since x1(t) is not linked to sol(t).

I guess I am missing something important about it and I really want to understand how to properly use the solution provided by DifferentialEquations here.

Thank you.


1 Like

Thank you @ChrisRackauckas

Is it possible to interpolate, like in sol(t)? I would like to call something like sol(t)[x1] or sol[x1](t)..

Not yet. It will be sol(t;idxs=x1) when it’s ready.

1 Like


Thank you very much!