def _check_continued_integration(generator): dsargs, _ = vanDerPol() dsargs['name'] += '_continued' ode = generator(dsargs) # two step integration ode.set(tdomain=[0, 200]) ode.set(tdata=[0, 100]) left = ode.compute('first_half_traj') ode.set(tdata=[100, 200]) right = ode.compute('second_half_traj', 'c') assert left(100.0) == right(100.0) # one step integration ode.set(tdata=[0, 200]) full = ode.compute('full_traj') t = [0.0, 25.0, 50.0, 75.0, 100.0] assert_array_almost_equal(left(t, 'x').toarray(), full(t, 'x').toarray(), 4) assert_array_almost_equal(left(t, 'y').toarray(), full(t, 'y').toarray(), 4) t = [100.0, 125.0, 150.0, 175.0, 200.0] assert_array_almost_equal(right(t, 'x').toarray(), full(t, 'x').toarray(), 4) assert_array_almost_equal(right(t, 'y').toarray(), full(t, 'y').toarray(), 4)
def _check_continued_integration(generator): dsargs, _ = vanDerPol() dsargs['name'] += '_continued' ode = generator(dsargs) # two step integration ode.set(tdomain=[0, 200]) ode.set(tdata=[0, 100]) left = ode.compute('first_half_traj') ode.set(tdata=[100, 200]) right = ode.compute('second_half_traj', 'c') assert left(100.0) == right(100.0) # one step integration ode.set(tdata=[0, 200]) full = ode.compute('full_traj') t = [0.0, 25.0, 50.0, 75.0, 100.0] assert_array_almost_equal( left(t, 'x').toarray(), full(t, 'x').toarray(), 4) assert_array_almost_equal( left(t, 'y').toarray(), full(t, 'y').toarray(), 4) t = [100.0, 125.0, 150.0, 175.0, 200.0] assert_array_almost_equal( right(t, 'x').toarray(), full(t, 'x').toarray(), 4) assert_array_almost_equal( right(t, 'y').toarray(), full(t, 'y').toarray(), 4)
def _cross_check_forward_integration(generator, other): dsargs, _ = vanDerPol() dsargs['name'] += '_forward' if Euler_ODEsystem in [generator, other]: dsargs['algparams']['init_step'] = 1e-3 decimal = 2 else: decimal = 4 t = linspace(0.0, 20.0) dsargs['tdata'] = [t[0], t[-1]] left = generator(dsargs).compute(str(generator) + '_traj') right = other(dsargs).compute(str(other) + '_traj') print(str(generator)) assert_array_almost_equal(left(t, 'x').toarray(), right(t, 'x').toarray(), decimal) assert_array_almost_equal(left(t, 'y').toarray(), right(t, 'y').toarray(), decimal)
def _check_backward_integration(generator): dsargs, _ = vanDerPol() dsargs["name"] += "_backward" ode = generator(dsargs) # forward integration ode.set(tdomain=[0, 20]) ode.set(tdata=[0, 20]) forward = ode.compute("fwd") # backward integration ode.set(tdata=[0, 20], ics=forward(20.0).todict()) backward = ode.compute("bwd", "b") t = [0.0, 5.0, 10.0, 15.0, 20.0] for v in ode.variables: assert_allclose( forward(t, v).toarray(), backward(t, v).toarray(), rtol=1e-7, atol=0 if generator != Radau_ODEsystem else 1e-2, )
def _check_backward_integration(generator): dsargs, _ = vanDerPol() dsargs['name'] += '_backward' ode = generator(dsargs) # forward integration ode.set(tdomain=[0, 20]) ode.set(tdata=[0, 20]) forward = ode.compute('fwd') # backward integration ode.set(tdata=[0, 20], ics=forward(20.0).todict()) backward = ode.compute('bwd', 'b') t = [0.0, 5.0, 10.0, 15.0, 20.0] for v in ode.variables: assert_allclose( forward(t, v).toarray(), backward(t, v).toarray(), rtol=1e-7, atol=0 if generator != Radau_ODEsystem else 1e-2 )
def _cross_check_forward_integration(generator, other): dsargs, _ = vanDerPol() dsargs['name'] += '_forward' if Euler_ODEsystem in [generator, other]: dsargs['algparams']['init_step'] = 1e-3 decimal = 2 else: decimal = 4 t = linspace(0.0, 20.0) dsargs['tdata'] = [t[0], t[-1]] left = generator(dsargs).compute(str(generator) + '_traj') right = other(dsargs).compute(str(other) + '_traj') print(str(generator)) assert_array_almost_equal( left(t, 'x').toarray(), right(t, 'x').toarray(), decimal) assert_array_almost_equal( left(t, 'y').toarray(), right(t, 'y').toarray(), decimal)