1. 2025학년도 9월 지구과학1 20번 문제
今年 9 月做地球科学模拟考试的时候,有一道把人脑袋整炸的问题。
是第 20 题外星行星系探测题,不管怎么看都看不出周期。

最后还是没能解决,只好承受看 EBS 讲解的屈辱。
答案是图像的周期。
从图像上看,周期是 t1 ~ t4,所以在视向速度为 -30~+30m/s 的位置,已经转过了整个周期的 1/3。
于是从 t1 ~ t2 的转角是 120 度,因此在视向速度为 +30 的位置上,视线方向-公转中心-中心恒星之间的夹角就是 60 度。
自己说着也觉得这是什么玩意儿,就画图来表示了一下。

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

这里 Vr = V * cos30º,且 Vr = 30 m/s,因此 V = Vr / cos30º。
于是得出震撼的结论:选项 ㄷ 是对的。

这玩意儿怎么可能在 1 分钟内解出来...
就算高斯转世重生来了,估计也很难在 1 分钟内做出来。
总之,我把这道题的全部解题方法都教给了高二的孩子们,然后决定把几乎同样的题目作为过程性评价(平时考)来考。
当然,在讲解的时候,完全没透露这道题以后会变成过程性评价题。
2. 进行过程性评价
上《地球科学1》的所有班都集中在星期一上课,所以决定星期一进行测试。
结果...?

进教室一看,班里有一半的学生没来。
题目很难的风声传出去了,那些没准备过程性评价的学生就以身体不适提前离校了。
当然也有真的病得很严重的孩子,但无论如何,我不可能还用同一份试卷原封不动地考试。
老老实实参加考试的学生提出质疑:如果还是用原来的那道题,会不会有违评价的公平性。
于是就决定用 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")
现在还差很多。
接下来从这张图上裁出需要的部分,并设置各个坐标轴。
用 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='--')
最后用 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)")
现在只要在这里改一下函数周期,或者修改最大值和最小值,就可以对题目进行变式了。
4. 应用
这次第二次期中卷里,我想把下面这道题中右边图像的视向速度反过来,并把最大值改为 30。
于是就用上面的方式写了代码。

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))一开始还稍微想了想中间的虚线要怎么画,结果发现直接画直线就完事了。
成品非常令人满意。

5. 后记
既提高了试题的完成度,又顺带进行了一次编程学习。
以后还打算多多应用这一套方法。
댓글을 불러오는 중...