본문 바로가기

카테고리 없음

2021 중등실험연수(2)

 

 

Contents

 

 

 Wolfram Language를 활용한 실험 설계 및 분석

김 용 실(금산고등학교)

 

 Wolfram Mathematica

  Wolfram Language 소개 

 

 

Wlofram Language

 

  Wolfram Language는 이론물리학자이자 수학자인 Stephen Wolfram이 고안한 심볼릭(symbolic) 계산에 특화된 매스매티카(Mathematica)라는 프로그램에 특화된 프로그래밍 언어입니다. 아래 그림은 WolframAlpha  Wolfram Cloud 서비스를 나타낸 것입니다.

 

Wlofram Alpha



학교 현장에서도 이를 손쉽게 무료로 이용할 수 있습니다.

 

 

  Wolfram Language의 기본적인 문법은

 

 

1) Wolfram 홈페이지 제공 강의 및 강의자료:
https://www.wolfram.com/language/fast-introduction-for-programmers/ko/?source=footer



2) 매스매티카입문(YouTube 강의):
https://www.youtube.com/watch?v=L3jFhWxGEgw&list=PLU53e7oUT8pEbDM9pq_KiIjWwH0Y_-h4W

 

에서 공부할 수 있습니다.

 

 

간단한 Code를 예로  Wolfram Language의 기본 문법을 설명하면 다음과 같습니다.

 

Sin[x]라는 함수를 x=0에서 x=5.5Pi까지 그려라.

 

 

\[\mathrm{Plot[Sin[x],\{x,0,5.5Pi\}]}\]

 

 

  Wolfram Alpha 활용 예시 

 

  2009515일에 출시된 WolframAlpha(wolframalpha.com/)는 간단한 연산 수행 및 그래픽 결과 등 WEB 상의 지식을 재구성하여 제공하는 검색 엔진입니다.

 

 

 

 

 

  위 그림처럼 WolframAlpha 검색창에 play sin(2pi 440 t)를 입력하고 엔터를 치면, 그 결과로 Waveform 옆에 Play Sound 라는 탭이 생성됩니다. 그 버튼을 누르면 스피커를 통해 440Hz의 소리가 발생합니다. 이를 이용하면, 가청 영역에 해당하는 음역대를 알아보는 활동도 가능하고, 맥놀이(beat) 현상도 쉽게 설명할 수 있습니다.

 

 

 

 

  위 그림은 lung을 입력하고 엔터를 쳤을 때 나오는 결과입니다. 이외에도 ethanol이나 solar eclipse 입력하면, 에탄올과 일식에 대한 정보가 나오는 것을 확인할 수 있습니다.

 

 

* Wolfram Cloud(wolframcloud.com/)는 강의 말미에 안내하겠습니다.

 

 

 

 

 

 

  등가속도 직선 운동 실험(ticker timer experiment) 및 코드 설명 

  등가속도 직선 운동 실험은 물리 학습의 위계를 고려할 때, 첫 단추에 해당하며, 질량이 $m$인 계가 알짜힘 $\vec{F}$를 받을 때 가속도 $\vec{a}$로 운동함을 설명하는 뉴턴 운동 제 2법칙 $\vec{F}=m\vec{a}$를 학습하는데 있어 가장 간단한 실험 상황으로 교육적으로 매우 중요한 의미를 갖습니다.

 

 

 

 

  시간기록계(ticker timer)를 이용한 실험은 등가속도 직선 운동 학습을 위한 고전적인 실험으로 타점 기록 테이프(carbon paper)에 찍힌 타점이 물체의 시간에 따른 변위 정보를 직접적으로 주는 등 실험 장치 구성 및 원리가 명료한 아주 훌륭한 실험입니다. 그러나 등가속도 직선 운동은 매우 이상적인 특수한 상황으로 마찰이나 공기 저항 및 물체와 빗면 등의 주변 물체와 상호작용이 물체의 운동에 미치는 영향 때문에 학교 현장의 수업시간에 이뤄지는 실험에서 이를 온전히 구현하는 것과 그에 따른 결과를 얻는 것은 불가능합니다. 또한 실험 시간이 매우 짧기 때문에 측정 범위 역시 짧습니다. 이에 다수의 학생들이 실험 결과를 분석하는데 있어 어려움이 있으며, 교사도 마찬가지로 평가에 있어 불편함을 겪게 됩니다.

 

  이러한 문제점은 컴퓨터 시뮬레이션을 통해 해결할 수 있습니다. 초기 위치, 초기 속도, 가속도가 각각 x0, v0, a인 등가속도 직선 운동하는 물체의 시간 t에 따른 위치 X(t)를 나타내는 수식은 Wolfram Language

 

