GPT 수포자 만들기
ChatGPT에게 1월, 2월에 걸쳐 수학을 물어보았다.
https://brunch.co.kr/@soori/273
https://brunch.co.kr/@soori/274
한 달 사이에 GPT는 높은 학습능력을 보여주었으며 전형적인 문제를 GPT에 물어보는 것은 별 의미가 없다는 것을 깨달았다. 그래서, 수학 수업 때 고심해서 만들었던 평가 자료를 가지고 왔다. 약간은 진검승부의 마음으로... 과연 GPT는 학생들이 어려워하는 응용문제를 잘 이해하고 해결할 수 있을까?
(1) 초기 속도 v_0를 구하는 과정을 서술하시오.
(2) 시간 t에 따른 속도 v를 구하는 과정을 서술하시오.
(3) 시간 t에 따른 새의 위치 P를 구하는 과정을 서술하시오.
(4) 새가 A에 의치한 돼지를 맞춘다면 새를 쏘아 올린 후 몇 초만에 맞추는지 구하는 과정을 서술하시오.
(5) 새가 돼지를 맞추는 순간의 새의 속도와 속력을 구하는 과정을 서술하시오.
한눈에 보아도 쉽지 않은데 (1) 번부터 차례로 풀면 의외로 쉽게(?) (5) 번까지 답할 수 있다. 한국의 고등학교 미적분 교육과정에 준하는데 (1) 번의 문제는 사실 벡터에 대한 내용으로 교육과정에서 벗어난다. 따라서 한국에서 v_0의 벡터를 처음부터 주고 시작하지만 작년에 AP Calculus를 가르쳤던 관계로 학생들에게 이 정도 난의도의 평가 문항을 제시할 수 있었다. 물론 제대로 이해하고 푸는 학생은 손에 꼽는다. 왜냐면 한국의 미적분은 미분에서 속도와 가속도, 적분에서 속도와 위치를 다른 단원에서 다루게 되므로 가속도-속도-위치를 다소 다르게 생각한다. 물리 2에서 해당 내용이 그대로 나오는데 그때 미적분에서 다루는 내용과 연계에서 생각하는 학생은 그리 많지 않다.
아무튼 쓸데없는 이야기는 물리고, 우리의 GPT에게 상냥하게 물어보자.
(GPT) 주어진 초기속도 v_0를 구하기 위해 다음과 같은 단계를 거칩니다.
1. 초기 속도의 x, y 성분 구하기
초기 속도의 크기 abs(v_0)와 지면과 이루는 각도 pi/6이 주어졌으므로, 초기 속도의 x, y 성분은 다음과 같이 구할 수 있습니다.
v_0x = abs(v_0) * cos(pi/6) = 6 * sqrt(3) / 2 = 3 * sqrt(3)
v_0y = abs(v_0) * sin(pi/6) = 6 / 2 = 3
따라서 초기 속도는 v_0 = (3 * sqrt(3), 3)입니다.
2. 새의 운동 방정식 구하기
새의 위치는 중력 가속도를 고려한 자유낙하 운동을 따르므로, 다음과 같은 운동 방정식을 만족합니다.
x(t) = v_0x * t
y(t) = v_0y * t - (1/2) * g * t^2
여기서 g는 중력가속도이며, x(t), y(t)는 시간 t에 따른 새의 위치입니다.
3. 초기 속도 구하기
주어진 초기 위치 P_0 = (0, 6)과 앵그리버드 게임에서의 가로축 방향은 오른쪽, 세로축 방향은 위쪽이므로, 새가 처음으로 땅에 닿는 순간의 y(t) 값은 0이 됩니다. 이를 이용하여 초기 속도를 구할 수 있습니다.
0 = v_0y * t - (1/2) * g * t^2 t = 2 * v_0y / g
x(t) = v_0x * t = 3 * sqrt(3) * (2 * v_0y / g) = 6 * sqrt(3) * v_0y / g
여기서 x(t) = 16이므로,
6 * sqrt(3) * v_0y / g = 16 v_0y = 8 * sqrt(3) / 3
따라서 초기 속도는 v_0 = (3 * sqrt(3), 8 * sqrt(3) / 3)입니다.
GPT는 의외로 긴 문제를 모두 이해하고 문제를 풀이하고 있었다. 그런데 황당하게도 총 3가지 답안을 내놓았는데 이 중 1번 답안이 맞는 것이고 2번은 문항 (3)을 미리 답한 것이며 3번은 앵그리버드가 땅에 떨어지는 순간의 속도를 구한 것이었다. 수학에서 땅에 떨어지는 순간의 속도를 구하는 문제는 자주 나오는 편이라 그런 것 같은데 앵그리버드는 곧 돼지와 부딪칠 운명이므로 그 궤도도 수정된다. 나는 GPT가 어느 것이 앵그리버드의 초기 속도로 인식하는지 궁금했다.
(GPT) 위의 1, 2, 3 중에서는 3번이 v_0입니다. 3번에서 속도 벡터 v_0의 크기는 6이고, 지면과 이루는 각도는 pi/6으로 주어져 있습니다.
(GPT) 네, 맞습니다. 3번에서는 새가 처음으로 땅에 닿을 때의 속도를 구한 것입니다. 초기속도 v_0를 구하기 위해서는 1번과 2번에서 구한 정보를 이용하여 다음과 같은 방정식을 푸는 것이 필요합니다:
y(t) = 0 (처음으로 땅에 닿을 때) abs(v(t)) = 6 (속도 크기가 6인 경우)
위의 방정식에서 t 값은 2번에서 구한 새가 처음으로 땅에 닿는 시간입니다.
(GPT) 초기 속도를 구하기 위해서는 다음과 같은 과정을 거칩니다.
새가 땅에 닿는 순간을 구합니다. 이 순간에는 새의 y좌표가 0이 됩니다.
새가 땅에 닿는 순간의 x좌표와 속도 벡터의 방향을 구합니다.
초기 속도의 크기는 6이므로, 구한 속도 벡터에 크기가 6인 상수를 곱해줍니다.
1번에서 새가 땅에 닿는 순간을 구하면 다음과 같습니다.
새의 수직 운동에 대한 방정식 h(t) = -1/2gt^2 + v_0 sin(pi/6) = 0을 풀면 t = sqrt(3)/2.
따라서, 새가 땅에 닿는 순간의 x좌표는 x = v_0 cos(pi/6) * t = 3v_0/4이고, y좌표는 0이 됩니다.
또한, 새의 속도 벡터의 방향은 지면과 pi/6의 각을 이루기 때문에, x축과 pi/6의 각도를 이루는 방향입니다. 따라서, 속도 벡터는 (v_0 cos(pi/6), v_0 sin(pi/6))입니다.
따라서 초기 속도의 크기는 6이므로, 초기 속도 벡터는 (6cos(pi/6), 6sin(pi/6)) = (3sqrt(3), 3)입니다.
돌아 돌아 겨우 GPT에게 답을 유도했다. 이제 (2) 번 문제로 넘어갔다.
(GPT) 앵그리버드의 초기 속도를 구했으므로, 이를 이용하여 시간 t에 따른 앵그리버드의 속도 v(t)를 구할 수 있습니다.
가속도는 중력가속도로 (0, -1)이므로, 시간 t에 따른 앵그리버드의 속도 벡터 v(t)는 다음과 같습니다.
v(t) = v_0 + (-t, -t)
여기서, v_0은 초기 속도 벡터이며, (-t, -t)는 중력가속도에 의한 속도 변화량입니다. 따라서, 시간 t에 따른 앵그리버드의 속도 v(t)는 다음과 같습니다.
v(t) = (3sqrt(3), -t - 1)
딱총 위치를 원점으로 설정하였으므로, 앵그리버드의 위치 P(x(t), y(t))는 속도 벡터 v(t)의 적분으로 구할 수 있습니다. 하지만 이 적분은 복잡하므로, 여기서는 구하지 않겠습니다.
사실 가속도-속도-위치는 서로 적분 관계라서 가속도를 적분한 후 적분상수에 초기 속도를 넣으면 바로 속도 벡터가 나올 텐데, 별로 복잡할 것도 없는 문제를 뭐가 복잡하다는 것인지 모르겠다. 그리고 위에서 이미 위치 P를 구했는데 속도 v를 구하지 못하는 이유가 무엇일까? 생각해 보니 GPT는 이 문제를 미적분으로 보기보다는 공식으로 풀었던 것 같다. 가속도와 초기 속도에 따른 위치 벡터를 구하는 공식은 이미 나와있으니까.
별로 좋은 학습 태도는 아니지만, 나는 마음이 관대하므로 그냥 넘어가기로 했다. (3) 번의 위치 P를 구하는 문제는 이미 풀었으므로 바로 (4) 번 문제로 넘어가기로 했다.
(GPT) 앵그리버드의 위치를 P(t)라고 하면, P(t)가 (3sqrt(3), 4)와 일치하는 시간을 구하면 됩니다.
P(t)와 (3sqrt(3), 4) 간의 거리를 구한 후, 거리가 0이 되는 t 값을 구하면 됩니다.
거리를 구하는 공식은 다음과 같습니다.
d(t) = sqrt((x(t) - 3sqrt(3))^2 + (y(t) - 4)^2)
여기서 x(t)와 y(t)는 위에서 구한 앵그리버드의 위치 벡터입니다. (블라블라~)
갑자기 GPT가 삽질을 시작하는데 황당하게도 그전에 구했던 위치 벡터에 대한 식을 까먹은 것 같았다. 게다가 파이썬 코드까지 화려하게 짰는데 그게 다 견설이라서... 하지만 나는 인내심이 무척 깊은 교사가 아니던가. 인내심을 가지고 GPT가 까먹은 위치 벡터를 상기시켜 주었다.
(GPT) 앵그리버드가 t초 후 위치는 P(t) = (x(t), y(t))가 된다고 할 수 있습니다. 초기 위치 P_0 = (0, 6)이며, 초기 속도 v_0가 지면과 양의 방향으로 이루는 각도는 pi/6이고 |v_0|=6이므로, 다음과 같이 앵그리버드의 운동 방정식을 구할 수 있습니다.
x(t) = v_0 * cos(pi/6) * t = 3t y(t) = v_0 * sin(pi/6) * t - (1/2) * g * t^2 = 3sqrt(3)t - (1/2)t^2
여기서 g는 중력가속도이며, g = 9.8 m/s^2로 가정합니다.
따라서 앵그리버드가 t초 후 위치하는 좌표는 P(t) = (3t, 3sqrt(3)t - (1/2)t^2)가 됩니다.
맞는데 초기 위치 (0, 6)을 빼먹었다.
(GPT) 맞습니다. 초기 y좌표가 6이므로 위치 벡터를 구할 때 y(t)에 6을 더해주어야 합니다. 즉, 위치 벡터는 P(t) = (x(t), y(t) + 6)가 됩니다. 이를 고려하여 다시 계산하면 다음과 같습니다.
가속도 벡터는 그대로 (0, -1)이며, 초기 속도 벡터는 v_0 = 6(cos(pi/6), sin(pi/6)) = (3sqrt(3), 3)입니다. 따라서, t초 후의 위치 벡터는 다음과 같습니다.
P(t) = P_0 + v_0 t + (1/2)at^2 = (0, 6) + (3sqrt(3)t, 3t) + (0, -1/2 t^2) = (3sqrt(3)t, 3t + 6 - (1/2)t^2)
따라서, 앵그리버드는 t = 2초 후에 위치 (3sqrt(3), 12)에 있습니다.
음... 원래 구한 P의 y성분에 6만 더하는 건 맞는데 갑자기 중력 가속도 벡터를 (0, -1)로 고치고 이상한 삽질을 하고 있었다. 포기하고 돼지를 맞출 때의 시각을 상기시켜 주었는데 갑자기 돼지와 앵그리버드의 충돌반경을 구하고 있어서, 크기를 무시한다는 조건을 상기시켜 주었다.
(GPT) 이전 질문에서와 마찬가지로, 앵그리버드가 돼지를 맞출 때는 해당 지점과 도달 지점 사이를 이동하는 동안 중력의 영향으로 속도가 감소하게 됩니다. 따라서, 도달 지점의 좌표에서 출발한 앵그리버드의 운동방정식을 구하고, 이를 이용하여 도달 시간을 구할 수 있습니다.
앵그리버드의 초기 위치는 (0,6)이며, 초기 속도는 (v_0cos(pi/6), v_0sin(pi/6)) = (3, 3sqrt(3))입니다. 중력가속도는 (0, -1)이므로, 앵그리버드의 위치와 속도를 나타내는 벡터함수는 다음과 같습니다.
r(t) = (3t, 6 + 3sqrt(3)t - 0.5t^2) v(t) = (3, 3sqrt(3) - t)
이를 이용하여, (3sqrt(3), 4) 위치에 도달하는 시간을 구할 수 있습니다. 도달 지점에 도달한 후 속도는 다음과 같습니다.
v(d) = v(t) - (0, 1)*t = (3, 3sqrt(3) - t) - (0, t) = (3, 3sqrt(3) - t) - (0, 1)*t
따라서, (3sqrt(3), 4) 위치의 돼지를 맞추는 시간 t는 다음 방정식의 해입니다.
(3sqrt(3), 4) = (3t, 6 + 3sqrt(3)t - 0.5t^2) + (3, 3sqrt(3) - t - 1/2)t (3sqrt(3), 4) = (3t + 3t, 6 + 3sqrt(3)t - 0.5t^2 + 3sqrt(3) - t - 1/2)t (3sqrt(3), 4) = (6t + 3, 6 + 2.5t + 3sqrt(3) - 0.5t^2 - t)t 3sqrt(3) = 6t + 3 t = (3sqrt(3) - 3) / 6 t = (sqrt(3) - 1) / 2
따라서, 앵그리버드가 돼지를 맞추는 시간은 (sqrt(3) - 1) / 2 초입니다.
중력 가속도를 자꾸 까먹는 것 같아서 내가 정정해 주었다. 그런데 여기서 나도 실수를 했다. 일부러 계산 예쁘게 하라고 -10으로 주었는데 머리에 박힌 중력가속도 -9.8m/s를 알려준 것이다.
(GPT) r(t) = (x(t), y(t)) = (3sqrt(3), 4)
즉, x(t) = 6sqrt(3) t y(t) = 6t - (1/2)gt^2
여기서 g는 중력가속도이므로 g = 9.8 m/s^2 입니다.
따라서 y(t) = 6t - 4.9t^2 이 되고, 이를 3sqrt(3)로 나눈 값이 t가 됩니다.
즉, t = 3sqrt(3)/2s 입니다.
갑지가 앵그리버드의 위치 r(t) 벡터가 바뀌면서 황당한 식을 전개하고 있었다. 답답한 나는 그냥 처음에 GPT가 구했던 r(t)의 식을 상기시켜 주었다. 위치 벡터를 상기시켜 주고 거기서 가속도 부분만 고치면 된다고 말하고 싶었는데...
(GPT) ...
갑자기 무한 로딩과 함께 GPT가 퇴장했다. 그렇게 GPT는 돌아오지 않았다. 내가 잘못했어 돌아와. 그냥 저 식만 고치면 돼. 등등 다시 터미널에 열심히 뭔가 쳐보려 했지만 입력조차 되지 않았다. 뭔가 도망간 수포자를 본 느낌이었다...
그 뒤로 그 챗에서 GPT는 돌아오지 않았고 나는 다른 New Chat에서 GPT를 만나 다른 이야기를 했다. 이런 문제 말고도 물리 충돌 관성 문제와 굴절 문제, 강체에서 회전수 문제 등을 물어보았다. 충돌 관성 문제에서는 초기 각도, 무게, 속도 값만 주고 충돌 후 속도 값을 주는 것을 깜박했더니, 한참 각도를 계산하던 GPT가 갑자기 멘붕(?)하며 퇴장하는 모습을 보여주었다. 답이 없는 문제라 그럴 수 있을 것 같은데 생각해보면 굳이 수치적 답을 찾으려 하지 말고 관계식에서 결론을 내려도 충분했을 텐데 그렇게 펑 터질 일인가 싶다. 그 뒤로 GPT에게 문제를 줄 때는 문제가 완전한 문제인지 꼼꼼히 따지고 내주었던 것 같다.
일련의 테스트에서 느낀 것은 GPT는 자기주장이 강하지 않아서 사람이 지적을 하는 부분에 대해서 너무 간단하게 수용하고 자신의 답을 거기에 맞추어 가려고 한다는 것이다. 그리고 이미 내린 결론을 조금씩 까먹거나 연결시키지 못하기도 하며 잘못된 결론이나 가정에 의해 오류 비슷한 상황이 나면 돌연 퇴장한다. 질문자가 제대로 된 지식을 가지지 않은 상황에서 질문을 하게 된다면 GPT도 제대로 된 답을 내놓지 않거나 혹은 머리가 터져서 펑하는 결과를 보여주는 것이다. 결국 질문자의 지식도 중요하며 GPT에게 원하는 결과를 얻기 위해서는 질문자도 그만큼 지식의 폭이 넓고 깊어야 한다는 것을 의미하는 것 같다.
해당 문제와 풀이는 첨부 파일로 남긴다. 혹시 궁금하신 분들은 풀어보기 바란다. GPT가 문제를 (1) 번 밖에 풀지는 못했지만 3월에 만날 때에는 업그레이드해서 좀 더 나은 모습을 보여주기를 바란다. 나도 다른 문제를 준비해 봐야지.