Python绘图不符合预期:重建日长随年日变化函数图问题
嘿,我来帮你搞定这个日长绘图的问题!你说的这个日长随年日和纬度变化的函数,核心是基于天文上的昼长计算公式对吧?先从公式逻辑和代码实现两个维度帮你排查问题~
先确认核心公式是否正确
首先,昼长的经典推导是基于太阳赤纬δ和当地纬度θ的,而太阳赤纬又和年日t直接相关。你提到的χ应该是用来计算太阳位置的中间变量,先把标准公式理清楚:
- 太阳赤纬δ的计算:
δ = Θ * sin(2π*(t - t₀)/T₃₆₅),这里Θ是地轴倾角23.4°,注意必须转成弧度计算! - 昼长L的核心公式:当
|θ| ≤ 90° - |δ|时,L = T₂₄/π * arccos(-tanθ * tanδ);如果是极昼/极夜区域,昼长直接取24小时或0小时。
这里有几个非常容易踩的坑:
- 所有三角函数计算必须用弧度,Python的
math或numpy库默认都是弧度输入,如果你直接扔角度进去,结果会完全跑偏。 - 年日t的单位要统一:你用小时(t₀=79×24)的话,计算周期比值时要对应用
(t - t₀)/T₃₆₅(T₃₆₅=365×24),也可以简化成日数(t取1-365,t₀=79,T₃₆₅=365),结果是一致的,可能更直观。
检查Python代码的常见错误
我给你写了一段标准的实现代码,你可以对比自己的代码找差异:
import numpy as np import matplotlib.pyplot as plt # 已知参数 THETA_DEG = 23.4 # 地轴倾角(度) T24 = 24 # 标准日长(小时) T365_DAYS = 365 # 一年的天数 t0_DAYS = 79 # 春分日对应的年日(第79天) # 转换为弧度(关键!) THETA = np.radians(THETA_DEG) # 生成年日数据(1到365天) t_days = np.arange(1, 366) # 计算太阳赤纬δ delta = THETA * np.sin(2 * np.pi * (t_days - t0_DAYS) / T365_DAYS) # 定义昼长计算函数,处理极昼极夜情况 def calculate_day_length(latitude_deg, delta_rad): lat_rad = np.radians(latitude_deg) # 计算核心项,用于判断极昼极夜 term = -np.tan(lat_rad) * np.tan(delta_rad) # 分情况处理:极昼→24小时,极夜→0小时,正常情况用公式计算 day_length = np.where(term <= -1, T24, np.where(term >= 1, 0, (T24 / np.pi) * np.arccos(term))) return day_length # 计算几个典型纬度的日长 latitudes = [0, 30, 60, 70] day_lengths = {lat: calculate_day_length(lat, delta) for lat in latitudes} # 绘图 plt.figure(figsize=(10,6)) for lat, dl in day_lengths.items(): plt.plot(t_days, dl, label=f'纬度{lat}°') plt.xlabel('年日(1-365)') plt.ylabel('日长(小时)') plt.title('日长随年日的变化') plt.legend() plt.grid(True) plt.show()
排查你的代码可能的问题点
对照上面的示例,你可以检查这几个常见错误:
- 单位不统一:比如你是不是把t的小时数直接代入,但计算周期时写成了
(t - 79)/365而不是(t - 79*24)/(365*24)? - 角度转弧度遗漏:比如地轴倾角Θ直接用23.4度代入
sin(),没转成弧度,这会导致赤纬计算完全错误。 - 极昼极夜边界未处理:高纬度地区(比如北纬70°)夏至前后会出现极昼,如果直接计算
arccos(term),当term小于-1时会出现NaN,导致图形断裂。 - 春分日定义偏差:t0=79×24小时对应第79天,这个是对的(北半球春分通常在3月20/21日),但要确认你的年日计数是从1月1日为第1天开始的。
调整这些点之后,应该就能得到符合预期的日长变化图了~
内容的提问来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

