bookmark_border02.뉴턴의 운동법칙

뉴턴의 운동법칙

  • 제 1법칙 : 관성의 법칙
  • 제 2법칙 : 가속도의 법칙 : F = ma : 힘 = 질량 x 가속도
  • 제 3법칙 : 작용-반작용의 법칙

제 1 법칙 관성의 법칙

  • 물체에 힘이 가해지지 않으면 정지하거나 등속 직선 운동을 한다.
  • 속도
    – 일정 시간동안 물체의 위치가 변한 정도
    – 위치의 변화, 변위를 나타내는 물리량
    – 벡터 형태로 표현
    Speed and Velocity
    속력과 속도
    – 속력 speed = \frac {{\varDelta}s} {{\varDelta}t} = \frac{Distance}{Time} =  \frac{50 km}{1 hour} : 스칼라
    – 속도(Velocity) 는 방향이 있는 속력 : 벡터
GlowScript 2.9 VPython

# creating ball
ball = sphere(radius = 0.2)

# Initial Setting
ball.pos = vec(-2,0,0) ## m
ball.v = vec(0.8,0,0)  ## m/s 초속 0.8미터

t = 0  ## s
dt = 1 ## s 1초

attach_arrow(ball, "v", shaftwidth=0.1, color=color.green)

scene.waitfor('click')
ball.pos = ball.pos + ball.v*dt #r1 ‐> r2
t = t + dt

scene.waitfor('click')
ball.pos = ball.pos + ball.v*dt #r2 ‐> r3
t = t + dt
dt = 0.01
while t < 4:
    rate(1/dt)
    ball.pos = ball.pos + ball.v*dt
    t = t + dt

rate : 초당 몇번 이 구문을 실행하게 할것인가?
rate(1/dt) : 실시간, 시간간격을 dt로 잡았다면 1/dt 는 실시간, dt가 1초면 1초마다, 0.01초면 0.01초마다.
rate(100) : 초당 while 루프 안을 100 번 수행(화면을 변경)하겠다는 의미

제 2 법칙 가속도의 법칙

  • \color{blue} F = ma
    • 힘 = 질량 X 가속도

    • 힘이 클수록 더 많은 가속도
    • 질량이 클수록 더 적은 가속도
    • 힘이 변하지 않을때, 가속도는 일정 : 등가속도운동
    • 하나의 물체에 여러힘이 작용할때는 벡터의 합으로 알짜 힘을 구함
  • 가속도 (Acceleration)
    – 속도가 변하는 정도 : 일정 시간 동안 물체의 속도가 변한 정도



    가속도 = 속도가 변한 정도 / 일정 시간 = {\frac {4 m/s} {2 s}} = 2 m/s2
가속도 예제 03-01

GlowScript 2.9 VPython

#creating ball
ball = sphere(radius = 0.2)

#Initial Setting
ball.pos = vec(-2,0,0) ## m
ball.v = vec(0,0,0) ## m/s
ball.a = vec(0.35,0,0) ## m/s**2, 가속도

t = 0 ## s
dt = 1 ## s

attach_arrow(ball, "v", shaftwidth=0.1, color=color.green)
attach_arrow(ball, "a", shaftwidth=0.05, color=color.red)
attach_trail(ball, type = 'points', pps = 5)

while t < 4:
    rate(1/dt)
    ball.v = ball.v + ball.a*dt
    ball.pos = ball.pos + ball.v*dt #r1 ‐> r2
    t = t + dt

포물체의 움직임

  • 중력을 받는 상황에서 움직일때, 포물선을 그리며 움직임
  • 중력이 일정하다는 가정하에 등가속 운동 
  • 가속도가 수직 아래 방향 -> 가속도의 방향이 -y 방향
포물체의 움직임 예제 03-02

GlowScript 2.9 VPython

#creating ball
ball = sphere(radius = 0.2)
ground = box(pos = vec(0, -4, 0), size = vec(15, 0.01, 15))

#Initial Setting
ball.pos = vec(-2,0,0) ## m
ball.v = vec(1,1,0)    ## m/s
ball.a = vec(0,-0.3,0) ## 가속도

t = 0 ## s
dt = 0.01 ## s

attach_arrow(ball, "v", shaftwidth=0.1, color=color.green)
attach_arrow(ball, "a", shaftwidth=0.05, color=color.red)
attach_trail(ball, type = 'points', pps = 5)

motion_graph = graph(title = 'position-time', xtitle = 't', ytitle = 'y')
g_bally = gcurve()

motion_graph2 = graph(title = 'velocity-time', xtitle = 't', ytitle = 'vy')
g_ballvy = gcurve(color=color.green)

while ball.pos.y > ground.pos.y:
    rate(1/dt)    
    ball.v = ball.v + ball.a*dt
    ball.pos = ball.pos + ball.v*dt
    g_bally.plot(pos=(t, ball.pos.y))
    g_ballvy.plot(pos=(t, ball.v.y))
    t = t + dt
attach_trail(ball, type = 'points', pps = 5)
  - 객체의 자취를 그려주는 함수
  - ball : 자취를 그릴 객체
  - type : 자취의 type 설정
  - pps : 점을 몇초마다 그릴 것인지

motion_graph = graph(title = 'position-time', xtitle = 't', ytitle = 'y')
  - 그래프 생성 함수
  - title : 그래프 이름 설정
  - xtitle : x축 이름 설정
  - ytitle : y축 이름 설정

g_bally = gcurve()
  - 그래프의 데이터를 그리는 함수

g_bally.plot(pos(t, ball.pos.y))
  - 그래프에 새 데이터를 추가해 그리는 함수
포물체의 움직임 예제 03-03

GlowScript 2.9 VPython

rList = list()
objList = list()

#Creating Objects
ground = box(pos = vec(0, -5, 0), size = vec(15, 0.01, 15))

for i in range(0, 100):
    rList.append(vec(0, -4, 0))

for r in rList:
    objList.append(sphere(pos = r, radius = 0.1, color = vec(random(), random(), random()), make_trail=True, retain = 30))

#Intitial Condition
vi = vec(0, 5.0, 0)
a = vec(0, -3, 0)
explosion = False

for obj in objList:
    obj.v = vi

#time Setting
t = 0
dt = 0.01

#Simulation Loop

while t < 12:
    rate(1/dt)
    
    #Explosion
    if t > 1 and explosion == False:
        print("explosion!")
        for obj in objList:
            obj.v = obj.v + vec(random()-0.5, random()-0.5, random()-0.5)
        explosion = True
    
    #Velocity and Position Update
    for obj in objList:
        obj.v = obj.v + a*dt
        obj.pos = obj.pos + obj.v*dt

        #Coliision Handling
        if obj.pos.y < ground.pos.y:
            obj.pos.y = ground.pos.y
            obj.v.y = -0.8 * obj.v.y
            obj.color = vec(random(), random(), random())
    t = t+dt
mag(r)
- 벡터 r의 크기(길이)를 계산해서 반환하는 함수

norm(r)
- 벡터 r의 단위 벡터를 계산해서 반환하는 함수

제 3 법칙 작용 반작용의 법칙

  • 어떠한 물체에 힘이 작용하면 물체에 힘이 작용하는 동시에, 항상 크기가 같고 방향이 반대인 힘이 작용함

bookmark_border01. 3차원 물체와 벡터 표현

1. VPython(Glowscript)을 이용한 3차원 물체 표현

좌표계

HelloPhysics

GlowScript 2.9 VPython

#Creating Ball
myBall = sphere(color=color.red, radius=2)

#Creating Box
myBox = box(pos = vec(5,0,0), color = color.blue, size = vec(0.5,4,1))
myBall.color = color.green
myBox.pos.x = 10

2. VPython(Glowscript)을 이용한 벡터 연산

벡터(Vector)

  • 벡터는 크기(magnitude)와 방향(direction)을 갖는다.


    선의 길이는 크기를 나타내고 화살표는 방향을 나타낸다.
  • 두 벡터는 더할 수 있다.
  • 두 벡터를 뺄 수도 있다.

  • 벡터의 표기법 : 굵은 a

  • 벡터 a는 두개의 벡터 axay 로 나눌 수 있다.


    a = (ax, ay)
  • 벡터 더하기 예제


    a = (8, 13) , b = (26, 7)
    c = a + b
    c = (8, 13) + (26, 7) = (8+26, 13+7) = (34, 20)
  • 벡터 빼기 예제
    v = (12, 2) , k = (4, 5)
    a = v + −k
    a = (12, 2) + −(4, 5) = (12, 2) + (−4, −5) = (12−4, 2−5) = (8, −3)
  • 벡터의 크기 표기법
    |a|
    또는, 절대값과 혼돈되지 않도록 ||a||
  • 벡터의 크기 계산
    피타고라스의 정리
    |a| = √( x2 + y2 )

    벡터 b의 크기는 ?
    b = (6, 8)
    |b| = √( 62 + 82) = √( 36+64) = √100 = 10

    스칼라 : 크기만 표기
