用 Python 出地球科学考试题

힘센캥거루
2024년 12월 18일(수정됨)
95
python

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

今年 9 月做地球科学模拟考试的时候,有一道把人脑袋整炸的问题。

是第 20 题外星行星系探测题,不管怎么看都看不出周期。

用 Python 出地球科学考试题-1

最后还是没能解决,只好承受看 EBS 讲解的屈辱

答案是图像的周期。

从图像上看,周期是 t1 ~ t4,所以在视向速度为 -30~+30m/s 的位置,已经转过了整个周期的 1/3。

于是从 t1 ~ t2 的转角是 120 度,因此在视向速度为 +30 的位置上,视线方向-公转中心-中心恒星之间的夹角就是 60 度。

自己说着也觉得这是什么玩意儿,就画图来表示了一下。

用 Python 出地球科学考试题-2

那么来求一下 t2 位置的视向速度,如下图所示。

用 Python 出地球科学考试题-3

这里 Vr = V * cos30º,且 Vr = 30 m/s,因此 V = Vr / cos30º。

于是得出震撼的结论:选项 ㄷ 是对的。

用 Python 出地球科学考试题-4

这玩意儿怎么可能在 1 分钟内解出来...

就算高斯转世重生来了,估计也很难在 1 分钟内做出来。

总之,我把这道题的全部解题方法都教给了高二的孩子们,然后决定把几乎同样的题目作为过程性评价(平时考)来考。

当然,在讲解的时候,完全没透露这道题以后会变成过程性评价题。

2. 进行过程性评价

上《地球科学1》的所有班都集中在星期一上课,所以决定星期一进行测试。

结果...?

用 Python 出地球科学考试题-5

进教室一看,班里有一半的学生没来。

题目很难的风声传出去了,那些没准备过程性评价的学生就以身体不适提前离校了。

当然也有真的病得很严重的孩子,但无论如何,我不可能还用同一份试卷原封不动地考试。

老老实实参加考试的学生提出质疑:如果还是用原来的那道题,会不会有违评价的公平性。

于是就决定用 Python 来画图了。

3. 用 Python 出过程性评价题

题目类型保持不变,只是把数值或者周期本身改一改。

而且为了能不断改值、方便确认,在 Jupyter 环境下进行。

先调用模块,并进行字体设置,防止韩文乱码。

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")
用 Python 出地球科学考试题-6

现在还差很多。

接下来从这张图上裁出需要的部分,并设置各个坐标轴。

用 xticks 和 yticks 调整刻度值,用 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='--')
用 Python 出地球科学考试题-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)")
用 Python 出地球科学考试题-8

现在只要在这里改一下函数周期,或者修改最大值和最小值,就可以对题目进行变式了。

4. 应用

这次第二次期中卷里,我想把下面这道题中右边图像的视向速度反过来,并把最大值改为 30。

于是就用上面的方式写了代码。

用 Python 出地球科学考试题-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))

一开始还稍微想了想中间的虚线要怎么画,结果发现直接画直线就完事了。

成品非常令人满意。

用 Python 出地球科学考试题-10

5. 后记

既提高了试题的完成度,又顺带进行了一次编程学习。

以后还打算多多应用这一套方法。

댓글을 불러오는 중...