bookmark_border04. 축구공의 움직임

축구공이 받는 힘

중력

  • (계산한) 지구표면의 중력의 힘 : 9.8 m/s2

g = -9.8 #m/s**2

# Gravity Force
grav = ball.m * vec(0,g,0) #gravity

공기저항력

  • 공기에 의한 저항
    – 물체가 기체 분자와 부딪히면서 (물체의 운동방향)속도 반대 방향으로 작용



축구공이 받는 힘

프리킥 시뮬레이션

프리킥 코드 06-01

GlowScript 2.9 VPython

# ground 운동장
ground = box(pos=vec(0,0,0),size=vec(100,0.10,70), color = color.green)

# init. positon & velocity of ball
init_pos = vec(-30,0.11,0)
ball = sphere(pos=init_pos,radius=0.11, color = color.orange) # m
ball.m = 0.45    # kg
ball.speed = 25  # m/s
ball.angle = radians(35)   # c.f) degrees 각도, 35도, 라디안으로 변환
ball.v = ball.speed*vec(cos(ball.angle),sin(ball.angle),0)
attach_trail(ball)
attach_arrow(ball, "v", shaftwidth = 0.1, scale = 0.3, color=color.yellow) # scale : 크기를 30%로 줄여서

# graph
gball_x = gcurve()
scene.range = 30 # x축 간격으로 약 30정도 세팅. 한눈에 들어오게

# const.
g = -9.8     # 중력가속도 m/s**2
rho = 1.204  # 공기의밀도 kg/m**3
Cd = 0.3     # laminar 저항계수

#time setting
t = 0
dt = 0.01

while t < 20:
    rate(1/dt)
    
    # Gravity Force
    grav = ball.m * vec(0,g,0)
    
    # Drag Force
    drag = -0.5*rho*Cd*(pi*ball.radius**2)*mag(ball.v)**2*norm(ball.v)
    print("gravity: ", mag(grav), 'drag force: ',mag(drag))
    
    # Sum of Forces
    ball.f = grav + drag
    
    # Time stepping
    ball.v = ball.v + ball.f/ball.m*dt
    ball.pos = ball.pos + ball.v*dt
    
    # graph
    gball_x.plot(pos=(t,mag(init_pos - ball.pos)))
    
    # collision
    if ball.pos.y - ball.radius < 0:
        #print(ball.pos.x)
        break
    t = t + dt
공기저항력없는 프리킥 코드 06-02

    # Sum of Forces
    ball.f = grav + drag
    ball2.f = grav
바람이 불때 프리킥 코드 06-03



# wind
wind_speed = 5    # m/s
#wind_speed = -5  # m/s
#wind_speed = -10 # m/s
wind_v = wind_speed*vec(1,0,0)

# Drag Force
ball.v_w = ball.v - wind_v
drag_wind = -0.5*rho*Cd*(pi*ball.radius**2)*mag(ball.v_w)**2*norm(ball.v_w)
    
# Sum of Forces
ball.f = grav + drag_wind

마그누스 효과

  • 공에 회전
    – 회전하는 방향으로 공이 휨
    – 마그누스 힘, 마그누스 효과
    – 물체주변의 공기 + 물체 회전
    – 진공에서는 휘지 않음.
    – 물체와 기체분자와의 상호작용

    – 기체분자가 축구공에 미치는 알짜힘 ->위쪽 방향으로의 힘.









바나나킥 시뮬레이션 08-01

Cm = 1       # 저항계수
w = 10*2*pi  # 10 rev. per sec 초당 10회전

# Magnus Force
magnus = 0.5*rho*Cm*(pi*ball.radius**2)*ball.radius*w*mag(ball.v)*cross(vec(0,1,0),norm(ball.v))

# Sum of Forces
ball.f = grav + drag + magnus
바나나킥 시뮬레이션 (슬라이더 UI) 08-02

## UI
scene.append_to_caption(' \nInitial Values \n \n')

# slider
velocitySlider = slider(min = 0, max = 45, value = 25, bind = setVelocity)
scene.append_to_caption(' \nVelocity:',velocitySlider.min, 'to' ,velocitySlider.max, '\n \n')

def setVelocity():
    global ball
    ball.speed = velocitySlider.value
    ball.v = ball.speed*vec(cos(ball.angle),sin(ball.angle),0)

bookmark_border03. 만유인력과 천제의 운동

만유인력의 법칙

  • 질량을 가지 두 물체는 인력이 작용
    – 물체 질량의 곱에 비례
    – 거리 제곱에 반비례
  • 중력 (Gravity)
  • 중력 (나무위키)



    \huge{ F = G \frac{m1 m2}{d^2}  }

  • G는 중력상수(실험적으로 측정) = 6.674×10-11 N m2/kg2
  • 지구표면의 중력 = 9.8 m/s2
    – 사과(질량) 0.1kg 이 갖는 힘은 ?
    F = ma
    F = mg
    F = 0.1 kg × 9.8 m/s2
    F = 0.98 kg m/s2
    F = 0.98 N
    => 약 1 뉴튼(N)