X[t_]:= x0 + v0 t + (1/2)a t^2

 

입니다. 여기에 추가로 x=X[t] 를 입력한 후, Shift + Enter를 누르면 Out[  ]창에 아래 그림과 같이 출력되는 것을 확인할 수 있습니다.

 

 

  임의의 시간에 따른 속도 V[t]X[t]의 시간에 대한 미분으로 다음과 같습니다.

 

V[t_]:=D[X[t],t]

여기서 D[X[t],t]X[t]t로 미분하라는 의미를 갖습니다.

 

 

이를 그래프로 그리기 위해 초기 조건인 x0 = 1; v0 = 3; a = 2;를 입력하고, Plot[x,{t,0,5}]를 입력한 후 Shift + Enter를 누르면 Out[  ]창에 아래 그림과 같이 출력되는 것을 확인할 수 있습니다.

 

x0 = 1; v0 = 3; a = 2;
Plot[x,{t,0,5}]

 

 

여기서 Plot[x,{t,0,5}] x 0 < t < 5 의 범위에 대해 그리라는 코드입니다.

 

 

여기에 v=V[t]를 함께 그리려면, 다음과 같이 입력하면 됩니다.

 

Plot[{x,v},{t,0,5}]

 

위 그래프를 이미지 파일로 추출할 수 있습니다. Export[“위치\\파일명.확장자”,그래프] 형태의 코드로 예를 들어 E:드라이브의 J라는 폴더에 vtgraph.png라는 확장자를 포함한 파일명으로 추출하기 위해

 

 temp=Plot[{x,v},{t,0,5}];
Export["E:\\J\\vtgraph.PNG",temp]

 

를 입력한 후 Shift + Enter를 누르면 Out[  ]창에 다음 그림과 같이 출력되는 것을 확인할 수 있습니다.

 

 

 

여기서 temp는 그래프에 붙인 임의의 이름입니다.

 

 

 

Table이라는 함수를 활용하면, 특정 시간 간격에 따른 위치를 구할 수도 있습니다. 다음과 같이

data=Table[{t,X[t]},{t,0,5,1}]
graph=ListPlot[data, PlotLabel->"시간에 따른 위치 데이터", Frame->True, FrameLabel->{"t","X[t]"},ImageSize->320]

 

를 입력한 후 Shift + Enter를 누르면 Out[  ]창에 다음 그림과 같이 출력되는 것을 확인할 수 있습니다.

 

 

여기서 Table은 예를 들어 Table[i^2,{i,0,5}]{0, 1, 4, 9, 16, 25}에 해당하는 리스트를 줍니다. ListPlot은 리스트를 그리는 함수이고, 나머지는 옵션입니다.

 

이제 시간기록계의 종이테이프를 만들고자 합니다. 우선 직사각형과 타점에 해당하는 점이 필요합니다. 직사각형을 그리는 것은 Plot이 아닌 Graphics라는 함수를 사용합니다. 직사각형에 대한 함수는 왼쪽 아래와 오른쪽 위의 좌표가 각각 (0,0), (2,3)인 직사각형에 대해 다음과 같이 표현합니다.

 

