In the tutorial How to solve an ordinary differential equation (ODE) in Scilab we can see how a first order ordinary differential equation is solved (numerically) in Scilab. In this tutorial we are going to solve a second order ordinary differential equation using the embedded Scilab function ode()
.
As example we are going to use a nonlinear second order ordinary differential equation:
\[\frac{d^2 y}{dt^2} = \frac{1}{t+1} + sint(t)\sqrt{t}\]with the initial conditions:
\[ \begin{equation*} \begin{split}y(0) &= 0\\
\frac{dy}{dt}(0) &= -2
\end{split} \end{equation*} \]
The first step is to write the second order differential equation as a system of two first order differential equations:
\[ \begin{equation*} \begin{split}\frac{dy}{dt} &= z\\
\frac{dz}{dt} &= \frac{1}{t+1} + sint(t)\sqrt{t}
\end{split} \end{equation*} \]
This way we have set our differential equation in the form:
\[\frac{dx}{dt}=f(t,x)\]where both dx and x are matrices of size 2 x 1
.
x &= \left [ z; \frac{1}{t+1} + sint(t)\sqrt{t} \right ]\\
dx &= \left [ \frac{dy}{dt}; \frac{dz}{dt} \right ]
\end{split} \end{equation*} \]
To solve this differential equation in Scilab, first we need to define our differential equation as a separate function. Scilab allows to define a custom function is an *.sce
file, together with other instructions. For this example, all of the Scilab instruction will need to be included in the same *.sce
file.
Step 1. Define the differential equation as a custom function
function dx = f(t, x) dx(1) = x(2); dx(2) = 1/(t+1) + sin(t)*sqrt(t); endfunction
Step 2. Define the integration time t, initial time t0 and initial values
t = 0:0.01:5*%pi; t0 = min(t); y0 = [0; -2];
Step 3. Call the ode()
function with the above parameters
y = ode(y0, t0, t, f);
Step 4. Plot the result. Notice that the numerical solution y
contains the second and first integration results, y and y’.
plot(t,y(1,:),'LineWidth',2) plot(t,y(2,:),'r','LineWidth',2) xgrid(); xlabel('$t \quad [s]$','FontSize',3) ylabel('$f(t,x)$','FontSize',3) title(['Integration of ' '$\frac{d^2 x}{dt^2} = \frac{1}{t+1} + sint(t)\sqrt{t}$'],'FontSize',3) legend(['$\Large{x}$' '$\Large{dx/dt}$'],2)
By running all of the above Scilab instruction in an script file (*.sce
), we get the following graphical window:
To check that the solution of our integration is correct, we are going the model the equation in Xcos and run the simulation for 15.71
seconds (5π).
The Xcos block diagram model of the second order ordinary differential equation is integrated using the Runge-Kutta 4(5) numerical solver.
After running the simulation, Xcos will output the following graphical window (the grid has been added afterwards):
As you can see, both methods give the same results. This is a confirmation that the system of first order ODE were derived correctly and the equations were correctly integrated.
For any questions, observations and queries regarding this article, use the comment form below.
Don’t forget to Like, Share and Subscribe!
Nick
Hello!
How can I solve a fourth order ordinary differential equation? Please give me example.
Wasantha
How may i post a question this site for scilab solve
Shriram Patil
Let x1=y and x2=y’
Then x1’=y’ and x2’=y”
x1’=y’=x2
x2’=y”=1/(t+1) + sin(t)*sqrt(t)
Therefore
dx1=x2
dx2=1/(t+1) + sin(t)*sqrt(t)
NP
I think it’s a typo in first of the last set of equations.
The matrix [z, 1/(t+1)+sin(t)*sqrt(t)] was supposed to be the derivative matrix f(x). The matrix x is [y,z].
Hynek Pokorný
Hello,
I do not understand the function deffinition. Why do you put down dx(1) = x(2)? The corresponding value to “dx(1)” is “z”, which is on the first place in the vector, therefore I would expect “x(1)”.
Can somebody explain me? Thanks, Hynek