Source code for assimulo.examples.dasp3_basic
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (C) 2011 Modelon AB
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import numpy as N
import pylab as P
import nose
try:
from assimulo.solvers import DASP3ODE
except ImportError:
pass
from assimulo.problem import SingPerturbed_Problem
[docs]def run_example(with_plots=True):
r"""
Example to demonstrate the use of DASP3 for a
singularly perturbed problem:
Slow part of the problem:
.. math::
\dot y_1 &= -(0.6 z + 0.8 y_3) y_1 + 10 y_2 \\
\dot y_2 &= -10 y_2 + 1.6 z_1 y_3 \\
\dot y_3 &= -1.33 \varepsilon ^2 y_3 ( y_1 + 2 z)
with :math:`\varepsilon = \frac{1}{3} 10^{-3}`.
Fast part of the problem:
.. math::
\dot z = 1.6 z y_3 - 6 z y_1 - 45 (\varepsilon z)^2 + 0.8 y_3 y_1
on return:
- :dfn:`exp_mod` problem instance
- :dfn:`exp_sim` solver instance
"""
#Define the slow rhs
def dydt(t,y,z):
eps=(1./3)*1.e-3
yp = N.array([-(.6*z[0]+.8*y[2])*y[0]+10.*y[1],
-10.*y[1]+ 1.6*z[0] *y[2],
-1.33*eps**2*y[2]*(y[0]+2.*z[0])])
return yp
#Define the fast rhs
def dzdt(t,y,z):
eps=(1./3)*1.e-3
zp = N.array([1.6*z[0]*y[2]-.6*z[0]*y[0]
-45.*(eps*z[0])**2+.8*y[2]*y[0]])
return zp
#The initial values
y0 = [ 3.0, 0.216, 1.0]
z0 = [1.35]
eps = N.array([.33333333e-3])
#Define an Assimulo problem
exp_mod = SingPerturbed_Problem(dydt, dzdt,
yy0=y0, zz0=z0,eps=eps,
name = 'DASP3 Example: Singularly perturbed ODE')
#Define an explicit solver
exp_sim = DASP3ODE(exp_mod) #Create a CVode solver
#Sets the parameters
exp_sim.rtol = 1e-5 #Default 1e-6
exp_sim.atol = 1e-5 #Default 1e-6
#Simulate
t, y = exp_sim.simulate(10) #Simulate 10 seconds
#Basic test
nose.tools.assert_almost_equal(y[-1,0], 10.860063849896818, 3)
#Plot
if with_plots:
P.semilogy(t, y, color="b")
P.grid()
P.title(exp_mod.name+r' $\varepsilon = \frac{1}{3} 10^{-3}$')
P.xlabel('Time')
P.ylabel('y')
P.show()
return exp_mod, exp_sim
if __name__=='__main__':
mod,sim = run_example()