You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:17:02