|
1 |
| -# KingFredrickVI |
2 |
| -class Ball: |
| 1 | +def verlet(pos, acc, dt): |
| 2 | + prev_pos = pos |
| 3 | + time = 0 |
3 | 4 |
|
4 |
| - def __init__(self, pos=0, vel=0, acc=0): |
5 |
| - self.pos = pos |
6 |
| - self.vel = vel |
7 |
| - self.acc = acc |
| 5 | + while pos > 0: |
| 6 | + time += dt |
| 7 | + next_pos = pos * 2 - prev_pos + acc * dt * dt |
| 8 | + prev_pos, pos = pos, next_pos |
8 | 9 |
|
| 10 | + return time |
9 | 11 |
|
10 |
| -class Simulation: |
| 12 | +def stormer_verlet(pos, acc, dt): |
| 13 | + prev_pos = pos |
| 14 | + time = 0 |
| 15 | + vel = 0 |
11 | 16 |
|
12 |
| - def __init__(self, obj, dt = 0.01): |
13 |
| - self.obj = obj |
14 |
| - self.dt = dt |
15 |
| - self.prev_pos = self.obj.pos |
| 17 | + while pos > 0: |
| 18 | + time += dt |
| 19 | + next_pos = pos * 2 - prev_pos + acc * dt * dt |
| 20 | + prev_pos, pos = pos, next_pos |
| 21 | + vel += acc * dt |
16 | 22 |
|
17 |
| - def run(self): |
18 |
| - self.time = 0 |
| 23 | + return time, vel |
19 | 24 |
|
20 |
| - while self.obj.pos > 0: |
21 |
| - self.time += self.dt |
22 |
| - self.step() |
| 25 | +def velocity_verlet(pos, acc, dt): |
| 26 | + time = 0 |
| 27 | + vel = 0 |
23 | 28 |
|
24 |
| - def step(self): |
25 |
| - pass |
26 |
| - |
27 |
| - |
28 |
| -class Verlet(Simulation): |
29 |
| - |
30 |
| - def step(self): |
31 |
| - temp_pos = self.obj.pos |
32 |
| - self.obj.pos = self.obj.pos * 2 - self.prev_pos + self.obj.acc * self.dt * self.dt |
33 |
| - self.prev_pos = temp_pos |
34 |
| - |
35 |
| -class Stormer_Verlet(Simulation): |
36 |
| - |
37 |
| - def step(self): |
38 |
| - temp_pos = self.obj.pos |
39 |
| - self.obj.pos = self.obj.pos * 2 - self.prev_pos + self.obj.acc * self.dt * self.dt |
40 |
| - self.prev_pos = temp_pos |
41 |
| - |
42 |
| - self.obj.vel += self.obj.acc * self.dt |
43 |
| - |
44 |
| -class Velocity_Verlet(Simulation): |
45 |
| - |
46 |
| - def step(self): |
47 |
| - self.obj.pos += self.obj.vel * self.dt + 0.5 * self.obj.acc * self.dt * self.dt |
48 |
| - self.obj.vel += self.obj.acc * self.dt |
| 29 | + while pos > 0: |
| 30 | + time += dt |
| 31 | + pos += vel * dt + 0.5 * acc * dt * dt |
| 32 | + vel += acc * dt |
49 | 33 |
|
| 34 | + return time, vel |
50 | 35 |
|
51 | 36 | def main():
|
52 |
| - sim = Verlet(Ball(pos = 5.0, acc = -10)) |
53 |
| - sim.run() |
54 |
| - |
55 |
| - print("Verlet:", sim.time) |
56 |
| - |
57 |
| - sim = Stormer_Verlet(Ball(pos = 5.0, acc = -10)) |
58 |
| - sim.run() |
59 |
| - |
60 |
| - print("Stormer Verlet:", sim.time) |
61 |
| - |
62 |
| - sim = Velocity_Verlet(Ball(pos = 5.0, acc = -10)) |
63 |
| - sim.run() |
64 |
| - |
65 |
| - print("Velocity Verlet:", sim.time) |
66 |
| - |
67 |
| - |
68 |
| -if __name__ == "__main__": |
| 37 | + time = verlet(5, -10, 0.01) |
| 38 | + print("Verlet") |
| 39 | + print("Time: {:.10f}".format(time)) |
| 40 | + print() |
| 41 | + |
| 42 | + time, vel = stormer_verlet(5, -10, 0.01) |
| 43 | + print("Stormer-Verlet") |
| 44 | + print("Time: {:.10f}".format(time)) |
| 45 | + print("Velocity: {:.10f}".format(vel)) |
| 46 | + print() |
| 47 | + |
| 48 | + time, vel = velocity_verlet(5, -10, 0.01) |
| 49 | + print("Velocity Verlet") |
| 50 | + print("Time: {:.10f}".format(time)) |
| 51 | + print("Velocity: {:.10f}".format(vel)) |
| 52 | + print() |
| 53 | + |
| 54 | +if __name__ == '__main__': |
69 | 55 | main()
|
70 |
| - |
71 |
| - |
72 |
| - |
0 commit comments