지구와 달

GlowScript 2.9 VPython

# 지구 : 반지름 6,400,000m, 6,400km
Earth = sphere(pos = vector(0,0,0), radius = 6400000, texture = textures.earth)

# 달 : 지구와 거리 385,000,000m 385,000km, 반지름 1,737,000m 1,737km
Moon = sphere(pos = vector(385000e3,0,0), radius = 1737000, make_trail = True)

sf = 6 #scailing factor
Earth.radius = sf*Earth.radius
Moon.radius = sf*Moon.radius

# 중력상수, 만유인력상수, 뉴턴상수: 6.674×10-11 N m2/kg2
G = 6.67e-11

# 지구 질량
Earth.mass = 5.972e24

# 달 질량
Moon.mass = 7.347e22

Earth.v = vec(0,0,0)
Moon.v = vec(0,0,0)

# time
t = 0
dt = 60

# Simulation Loop
while True:
    rate(1000)    

    # Forces
    r = Earth.pos - Moon.pos
    Moon.f = G * Earth.mass * Moon.mass / mag(r) ** 2 * norm(r)
    Earth.f = -Moon.f 

    # Time Integration
    Moon.v = Moon.v + Moon.f/Moon.mass*dt
    Earth.v = Earth.v + Earth.f/Earth.mass*dt

    Moon.pos = Moon.pos + Moon.v*dt
    Earth.pos = Earth.pos + Earth.v*dt

    t = t + dt    

    # Collision Check
    if Earth.radius + Moon.radius > mag(r):
        print("Collision!")
        print(t/60/60/24, "days")
        break

달의 공전

  • 달의 공전속도 =  1,022km/s
    – Moon.v = vec(0, 1022, 0)
  • 코드 05-01
    – 만유인력에 의해 (서로 끌어당겨) 점점 위로 올라감
    – 지구의 초기속도를 달의 초기속도 반대 방향으로 설정
    – 지구의 초기속도 = 달의 속도 x 달의 질량 / 지구의 질량
    Earth.v = -Moon.v * Moon.mass / Earth.mass
    -> 운동량 보존의 법칙 : 지구와 달을 하나의 시스템을 보았을때 운동량을 0으로 만드는 방법 (이렇게 하면 질량 중심의 위치가 변하지 않음)
  • 코드 05-02
  • 공전속도를 반으로 해보면…
    – Moon.v = 0.5*Moon.v
    – 지구와 가까워졌을때 빨라짐 => 케플러 법칙에 정확히 부합
  • 달의 공전속도를 1.2배로 해보면?
    – Moon.v = 1.2*Moon.v
    – 1.5배로 하면 멀리 가버림. 지구 중력이 달을 끌어당기지 못함. => 탈출속력
    – 탈출속력 : 지구의 중력을 이기고 탈출할 정도의 속력

3체운동

  • 세 물체가 받는 만유인력을 다 계산
  • 코드 5-04
    – 위성 위치를 중심에
    – 질량은 지구질량의 1/10 : sat.m = 1/10*earth.m
    – 지구와 달의 질량이 같으면 평형 운동
  • 코드 05-04-1 : 위성의 위치를 아주 약간 지구쪽으로 이동 : vector(-0.01*r,0,0)
  • 코드 05-04-2 : 더 작게 이동 : vector(-0.001*r,0,0)
  • 수학적 계산으로는 예측할 수 없고 컴퓨터 계산으로 근사적인 형태만 알 수 있음.

탐사선을 달로

  • 탐사선 질량 15,000 kg
  • 지구 반지름에서 10배 떨어진 곳에서 출발
  • 연료 없이 지구와 달의 인력으로만 이동
#craft
craft = sphere(pos=vec(-10*Earth.radius, 0,0), radius=1e6, color=color.yellow, make_trail=True)
craft.m = 15e3
  • 코드 05-05
    – 초속 2km 속도 : craft.v = vec(0,2e3,0) # initial vel without moon
    – 지구를 못 벗어남.
  • 코드 05-05-1
    – 초속 3.5km : craft.v = vec(0,3.5e3,0) # hyperbolic
    – 멀리 가버림.
  • 코드 05-05-2
    – #craft.v = vec(0,3.3e3,0) : 달의 뒷면 탐사
    – #craft.v = vec(0,3.27e3,0) #critical pt : 달의 앞면 탐사.
    – 물고기 모양 괘도

시뮬레이션

  • 수학적 일반해를 가지지 못하는 3체운동의 움직임을 확신할 수 있는 이유?
    – 시간 간격을 줄여 시뮬레이션을 진행해도 퀘도가 크게 달라지지 않음을 확인
    – 시뮬레이션을 통해 근사해를 구함