Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
3774 views
ubuntu2004
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(2,4) + \
15
cs[2]*x^randrange(2,4) + randrange(-3,4)
16
17
18
while True:
19
t,x,y=var('t x y')
20
xp,yp=(random_ode(t,x,y) for _ in range(2))
21
t_0,x_0,y_0 = (randrange(-2,3) for _ in range(3))
22
if xp(t=t_0,x=x_0)==0:
23
continue
24
h=(choice([2,3])/10).n(digits=2)
25
vals=[{"t":t_0,"x":x_0,"y":y_0}]
26
for i in range(2):
27
t_n=vals[i]["t"]
28
x_n=vals[i]["x"]
29
y_n=vals[i]["y"]
30
vals.append({
31
"t": (t_n+h).n(digits=2),
32
"x": (x_n+h*xp(t=t_n,x=x_n,y=y_n)).n(digits=3),
33
"y": (y_n+h*yp(t=t_n,x=x_n,y=y_n)).n(digits=3),
34
})
35
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:
36
break
37
38
return {
39
"xp": xp,
40
"yp": yp,
41
"init": vals[0],
42
"final": vals[-1],
43
"vals": vals[1:],
44
"h": h,
45
}
46