본문 바로가기
스크래치/스크래치 물리강좌

스크래치로 물리실험하기-6. 두개의 인력

by 할거없네 2017. 11. 12.

안녕하세요. 승승이입니다.

이번에 스크래치로 실험할 이야기는 '인력'입니다.

인력은 잡아당기는 힘인데, 중력도 있고 자기력도 있고 전기력도 있고 여러가지가 있기 때문에 무난하게 '인력'이라고 칭하고 시뮬레이션을 만들어 봅니다.

처음에는 2개에 대해서 잡아당기는 것을 만들 예정인데, 이것을 여러 개 만들어 볼까 합니다. , 프로그램상에서 여러 개의 상호작용을 어떤식으로 구현하는게 좋을지 고민을 해볼 시간입니다. 먼저 2개의 물체만을 생각해봅시다.





여기서 각 물체의 번호를 n이라고 칭하고, 순서대로 12인 물체를 생각합니다. 각각 작용하는 힘은 거리의 제곱의 반비례, 그 힘의 크기는 물체 질량 곱의 비례한다고 가정합니다. , 중력과 같은 공식입니다. 여기서 상수 kg는 임의로 사용하기로 합니다. 여러 개를 쓸 것을 대비하여 문자 nm을 사용했는데, 아직은 12만 사용하고 있으므로 이것을 무시해도 좋습니다. 이것은 여거래의 물체를 적용할 때 n은 자기 자신, m은 자기 자신 외의 나머지 물체들의 넘버링으로 사용할 예정입니다.

힘이 작용하는 방향도 고려해야 하는데 이 방향 크기는 1이고 오로지 방향만 나타냅니다. 이 방향벡터는 아래와 같이 정해질 것입니다.  



 


x2x1을 어떤 숫자를 대입해도 1 또는 -1이 됩니다. , 오로지 방향(+-)만 정해주고 크기에 관여를 안하는 방향벡터인 셈입니다.

방향벡터를 다시 r과 분자 분보가 서로 삭제되겠지만 일단 냅두기로 합니다. (이유는 2차원에서는 다시 살려서 계산해야 하기 때문입니다.)

이제 공식은 정리 되었으니 프로그램으로 짜 봅니다. 프로그램에서는 기존에 만든 것을 수정할 텐데요 먼저 위치-속도-가속도는 변경점이 없습니다. 다만 힘을 주는 부분이 달라질 뿐입니다. 이전에 2개 물체가 상호작용하는 스프링실험을 했을 때 각각의 공을 1번과 2번으로 나눠서 했지만 여기서는 순차적인 수인 n(=1,2,…)과 자신의 외의 수인 m을 사용할 것입니다. 먼저 힘에 의해 변경되는 가속도 부분을 만들고 n을 자신의 번호로, m은 이외의 수로 정해봅니다. , 다음과 같이 프로그래밍을 사용하면 자신외의 모든 물체들과의 계산을 쉽게 구현이 가능합니다. 그러나 일단은 2개만 사용하여 이해를 하기 위한 예제이므로 다음과 같이 구현해 봅시다.




위 블록이 좀 복잡해 보이는데 식으로 표현하면 다음과 같습니다.




참고로 여기서는 외력을 고려하지 않고 실험을 합니다. 실험 결과는 다음과 같습니다.





실험 결과가 생각보다 잘 안나온것 같습니다. 작용 반작용에 의해서 둘다 같은 힘을 받아서 같은 속도로 튕겨져야 하지만 그렇지 않네요. 하지만 컴퓨터 식으로는 적당히 잘 된거 같은데 뭐가 문제일까요


첫번째로 여기서는 실제 물체와 다른 무언가 하나 빠졌는데, ‘충돌입니다. 실제 물체는 어느 거리 이상이면 충돌로 인해서 일정 거리 이하에서는 중력보다 충돌로 인한 반발력이 더 크기 때문에 더이상 붙지 않습니다


두번째로는 컴퓨터 계산의 한계입니다. 거리가 0에 가까울수록 엄청난 힘이 들어가게 되는데, 그것을 계산하기에는 컴퓨터의 한계가 있습니다. 더 정확히는 컴퓨터가 시간까지 계산하지 않은 것인데, 아킬레스가 거북이를 따라잡을 수 없다는 제논의 역설은 컴퓨터에서 적용하기 힘듭니다. 거리가 0에 가까울 수록 힘이 커진만큼 물체가 가까울 수록 더 정교하게 계산이 되어져야 합니다. 만약 속도가 100이라면 컴퓨터는 0다음의 위치가 100이 되지만 사실 자연에서는 100이 아닌 1 또는 0.1 또는 0.01... 과 같이 연속적인 계산이 되어야 합니다. 컴퓨터는 그러지 못한다는 점에 있죠. 그래서 유사하게 어느 거리 이하이거나 어느 속도 이상이면 시뮬레이션상에서 오차가 일어날 수 밖에 없고 여기서도 그러한 일이 발생할 수 밖에 없습니다. 만약 시뮬레이션을 정교하게 만들겠다면 계산 한번을 더 작은 시간이라고 가정해 주면 그나마 상황은 나아집니다.


따라서 인력실험에서 실제 자연계와 유사한 시뮬레이션을 한다면 일정 거리 이하에서는 충돌이 되어 서로 운동량이 변화시키던지, 붙어버리게 한다던지의 조건을 넣어주어야 합니다.



스크립트 확인하기:


https://scratch.mit.edu/projects/185832090/


댓글