Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
20865 views
1
def generator():
2
"""
3
Generates
4
x' = _t^_x^_+_t^_y^_+_x^_y^_+_
5
y' = _t^_x^_+_t^_y^_+_x^_y^_+_
6
with one term zeroed, and asks for
7
x,y at t=t_0+2h for h=0.1
8
"""
9
10
def random_ode(t,x,y):
11
cs = [randrange(1,5)*choice([-1,1]) for _ in range(3)]
12
cs[choice([0,1,2])]=0
13
return cs[0]*t^randrange(1,3)*x^randrange(1,3) + \
14
cs[1]*t^randrange(1,3)*y^randrange(1,3) + \
15
cs[2]*x^randrange(1,3)*y^randrange(1,3) + randrange(-3,4)
16
17
18
rerolling=True
19
while rerolling:
20
t,x,y=var('t x y')
21
xp,yp=(random_ode(t,x,y) for _ in range(2))
22
t_0,x_0,y_0 = (randrange(-2,3) for _ in range(3))
23
h=(1/10).n(digits=2)
24
vals=[{"t":t_0,"x":x_0,"y":y_0}]
25
for i in range(2):
26
t_n=vals[i]["t"]
27
x_n=vals[i]["x"]
28
y_n=vals[i]["y"]
29
vals.append({
30
"t": (t_n+h).n(digits=2),
31
"x": (x_n+h*xp(t=t_n,x=x_n,y=y_n)).n(digits=3),
32
"y": (y_n+h*yp(t=t_n,x=x_n,y=y_n)).n(digits=3),
33
})
34
if vals[-1]["x"].abs() < 100 and vals[-1]["x"].abs() > 1/100 and vals[-1]["y"].abs() < 100 and vals[-1]["y"].abs() > 1/100:
35
rerolling=False
36
37
return {
38
"xp": xp,
39
"yp": yp,
40
"init": vals[0],
41
"final": vals[-1],
42
"vals": vals[1:],
43
"h": h,
44
}
45