Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- import math
- g = 9.80665 # standard gravity (m/s^2)
- p = 1.225 # density of 15°C air at sea level and (kg/m^3)
- class Ball:
- def __init__(self, m, A, Cd):
- self.m = m # mass (kg)
- self.A = A # cross sectional area (m^2)
- self.Cd = Cd # coefficient of drag
- self.z = 0 # distance fallen
- self.v = 0 # velocity
- self.p = p # density of fluid
- self.g = g # gravity
- self.vt = math.sqrt(2 * g * self.m / self.p / self.Cd / self.A)
- def drag(self, v):
- # 1/2 p Cd A v^2
- return 0.5 * self.p * self.Cd * self.A * v**2
- def step(self,dt):
- a = self.g - self.drag(self.v) / self.m
- self.z += self.v * dt + 0.5 * a * dt**2
- self.v += a * dt
- def reset(self):
- self.z = 0
- self.v = 0
- def basketball(): return Ball(0.620, 0.750**2/4/math.pi, 0.47)
- def bowling_ball(): return Ball(7.26, 0.6859**2/4/math.pi, 0.47)
- def massive_sphere(r,m): return Ball(m, math.pi * r**2, 0.47)
- def dense_sphere(r,d): return massive_sphere(r, d * 4 * math.pi * r**3 / 3)
- def lead_sphere(r): return dense_sphere(r, 11340)
- def pine_sphere(r): return dense_sphere(r, 500)
- def pingpong_ball(): return Ball(0.0027, 0.02**2 * math.pi, 0.47)
- def ant(): return Ball(0.000005, 0.00003, 0.8)
- def rat(): return Ball(0.3, 0.04, 0.8)
- def cat(): return Ball(4.0, 0.1, 0.8)
- def person(): return Ball(70.0, 0.64, 0.6)
- def phone(): return Ball(.174, .14*.07, 2.1)
- def sim(balls):
- dt = 0.001
- for ms in range(10001):
- if ms % 100 == 0:
- out = [ms/1000]
- for b in balls:
- pt = 100 * b.v / b.vt
- out.append((round(b.z,2), round(b.v,2), round(pt,1)))
- print(out)
- for b in balls:
- b.step(dt)
- balls = [phone(), ant(), rat(), cat(), person(), bowling_ball()]
- sim(balls)
- x = person()
- print(x.vt)
- x = phone()
- print(x.vt)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement