파이썬으로 지구과학 시험문제 내기

힘센캥거루
2025년 11월 5일(수정됨)
4
119

1. 2025학년도 9월 지구과학1 20번 문제

올해 9월에 지구과학 모의고사를 풀다가 골깨지는 문제가 하나 있었다.

20번 외계 행성계 탐사 문제였는데 아무리 봐도 주기가 없다.

파이썬으로 지구과학 시험문제 내기-1

결국 해결하지 못하고 EBS 강의를 보는 굴욕을 치뤘다.

해답은 그래프의 주기.

그래프에서 주기가 t1 ~ t4 까지이니, 시선속도가 -30~+30m/s인 지점에서 전체 주기의 1/3을 회전한 것.

따라서 t1 ~ t2에서 회전각은 120도이므로 시선속도가 +30인 지점에서 시선방향-공전중심-중심별의 사이는 60도가 된다.

말하면서도 이게 뭔가 싶어서 그림으로 표현해 보았다.

파이썬으로 지구과학 시험문제 내기-2

그럼 t2 지점에서의 시선 속도를 구해보면 아래와 같다.

파이썬으로 지구과학 시험문제 내기-3

여기서 Vr = V * cos30º 이고 Vr = 30 m/s 이므로, V = Vr / cos30º 이다.

그래서 ㄷ이 맞다는 충격적인 결론이다.

파이썬으로 지구과학 시험문제 내기-4

이걸 어케 1분만에 푸냐...

이건 가우스가 환생해서 와도 1분 안에는 못 풀것 같다.

어쨌든 이 문제를 2학년 아이들에게 풀이하는 방법을 모두 알려주고 똑같은 문제를 수행평가로 내기로 했다.

물론, 풀이를 하면서 이 문제가 수행평가일 것이라고는 말해주지 않았다.

2. 수행평가를 치다.

지구과학1 수업반이 모두 월요일에 몰려 있어서 월요일에 시험을 치기로 했다.

그런데...?

파이썬으로 지구과학 시험문제 내기-5

반에 들어갔더니 애들의 절반이 없었다.

문제가 어렵다는 소문이 났고, 수행평가를 준비하지 못했던 학생들이 병조퇴를 한 것.

진짜 아팠던 아이들도 있지만 이대로 똑같은 시험지로 시험을 칠 순 없었다.

정직하게 시험을 친 학생들이 기존의 문제를 그대로 한다면 평가의 형평성에 문제가 있지 않냐는 이의를 제기했다.

그래서 파이썬으로 그래프를 그리게 되었다.

3. 파이썬으로 수행평가 내기

문제의 유형은 같게 하고 값이나 주기 자체를 변경시키기로 했다.

그리고 계속 값을 변경시키고 확인하기 쉽도록 주피터 환경에서 진행했다.

먼저 모듈을 호출하고 한글이 깨지는걸 막기 위해 폰트 설정부터 해준다.

from matplotlib import pyplot as plt
import matplotlib
import numpy as np
from numpy import pi
matplotlib.rcParams["font.family"] = "batang"

matplotlib.rcParams["font.size"] = 13
plt.rcParams['axes.unicode_minus'] = False

그리고 그래프의 x값의 범위와 최대 속력을 정해준다.

xStart = -pi
xEnd = 3*pi
maxV = 20*(3**0.5)

x = np.arange(xStart, xEnd, 0.1)
y = np.sin(x)*maxV

파이 값은 numpy 의 pi를 호출하면 간편하게 사용할 수 있다.

그리고 이미지 크기를 적절하게 설정한 다음 실행 코드를 누르면 아래와 같은 그림을 얻는다.

plt.figure(figsize=(7,3))
plt.plot(x,y, color="black")
파이썬으로 지구과학 시험문제 내기-6

아직 뭔가 많이 부족하다.

이제 이 그림에서 필요한 부분을 잘라내고 각 축을 설정해보자.

xthicks와 ythicks로 축값을 변경하고 xlim, ylim으로 그래프를 적절하게 잘라준다.

그리고 그리드를 그려주면 그럴듯한 그림이 생긴다.

plt.xticks(np.arange(xStart, xEnd, 2*pi/3),[f"t{x}" for x in range(6)])
plt.yticks([-45,  -30, -15, 0, 15, 30, 45])
plt.xlim(xStart+2*pi/3, xEnd-pi*2/3)
plt.ylim(-45,45)
plt.grid(linestyle='--')
파이썬으로 지구과학 시험문제 내기-7

마지막으로 scatter로 내가 원하는 값을 하나 찍고 축의 이름을 설정한다.

z = np.arcsin(-(3**0.5)/2)
plt.scatter(z+2*pi,np.sin(z)*maxV, color="black")
plt.xlabel("시간 →", loc="right")
plt.ylabel("시선속도(m/s)")
파이썬으로 지구과학 시험문제 내기-8

이제 여기서 함수의 주기를 바꿔주거나, 최댓값과 최솟값을 바꾸면 문제 변형이 가능하다.

4. 응용하기

이번 2차 지필에서는 아래의 문제에서 오른쪽 그래프의 시선속도 값을 뒤집고 최댓값을 30으로 변경하고 싶었다.

그래서 위의 방식으로 코드를 만들어 보았다.

파이썬으로 지구과학 시험문제 내기-9
from matplotlib import pyplot as plt
import matplotlib
import numpy as np
from numpy import pi
# matplotlib.rcParams["font.family"] = "AppleGothic"
matplotlib.rcParams["font.family"] = "batang"

matplotlib.rcParams["font.size"] = 13
plt.rcParams['axes.unicode_minus'] = False
xStart = 0
xEnd = 4*pi
maxV = 30

x = np.arange(xStart, xEnd, 0.1)
y = np.sin(x)*30
plt.figure(figsize=(2,2))
plt.plot(x,y, color="black")
plt.xticks([])
plt.yticks([-30, 0, 30], ["-30", 0 ,"+30"])
# plt.grid(linestyle="--")
plt.xlim([0, 2*pi])
plt.xlabel("시간 →", loc="right")
plt.plot([0, pi/2],[30, 30], color="black", linestyle="--",linewidth=0.5)
plt.plot([0, pi*3/2],[-30, -30], color="black", linestyle="--",linewidth=0.5)
plt.plot([0, pi*3],[0, 0], color="black", linewidth=0.5)
ylabel = plt.ylabel("시\n선\n속\n도\n(m/s)", rotation=0, labelpad=18)
ylabel.set_position((0,0.3))

처음에는 중간에 점선을 어떻게 표현할지 살짝 생각했데, 그냥 직선으로 그리면 끝나는 문제였다.

결과물은 상당히 만족스러웠다.

파이썬으로 지구과학 시험문제 내기-10

5. 후기

시험문제의 완성도도 올라가고, 코딩 공부도 함께할 수 있는 시간이었다.

앞으로도 많이 응용할 예정이다.

관련 글

학교 업무 자동화 - AI를 이용한 생활기록부 점검 과목별 세부능력 특기사항편
학교 업무 자동화 - AI를 이용한 생활기록부 점검 과목별 세부능력 특기사항편
학교에서 가장 의미없고 힘들며 지루한 업무를 하나 뽑으라고 하면 나는 생기부 점검을 뽑을 것이다.중학교에서는 생활기록부가 그리 중요치 않지만 고등학교에서는 입시와 관련되어 있기 때문에 무척 중요하다.문제는 이런 생기부 점검에서 찾는 것이 고작 단순 오탈자, 기재 금지용...
밑바닥부터 만들면서 배우는 LLM 7장 독서 후기 및 챌린지 후기
밑바닥부터 만들면서 배우는 LLM 7장 독서 후기 및 챌린지 후기
7장 내용은 지시를 따르도록 미세 튜닝하는 과정이다.어떤 질문에 대해 기대하는 응답을 하도록 하는 것.역시나 필요한 것은 데이터이다.1. 지시 미세 튜닝 절차여기서의 핵심은 질문-응답 데이터 셋을 준비하여 입력-출력 쌍으로 훈련시키는 것.이걸 프롬프트 스타일이라고 한다...
밑바닥부터 만들면서 배우는 LLM 6장 독서 후기
밑바닥부터 만들면서 배우는 LLM 6장 독서 후기
6장은 분류를 위한 미세 튜닝하기이다.예제로 나오는 것은 스팸 분류기 만들기.스팸 분류기는 이것이 스팸인지, 스펨이 아닌지를 분류하는 것이므로 출력의 결과가 0, 1과 같은 값으로 나와야 한다.1. 미세튜닝의 순서미세 튜닝의 과정은 모델을 훈련시키는 과정과 비슷하다.데...
밑바닥부터 만들면서 배우는 LLM 5장 독서 후기
밑바닥부터 만들면서 배우는 LLM 5장 독서 후기
오늘은 12월 14일이다.사실 챌린지 기간은 이미 2주나 지나 버렸지만, 그렇다고 후기를 포기할 순 없었다.이렇게 남기는 TIL이 나중에 피와 살이 되기 때문.코드 자체보다는 의미에 집중해서 적어보려고 한다.1. 모델의 손실 계산GPT 모델을 만든 후에 어떤 방식으로 ...
밑바닥부터 만들면서 배우는 LLM 4장 독서 후기
밑바닥부터 만들면서 배우는 LLM 4장 독서 후기
오늘이 11월 26일이니, 매일 1장식 독파하면 챌린지 성공이다.첫째와 둘째의 방해 속에서 가능할지 모르겠다.1. 더미 트랜스포머GPT 모델을 만들면서 파이토치에서 트랜스포머 더미 블록을 가져오는 것을 봤다.찾아보니 pytorch의 nn 안에는 이미 여러 트랜스포머 모...
밑바닥부터 만들면서 배우는 LLM 3장 독서 후기
밑바닥부터 만들면서 배우는 LLM 3장 독서 후기
맥북에 물을 한바가지 쏟은 후, 멘붕이 와서 3~4일 정도를 허비했다.지금 생각해보니 그냥 어차피 맥북은 나간거고, 수리 맡긴다고 생각하고 뭐라도 할걸 그랬나 싶다.어쨌든 조금 늦었지만, 그래도 끝까지 달려봐야 한다는 생각에 3장 후기를 남긴다.1. 어텐션 메커니즘3장...

댓글을 불러오는 중...