Graphics[Rectangle[{0,0},{2,3}]]

그런데 그 결과가 속이 검정색으로 채워진 직사각형이기에 테두리만 남기고 내부를 흰색으로 바꿀 필요가 있습니다. 이를 위한 옵션에 해당하는 코드를 포함하면 다음과 같습니다.

 

Graphics[{FaceForm[],EdgeForm[Blue],Rectangle[{0,0},{2,3}]}]

 

이를 입력한 후 Shift + Enter를 누르면 Out[  ]창에 다음 그림과 같이 출력되는 것을 확인할 수 있습니다.

 

 

시간기록계 테이프에 찍힐 타점은 Point라는 함수를 사용합니다. 예를 들어 xy평면 상의 좌표 (0,0), (1,1), (2,3)에 각각 점을 찍으려면, 코드는 직사각형과 마찬가지로 Graphics를 이용하여 다음과 같습니다.

 

Graphics[{Point[{{0,0},{1,1},{2,3}}]}]

 

이를 입력한 후 Shift + Enter를 누르면 Out[  ]창에 다음 그림과 같이 출력되는 것을 확인할 수 있습니다.

 

이상의 내용을 종합, 응용하면 아래와 같은 코드로부터 타점기록지(Ticker timer band)를 만들 수 있습니다.

 

f = 60; (* 1초당 타격 횟수 *) 
degree = 30; (* 빗면 각도*) 
\[Theta] = \[Pi]/(180/degree); (* 빗면 각도*) 
x0 = 0; (*초기 위치*) 
v0 = 0; (*초속도*) 
g = 10; (*중력가속도*) 
a = N[g Sin[\[Theta]]]; 
X[t_] := x0 + v0*t + 1/2 a*t^2 (*등가속도 직선운동 공식*) 
ti = 0; 
tf = 1;  
(*tickertimerband as ttb*) 
ttb0 = Show[ 
  Graphics[{FaceForm[Directive[Blue, Opacity[0.15]]],  
    EdgeForm[Directive[Thick, Blue]],  
    Rectangle[{X[ti], -.05}, {X[tf] - X[ti], .05}], PointSize[.003],  
    Point[Table[{X[i] - X[ti], 0}, {i, ti, tf, f^-1}]]},  
   Frame -> True,  
   FrameTicks -> {{None, None}, {Range[0, X[tf], .1],  
      Table[X[t], {t, ti, tf, .1}]}}], ImageSize -> 1280]

 

 

 

  분석 활동 및 평가 

다음은 등가속도 직선 운동하는 물체의 시간기록계(ticker timer)의 종이테이프(carbon paper)에 찍힌 타점 분석 활동 및 평가 문항 개발을 위한 코드입니다. 다양한 옵션 및 문법이 포함되어 있습니다. 특히 For loop 문법은 컴퓨터 용량 한도에서 강력한 반복 계산을 수행합니다.

 

(*문항 제작용*) 
f = 6;(*1초당 타격 횟수*) 
n = 6;(*단위 간격당 타점 개수*) 
\[CapitalDelta] = n f^-1;(*단위 간격당 시간*) 
 a = 2;(*가속도*) 
 v0 = 3;(*초속도*) 
 ti = 0;(*초기시각*) 
 tf = 6;(*최종시각*) 
  
 (*등가속도 직선운동 공식*) 
X[t_] := v0*t + 1/2 a*t^2 
V[t_] := v0 + a*t 

(*tickertimerband as ttb*) 
ttb0 = Show[ 
  Graphics[{FaceForm[Directive[Blue, Opacity[0.15]]],  
    EdgeForm[Directive[Thick, Blue]],  
    Rectangle[{X[ti], -.5}, {X[tf] - X[0], .5}], PointSize[.003],  
    Point[Table[{X[i] - X[0], 0}, {i, ti, tf, f^-1}]]}, Frame -> True, 
    FrameTicks -> {{None,  
      None}, {Table[X[t], {t, ti, tf, \[CapitalDelta]}],  
      Range[0, X[tf]]}}], ImageSize -> 1280] 
