Source code for odespy.runtests
from odespy import *
from problems import *
from scitools.std import plot, hold
try:
import joblib # need joblib for storing database nested dict
except ImportError:
print 'This script requires joblib to be installed.'
sys.exit(1)
newresults = {}
[docs]def test_Linear():
# Note: MidpointIter needs max_iter=10 and eps_iter=1E-6;
# lower tolerances do not give errors to machine precision.
# No problem with Linear2t so it is the nonlinearity that
# fools MidpointIter.
# Problems 2>a>0: RKF45 gives wrong results, error 0.67
# RungeKutta3 and BogackiShampine error approx 1E-8
# Problems a<0: numerous, also for Linear2t which is linear
kwargs = dict(a=1.2, b=2, c=2)
problems = Linear1(**kwargs), Linear2(**kwargs), Linear2t(**kwargs)
r = tester(problems, list_available_solvers(), compare_tol=1E-14)
return r
[docs]def test_disk():
problem = Linear2(a=1.2,b=2,c=2)
solver = ForwardEuler(problem.f, disk_storage=True, verbose=0)
solver.set_initial_condition(problem.U0)
tp = np.linspace(0, 10, 1000000)
# tp = problem.default_parameters()['time_points']
u, t = solver.solve(tp)
print 'made u', u.size
u0 = u[:,0]
print 'made u0'
if tp.size > 500000:
u = u[-100:]
t = t[-100:]
error = problem.verify(u, t)
print error
else:
error = None
print 'u memmap:', u[:10]
u[:] = 5.5
u.flush()
print u[:10]
return {'Linear2': {'t': t, 'ForwardEuler': (u, error)}}
[docs]def test_Exponential():
problem = Exponential(a=-0.5, b=2, A=1.5)
# test f_args, jac_kwargs etc
methods = [Vode]
for method in methods:
solver = method()
[docs]def test_VanDerPol(mu=0):
problem = VanDerPolOscillator(mu=mu, U0=[1,0])
d = problem.default_parameters()
tp = d['time_points']
# test f_args, jac_kwargs etc
methods = [Vode, RK4, RungeKutta4, ForwardEuler, BackwardEuler]
for method in methods:
name = method.__name__
print name
solver = method(problem.f, jac=problem.jac,
atol=d['atol'], rtol=d['rtol'])
solver.set_initial_condition(problem.U0)
u, t = solver.solve(tp)
plot(t, u[:,0], legend=name,
legend_fancybox=True, legend_loc='upper left')
hold('on')
e = problem.verify(u, t)
if e is not None: print e
if __name__ == '__main__':
resfile = 'test_problems_odespy.dat'
if os.path.isfile(resfile):
database = joblib.load(resfile)
else:
database = {}
# Run tests
#test_VanDerPol(float(sys.argv[1]))
#r = test_Linear()
r = test_disk()
import pprint
f = open('tmp.2', 'w')
f.write(pprint.pformat(r))
f.close()
# We come here only if all tests pass
joblib.dump(database, resfile)