스칼라값 계산 예제

GlowScript 3.0 VPython

# Vectors
r= vector(6,8,0)

# 벡터의 크기 : 스칼라값
mag_val = sqrt(6**2 + 8**2)
print("Magnitude:", mag_val) 

r_mag = mag(r)
print("mag(r):", r_mag)
  • 단위벡터
    Unit Vector
    크기가 1인 벡터
    표기법 : a “hat
    스케일링 : 단위벡터의 2.5배
벡터의 크기와 방향

GlowScript 2.9 VPython

#Vectors
r= vector(3,4,5)
r_arrow = arrow(pos = vector(0,0,0), axis=r, shafrwidth=0.2)

#Axes (사물의) (중심) 축, 축선
x_axis = arrow(axis=vector(10,0,0), color=color.red, shaftwidth=0.1)
y_axis = arrow(axis=vector(0,10,0), color=color.green, shaftwidth=0.1)
z_axis = arrow(axis=vector(0,0,10), color=color.blue, shaftwidth=0.1)

r_mag = mag(r)    // 벡터의 크기 : 스칼라값
r_hat = norm(r)   // 벡터의 방향 : 단위벡터
r_hat_arrow = arrow(axis=r_hat, color=color.cyan, shaftwidth=0.2)

print("r:", r)
print("r_mag:", r_mag)
print("r_hat:", r_hat)
mag(r)
- 벡터 r의 크기(길이)를 계산해서 반환하는 함수

norm(r)
- 벡터 r의 단위 벡터를 계산해서 반환하는 함수
벡터 연산

GlowScript 3.0 VPython

a = vector(3,4,0)
b = vector(5,1,0)

# 벡터더하기
c = a + b

# 벡터빼기
d = a - b

# 벡터의내적
e = dot(a,b)

deg = acos(e/mag(a)/mag(b)) ## rad
deg = degrees(deg) ## deg
a_arrow = arrow(pos=vector(0,0,0), axis=a, shaftwidth=0.2,color=color.blue)
b_arrow = arrow(pos=vector(0,0,0), axis=b, shaftwidth=0.2,color=color.green)
#c_arrow = arrow(pos=vector(0,0,0), axis=c, shaftwidth=0.2,color=color.red)
d_arrow = arrow(pos=b, axis=d, shaftwidth=0.2,color=color.red)

print("a+b=", c)
print("a-b=", d)
print("dot(a,b) =", e)
print("degree(a,b) =", deg)
  • 두 벡터 곱하기

    벡터의 내적 : Dot Product : 결과값 스칼라
    벡터의 외적 : Cross Product : 결과값 벡터
벡터내적 : Dot Product

GlowScript 2.9 VPython

#Vectors
v = vector(3,4,0)
r = vector(1,0,0)
v_par = dot(v,r)*r
v_per = v - v_par
v_arr = arrow(axis=v, shaftwidth=0.2)
r_arr = arrow(axis=r, shaftwidth=-0.3, color=color.blue)
v_par_arr = arrow(axis=v_par, shaftwidth=0.2, color= color.green)
v_per_arr = arrow(axis=v_per, shaftwidth=0.2, color= color.yellow)

print("v=", v)
print("r=", r)
print("dot(v,r)=", dot(v,r))
print("v_par=", v_par)
print("v_per=", v_per)
벡터의 외적 : Cross Product

GlowScript 2.9 VPython

#Vectors
a = vector(1,2,3)
b = vector(-1,2,0)
c = cross(a,b)

a_arr = arrow(axis=a, shaftwidth=0.1, color=color.red)
b_arr = arrow(axis=b, shaftwidth=0.1, color=color.blue)
c_arr = arrow(axis=c, shaftwidth=0.1)

d = cross(b,a)
d_arr = arrow(axis=d, shaftwidth=0.1, color=color.yellow)