data1 = Table[{t, X[t]}, {t, ti, tf, \[CapitalDelta]}]; 
table1 = Grid[Transpose[data1], Frame -> All] 
graph1 = ListPlot[data1,  
  PlotRange -> {{0, tf + \[CapitalDelta]}, {0, X[tf]}},  
  PlotLabel -> "시간에 따른 위치 데이터", Frame -> True,  
  FrameLabel -> {"t", "X[t]"}, ImageSize -> 1280/tf] 

t[i_] := \[CapitalDelta] (i - 1)(*시간 간격 함수*) 
m = (tf - ti)/\[CapitalDelta];(*띠지 개수*)(*For loop*)ttb =  
 ConstantArray[0, m]; 
For[i = 1, i <= m, i++,  
  ttb[[i]] =  
   Graphics[{FaceForm[Directive[Blue, Opacity[0.15]]],  
     EdgeForm[Directive[Thick, Blue]],  
     Rectangle[{-.5 + i, 0}, {.5 + i, X[t[i + 1]] - X[t[i]]}],  
     PointSize[.02],  
     Point[Table[{i, X[j] - X[t[i]]}, {j, t[i], t[i + 1], f^-1}]]}]]; 
ttb1 = Show[ttb, ImageSize -> 1280/tf, Frame -> True,  
  FrameTicks -> {{All, All}, {Range[m], None}}] 

time = Range[0, tf]; 
f = (Length[time] - 1); 
t2 = Table[ 
   N[(Range[0, tf, \[CapitalDelta]][[i + 1]] +  
       Range[0, tf, \[CapitalDelta]][[i]])/2], {i, 1,  
    f/\[CapitalDelta]}]; 
data2 = Table[{t2[[i]], V[t2[[i]]]}, {i, 1, f/\[CapitalDelta]}]; 
table2 = Grid[Transpose[data2], Frame -> All] 
graph2 = ListPlot[data2,  
  PlotRange -> {{0, tf + \[CapitalDelta]}, {0, V[tf]}},  
  PlotLabel -> "시간에 따른 속력 데이터", Frame -> True,  
  FrameLabel -> {"t", "V[t]"}, ImageSize -> 1280/tf]

 

위 내용을 복사해서 Wolfram Cloud에 붙여 넣으면, \[CapitalDelta]Δ로 바뀌는 것을 확인할 수 있습니다. Jupyter notebook에서 실행한 결과는 생략합니다. 위 코드가 Wolfram Language에 관심 있는 선생님들의 스터디 초창기에 활용되길 바랍니다.

 

 

  평가 활용 및 제언 

 

아래 자료는 Wolfram Language를 활용한 등가속도 직선 운동과 관련한 수행평가 문항지입니다. 약간의 코드 수정을 통해 학급별 혹은 개인별로 다른 실험 결과를 줄 수 있고, 이를 분석하는 활동을 수행하도록 안내할 수 있습니다.

 

2020통합과학수행평가class1.pdf
1.23MB

 

Wolfram Language는 여러 프로그래밍 언어 중 매우 직관적이고, 강력한 심볼릭(symbolic) 계산 및 시각화(Visualization) 능력을 갖고 있습니다. 그래서 작은 노력으로도 큰 성취를 가능하게 해주는 좋은 언어라고 생각합니다. 교육 현장에서 보다 널리, 다양하게 활용되면 좋을 것 같습니다.

 

더운 여름 중에 고생 많으셨습니다. 감사합니다. 건강하세요.

 

 


* 등가속도직선운동에 대한 타점시간기록계 실험의 Jupyter notebook 파일입니다.

TickerTimerBand.ipynb
0.07MB

 

little_prince