Skip to content

Commit 7bd4ef0

Browse files
committed
tests: add explicit rk tests for dde integrators
1 parent dc2e356 commit 7bd4ef0

File tree

2 files changed

+163
-2
lines changed

2 files changed

+163
-2
lines changed

brainpy/integrators/dde/explicit_rk.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# -*- coding: utf-8 -*-
22

3+
from typing import Dict
4+
import brainpy.math as bm
5+
36
from brainpy.integrators.constants import F, DT
47
from brainpy.integrators.dde.base import DDEIntegrator
58
from brainpy.integrators.ode import common
@@ -102,11 +105,14 @@ class Ralston2(ExplicitRKIntegrator):
102105

103106

104107
class RK2(ExplicitRKIntegrator):
105-
def __init__(self, f, beta=2 / 3, var_type=None, dt=None, name=None, show_code=False):
108+
def __init__(self, f, beta=2 / 3, var_type=None, dt=None, name=None,
109+
state_delays: Dict[str, bm.TimeDelay] = None,
110+
neutral_delays: Dict[str, bm.NeutralDelay] = None):
106111
self.A = [(), (beta,)]
107112
self.B = [1 - 1 / (2 * beta), 1 / (2 * beta)]
108113
self.C = [0, beta]
109-
super(RK2, self).__init__(f=f, var_type=var_type, dt=dt, name=name, show_code=show_code)
114+
super(RK2, self).__init__(f=f, var_type=var_type, dt=dt, name=name,
115+
state_delays=state_delays, neutral_delays=neutral_delays)
110116

111117

112118
register_dde_integrator('rk2', RK2)
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
# -*- coding: utf-8 -*-
2+
3+
4+
import unittest
5+
6+
import brainpy as bp
7+
import brainpy.math as bm
8+
9+
10+
class TestExplicitRKStateDelay(unittest.TestCase):
11+
def test_euler(self):
12+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
13+
14+
@bp.ddeint(method='euler', state_delays={'x': xdelay})
15+
def equation(x, t, ):
16+
return -xdelay(t - 1)
17+
18+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
19+
runner.run(20.)
20+
21+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
22+
23+
def test_midpoint(self):
24+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
25+
26+
@bp.ddeint(method='midpoint', state_delays={'x': xdelay})
27+
def equation(x, t, ):
28+
return -xdelay(t - 1)
29+
30+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
31+
runner.run(20.)
32+
33+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
34+
35+
def test_heun2(self):
36+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
37+
38+
@bp.ddeint(method='heun2', state_delays={'x': xdelay})
39+
def equation(x, t, ):
40+
return -xdelay(t - 1)
41+
42+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
43+
runner.run(20.)
44+
45+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
46+
47+
def test_ralston2(self):
48+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
49+
50+
@bp.ddeint(method='ralston2', state_delays={'x': xdelay})
51+
def equation(x, t, ):
52+
return -xdelay(t - 1)
53+
54+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
55+
runner.run(20.)
56+
57+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
58+
59+
def test_rk2(self):
60+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
61+
62+
@bp.ddeint(method='rk2',
63+
state_delays={'x': xdelay})
64+
def equation(x, t, ):
65+
return -xdelay(t - 1)
66+
67+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
68+
runner.run(20.)
69+
70+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
71+
72+
def test_rk3(self):
73+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
74+
75+
@bp.ddeint(method='rk3', state_delays={'x': xdelay})
76+
def equation(x, t, ):
77+
return -xdelay(t - 1)
78+
79+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
80+
runner.run(20.)
81+
82+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
83+
84+
def test_heun3(self):
85+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
86+
87+
@bp.ddeint(method='heun3', state_delays={'x': xdelay})
88+
def equation(x, t, ):
89+
return -xdelay(t - 1)
90+
91+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
92+
runner.run(20.)
93+
94+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
95+
96+
def test_ralston3(self):
97+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
98+
99+
@bp.ddeint(method='ralston3', state_delays={'x': xdelay})
100+
def equation(x, t, ):
101+
return -xdelay(t - 1)
102+
103+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
104+
runner.run(20.)
105+
106+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
107+
108+
def test_ssprk3(self):
109+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
110+
111+
@bp.ddeint(method='ssprk3', state_delays={'x': xdelay})
112+
def equation(x, t, ):
113+
return -xdelay(t - 1)
114+
115+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
116+
runner.run(20.)
117+
118+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
119+
120+
def test_rk4(self):
121+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
122+
123+
@bp.ddeint(method='rk4', state_delays={'x': xdelay})
124+
def equation(x, t, ):
125+
return -xdelay(t - 1)
126+
127+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
128+
runner.run(20.)
129+
130+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
131+
132+
def test_ralston4(self):
133+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
134+
135+
@bp.ddeint(method='ralston4', state_delays={'x': xdelay})
136+
def equation(x, t, ):
137+
return -xdelay(t - 1)
138+
139+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
140+
runner.run(20.)
141+
142+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
143+
144+
def test_rk4_38rule(self):
145+
xdelay = bm.TimeDelay(bm.zeros((1,)), 1., before_t0=-1., interp_method='round')
146+
147+
@bp.ddeint(method='rk4_38rule', state_delays={'x': xdelay})
148+
def equation(x, t, ):
149+
return -xdelay(t - 1)
150+
151+
runner = bp.integrators.IntegratorRunner(equation, monitors=['x'])
152+
runner.run(20.)
153+
154+
bp.visualize.line_plot(runner.mon.ts, runner.mon['x'], show=True)
155+

0 commit comments

Comments
 (0)