Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
3774 views
ubuntu2004
1
def generator():
2
def linear():
3
"""
4
Generates
5
p(t)y'+q(t)y=r(t).
6
One function has no zeros,
7
one function has a unique zero,
8
the last has two zeros.
9
"""
10
t,y = var('t y')
11
order = choice([2,3])
12
if choice([True,False]):
13
yp = var("yp", latex_name="y'")
14
ypp = var("ypp", latex_name="y''")
15
yp0 = randrange(-6,7)
16
ypp0 = False
17
else:
18
yp = var("ypp", latex_name="y''")
19
ypp = var("yppp", latex_name="y'''")
20
yp0 = randrange(-6,7)
21
ypp0 = randrange(-6,7)
22
zeros = [
23
randrange(-6,-3),
24
randrange(-2,3),
25
randrange(5,7)
26
]
27
shuffle(zeros)
28
pqr = [
29
choice([
30
exp(t*randrange(1,6)*choice([-1,1])),
31
t^2+randrange(1,6)^2
32
]),
33
choice([
34
t-zeros[0],
35
# exp(randrange(2,6)*(t-zeros[0]))-1,
36
exp(t)*(t-zeros[0])
37
]),
38
choice([
39
(t-zeros[1])*(t-zeros[2]),
40
]),
41
]
42
constant = randrange(1,6)*choice([-1,1])
43
roll = randrange(1,3)
44
if roll == 0: #dummied out
45
# p has no zeroes, thm says all real numbers
46
p = pqr[0]
47
others = [pqr[1],pqr[2]]
48
shuffle(others)
49
q,r=others
50
t0 = randrange(-6,7)
51
y0 = randrange(-6,7)
52
interval = "(-\\infty,+\\infty)"
53
elif roll == 1:
54
# p has one zero, zeros[0], randomly choose left or right
55
p = pqr[1]
56
others = [pqr[0],pqr[2]]
57
shuffle(others)
58
q,r=others
59
if choice([True,False]):
60
t0 = zeros[0] - randrange(1,5)
61
y0 = zeros[0] + randrange(1,5)
62
interval = f"(-\\infty,{zeros[0]})"
63
else:
64
t0 = zeros[0] + randrange(1,5)
65
y0 = zeros[0] - randrange(1,5)
66
interval = f"({zeros[0]},+\\infty)"
67
else:
68
# p has two zeros, zeros[1] and zeros[2], choose random between them
69
p = pqr[2]
70
others = [pqr[0],pqr[1]]
71
shuffle(others)
72
q,r=others
73
z1 = min([zeros[1],zeros[2]])
74
z2 = max([zeros[1],zeros[2]])
75
t0 = randrange(z1+1,z2)
76
y0 = choice([z1-randrange(1,5),z2+randrange(1,5)])
77
interval = f"({z1},{z2})"
78
ode = shuffled_equation(p*ypp,q*y,r,constant*yp)
79
80
return {
81
"ode": ode,
82
"interval": interval,
83
"t0": t0,
84
"y0": y0,
85
"yp0": yp0,
86
"ypp0": ypp0,
87
"y":y,
88
}
89
90
def first_order():
91
"""
92
Generates
93
y'=F(t,y)+C
94
where F is discontinuous/nondifferentiable
95
at certain points
96
"""
97
t = var('t')
98
y,yp = mi_vars("y","y'")
99
t0,y0 = [randrange(2,7)*choice([-1,1]) for _ in range(2)]
100
a = randrange(2,4)
101
powerd = choice([3,5])
102
powern = choice([2,4,7,8])
103
ode=shuffled_equation(
104
(a*y+t-a*y0-t0+randrange(1,6))^powern*choice([-1,1]),
105
(yp+choice([-1,1])*randrange(1,6))^powerd
106
)
107
if powerd<powern:
108
domain = "for all real numbers"
109
else:
110
domain = "nearby the initial value"
111
112
return {
113
"ode": ode,
114
"t0": t0,
115
"y0": y0,
116
"domain": domain,
117
"y":y,
118
}
119
120
ivps = [linear(),first_order()]
121
shuffle(ivps)
122
return {"ivps":ivps}
123