- 新增时标、ΔT 模型、质心时间与 UT1 支持 - 改进日月食、月掩、行星事件及路径边界计算 - 完善恒星三维自行与动态距离传播 - 扩展 SVG、GeoJSON、KML 输出与底层距离换算工具 - 整理中英文手册、示例资源及回归测试
18 KiB
研究公式
formula 包放的是和具体日期、星历表无关的常用公式,适合科普估算、小说设定和教学演示。
它不做任何时标换算,也不读星历表:输入只有温度、波长、距离、口径、高度角这类瞬时或常量参数。高度角与天顶距的口径沿用观测角语义;需要坐标层的折射修正时改用 coord 的大气质量;整体精度与适用范围见适用范围与精度。
目录
星等、会合周期与黑体辐射
package main
import (
"fmt"
"b612.me/astro/formula"
)
func main() {
// 70mm 小折射镜,观测地裸眼极限取 6 等。
fmt.Printf("limiting=%.6f\n", formula.LimitingMagnitudeEmpirical(70, 6))
// 地球和金星的会合周期,输入周期单位都是天,输出也是天。
fmt.Printf("synodic=%.6f\n", formula.SynodicPeriod(365.25636, 224.70069))
// 太阳这样的绝对星等天体放到 100pc 处的视星等。
fmt.Printf("apparent=%.6f\n", formula.ApparentMagnitudeFromAbsolute(4.83, 100))
// 把太阳近似为 5772K 黑体,计算峰值波长和单位面积总辐射出射度。
fmt.Printf("peak=%.9em flux=%.6e\n",
formula.WienPeakWavelength(5772),
formula.StefanBoltzmannFlux(5772),
)
}
输出结果:
limiting=11.000000
synodic=583.920635
apparent=9.830000
peak=5.020394932e-07m flux=6.293859e+07
API 参考
下面按计算内容列出接口、单位和返回值。
分组片段省略公共前置:fmt 已在文件头导入,formula 指 b612.me/astro/formula。
黑体与辐射
| 名称 | 用途 | 单位与口径 |
|---|---|---|
PlanckRadianceByWavelength |
按波长的普朗克谱辐亮度 | 波长米、温度 K;返回 W·sr⁻¹·m⁻³;非正温度或非正波长返回 NaN |
WienPeakWavelength |
维恩位移峰值波长 | 温度 K;返回米;温度 ≤ 0 或非有限返回 NaN |
StefanBoltzmannFlux |
单位面积总辐射出射度 | 温度 K;返回 W/m²;温度 0 K 合法且返回 0 |
SolarEffectiveTemperature |
内置太阳有效温度常数 | 无参数;返回 K,当前为 5772 |
// 把太阳近似为 5772 K 黑体:峰值波长、总出射度,以及 500 nm 处的谱辐亮度。
tSun := formula.SolarEffectiveTemperature()
fmt.Printf("peak=%.9e m flux=%.6e W/m^2\n",
formula.WienPeakWavelength(tSun), formula.StefanBoltzmannFlux(tSun))
fmt.Printf("radiance@500nm=%.6e W·sr^-1·m^-3\n",
formula.PlanckRadianceByWavelength(500e-9, tSun))
会合周期
| 名称 | 用途 | 单位与口径 |
|---|---|---|
SynodicPeriod |
两个周期天体的会合周期 | 两个输入单位必须一致,输出同单位;周期 ≤ 0 或非有限返回 NaN,两周期相等返回 +Inf |
// 地球与其他行星的会合周期,输入输出都是天。
earth := 365.25636
fmt.Printf("venus=%.6f mars=%.6f jupiter=%.6f\n",
formula.SynodicPeriod(earth, 224.70069),
formula.SynodicPeriod(earth, 686.980),
formula.SynodicPeriod(earth, 4332.589))
星等与距离
| 名称 | 用途 | 单位与口径 |
|---|---|---|
DistanceModulus |
距离模数 | 距离 pc;返回 m − M;10 pc 处为 0,距离 ≤ 0 返回 NaN |
ApparentMagnitudeFromAbsolute |
绝对星等 + 距离 → 视星等 | 星等 mag、距离 pc;等于 M + 距离模数 |
AbsoluteMagnitudeFromApparent |
视星等 + 距离 → 绝对星等 | 星等 mag、距离 pc;等于 m − 距离模数 |
// 太阳绝对星等 4.83,放到 10 pc / 100 pc / 1 kpc 处的视星等与反解。
for _, d := range []float64{10, 100, 1000} {
m := formula.ApparentMagnitudeFromAbsolute(4.83, d)
fmt.Printf("d=%.0f pc m=%.6f M=%.6f mod=%.6f\n",
d, m, formula.AbsoluteMagnitudeFromApparent(m, d), formula.DistanceModulus(d))
}
距离单位换算
| 名称 | 用途 | 单位与口径 |
|---|---|---|
Distance |
把秒差距、光年或天文单位换算为秒差距 | 输入正数 + DistanceUnit;非正数、NaN、未知单位返回 NaN |
| 常量 | 含义 |
|---|---|
DistanceParsec |
秒差距 pc,恒等换算 |
DistanceLightYear |
光年 ly |
DistanceAU |
天文单位 AU |
// 天狼星视差 0.375 角秒,折合 2.667 pc,也就是 8.70 光年。
pc := formula.Distance(1/0.375, formula.DistanceParsec)
fmt.Printf("%.3f pc = %.2f ly\n", pc, formula.Distance(pc, formula.DistanceParsec)/formula.Distance(1, formula.DistanceLightYear))
口径:天文单位取 149597870.7 km,光年取 IAU 定义值 9460730472580.8 km,秒差距由精确关系 648000/π 天文单位导出,因此 1 pc = 3.261563777 ly。
望远镜指标
| 名称 | 用途 | 单位与口径 |
|---|---|---|
DawesLimitArcsec |
Dawes 极限分辨角 | 口径 mm;返回角秒,经验式 116 / D |
RayleighLimitArcsec |
Rayleigh 极限分辨角 | 口径 mm;返回角秒,经验式 138.4 / D |
LightGatheringPowerRatio |
集光力比值 | 两个口径 mm;返回 (D1 / D2)²,无量纲 |
LimitingMagnitudeEmpirical |
经验极限星等 | 口径 mm、裸眼极限 mag;按 裸眼极限 + 5·log10(D / 7) 估算,7 mm 为内置暗适应瞳径 |
// 70 mm 小折射镜:分辨极限、相对 7 mm 暗瞳的集光力、裸眼极限 6 等的经验极限星等。
fmt.Printf("dawes=%.6f rayleigh=%.6f\n",
formula.DawesLimitArcsec(70), formula.RayleighLimitArcsec(70))
fmt.Printf("power=%.6f limiting=%.6f\n",
formula.LightGatheringPowerRatio(70, 7),
formula.LimitingMagnitudeEmpirical(70, 6))
恒星参数换算
| 名称 | 用途 | 单位与口径 |
|---|---|---|
LuminosityFromRadiusTemperature |
半径 + 温度 → 光度 | 半径米、温度 K;返回 W;按 4πR²σT⁴ |
LuminositySolarFromRadiusTemperature |
同上,太阳单位 | 半径 R☉、温度 K;返回 L☉ |
RadiusFromLuminosityTemperature |
光度 + 温度 → 半径 | 光度 W、温度 K;返回米 |
RadiusSolarFromLuminosityTemperature |
同上,太阳单位 | 光度 L☉、温度 K;返回 R☉ |
EffectiveTemperatureFromLuminosityRadius |
光度 + 半径 → 有效温度 | 光度 W、半径米;返回 K |
EffectiveTemperatureFromLuminositySolarRadius |
同上,太阳单位 | 光度 L☉、半径 R☉;返回 K |
SolarEffectiveTemperature |
内置太阳有效温度 | 无参数;返回 K |
// 半径 2.5 R☉、光度 20 L☉ 的主序星:反解温度,再正算回光度与半径。
t := formula.EffectiveTemperatureFromLuminositySolarRadius(20, 2.5)
fmt.Printf("Teff=%.6f K\n", t)
fmt.Printf("L=%.6f Lsun R=%.6f Rsun\n",
formula.LuminositySolarFromRadiusTemperature(2.5, t),
formula.RadiusSolarFromLuminosityTemperature(20, t))
// 同一组量的 MKS 版本;太阳半径取内置常数的 6.957e8 m。
rM := 2.5 * 6.957e8
lW := formula.LuminosityFromRadiusTemperature(rM, t)
fmt.Printf("L=%.6e W R=%.6e m Teff=%.6f K\n",
lW, formula.RadiusFromLuminosityTemperature(lW, t),
formula.EffectiveTemperatureFromLuminosityRadius(lW, rM))
大气质量模型
| 名称 | 用途 | 单位与口径 |
|---|---|---|
AirmassPlaneParallel |
平行平板模型 | 输入真高度角、度;等价 sec(z),0° 处返回 +Inf |
AirmassPlaneParallelByZenithDistance |
平行平板模型(天顶距) | 输入天顶距、度;90° 处返回 +Inf |
AirmassKastenYoung |
Kasten-Young 1989 | 输入视高度角、度;低空比 sec(z) 稳健 |
AirmassPickering |
Pickering 2002 | 输入视高度角、度;面向低空观测修正 |
四者都把输入限制在 [0,90],越界或非有限返回 NaN;高度角以地平 0°、天顶 +90° 计,天顶距与高度角互补,口径见观测角语义。
fmt.Println(formula.AirmassPlaneParallel(30))
fmt.Println(formula.AirmassKastenYoung(5))
fmt.Println(formula.AirmassPickering(5))
fmt.Println(formula.AirmassPlaneParallelByZenithDistance(60))
如果不需要坐标层的折射修正,formula 也直接提供三种大气质量模型,输入语义更直接:
AirmassPlaneParallel:输入真高度角,等价于sec(z)几何近似AirmassPlaneParallelByZenithDistance:直接输入天顶距AirmassKastenYoung/AirmassPickering:输入视高度角,不会自动做折射修正
常用场景
黑体峰值、总辐射与恒星参数
fmt.Println(formula.WienPeakWavelength(5772)) // 峰值波长(米)
fmt.Println(formula.StefanBoltzmannFlux(5772)) // 单位面积总辐射(W/m²)
fmt.Println(formula.RadiusSolarFromLuminosityTemperature(1, 5772)) // 由光度与温度解半径
fmt.Println(formula.EffectiveTemperatureFromLuminositySolarRadius(1, 1)) // 由光度与半径解温度
5.020394932432432e-07
6.293859246828887e+07
1.0000011882005775
5772.003429145848
三组互算函数互为逆运算,同口径下回到输入值(示例里 1 → 1.0000012、5772 → 5772.0034 的残差来自双方都取 5772 K 的近似);带 ...Solar 的变体用太阳单位,不带的使用 SI。
会合周期与星等距离
fmt.Println(formula.SynodicPeriod(365.25636, 224.70069)) // 地球与金星的会合周期(天)
fmt.Println(formula.DistanceModulus(10)) // 10 pc 处的距离模数
fmt.Println(formula.ApparentMagnitudeFromAbsolute(4.83, 100)) // 绝对星等 4.83 放到 100 pc
fmt.Println(formula.AbsoluteMagnitudeFromApparent(4.83, 100)) // 逆换算
583.9206352820089
0
9.83
-0.16999999999999993
DistanceModulus(10) 为 0,因为 10 pc 就是绝对星等的定义距离;会合周期的输入输出都是天,参数顺序不影响结果。
望远镜极限星等与分辨率
fmt.Println(formula.DawesLimitArcsec(70), formula.RayleighLimitArcsec(70)) // 70 mm 口径的两种分辨极限
fmt.Println(formula.LightGatheringPowerRatio(200, 70)) // 200 mm 相对 70 mm 的集光力
fmt.Println(formula.LimitingMagnitudeEmpirical(70, 6)) // 裸眼 6 等时 70 mm 的极限星等
1.6571428571428573 1.9771428571428573
8.16326530612245
11
Dawes 与 Rayleigh 相差一个系数(70 mm 下 1.66″ 与 1.98″),报告里要写明用的是哪一条;LimitingMagnitudeEmpirical 的第二个参数是观测地裸眼极限星等,换观测地要一起改。
大气质量模型对比
for _, alt := range []float64{5, 30, 60, 90} {
fmt.Printf("alt=%.0f KY=%.6f Pickering=%.6f plane=%.6f\n", alt,
formula.AirmassKastenYoung(alt), formula.AirmassPickering(alt), formula.AirmassPlaneParallel(alt))
}
alt=5 KY=10.305791 Pickering=10.333706 plane=11.473713
alt=30 KY=1.994293 Pickering=1.993154 plane=2.000000
alt=60 KY=1.153992 Pickering=1.154058 plane=1.154701
alt=90 KY=0.999712 Pickering=1.000000 plane=1.000000
三种模型在中高空几乎重合,低空(5°)差异最大(Kasten-Young 与平面平行差约 1.2 个大气质量);平面平行模型在 0° 发散,低空精细估算用 Kasten-Young 或 Pickering。带气压与气温修正的版本在 坐标工具,本包只给纯公式。
参数与返回值约定
单位约定
- 黑体族:波长米、温度开尔文;
PlanckRadianceByWavelength返回谱辐亮度W·sr⁻¹·m⁻³,StefanBoltzmannFlux返回W/m²,WienPeakWavelength返回米。 - 恒星族:MKS 变体用半径米、光度瓦特、温度开尔文;Solar 变体用太阳半径 R☉、太阳光度 L☉、温度开尔文,输入输出都是无量纲的太阳倍数。
- 星等族:距离秒差距 pc、星等 mag;
DistanceModulus返回m − M,单位也是 mag。 - 距离单位:
Distance只做单位换算,输入单位由DistanceUnit指定,返回值一律是秒差距 pc。 - 望远镜族:口径毫米 mm;
DawesLimitArcsec、RayleighLimitArcsec返回角秒,不是度;LightGatheringPowerRatio与LimitingMagnitudeEmpirical分别为无量纲比值与 mag。 - 大气质量族:高度角(或天顶距)为度;返回值是以天顶为 1 的无量纲相对大气质量。
- 会合周期:单位由调用者自定,两个输入必须一致,输出与之一致;本包不假定“天”。
- 本包不产生视直径/视半径。日食、月掩手册里的视半径字段以角秒计,本包只有 Dawes/Rayleigh 两个极限角用角秒,其余角度一律为度,不要混用。
时标
- 全部接口都不接收时刻,也不做任何时标换算:公式只依赖温度、波长、距离、口径、高度角等参数,与 UTC、UT1、TT 无关。
- 会合周期给的是周期长度,不是“下一次会合的时刻”。要落到日期,需要配合行星包的会合接口与民用时刻,时标口径见时标约定。
- 本包没有 ΔT、闰秒或 UT1 修正入口;这些只在
coord、eclipse、moon等依赖时刻的链路里出现。
角度象限与弧度/度的边界
- 角度参数一律为度,内部转弧度计算,返回值也回到度或角秒,不会把弧度泄漏给调用者。
- 高度角与天顶距都限制在
[0,90]:地平为0°、天顶为+90°,天顶距与高度角互补。本包不做象限折叠,负高度(地平线以下)直接被判为无效,不会自动取绝对值或折到天顶。 - 天顶距
z与高度角h的关系是z = 90° − h;AirmassPlaneParallel收h,AirmassPlaneParallelByZenithDistance收z,两者对同一几何应给出一致结果。 - Dawes/Rayleigh 的返回值是角秒;若要与其他手册的“度”角度换算,需除以 3600。
零值与无效输入
- 黑体族对无效输入的处理刻意不一致:
WienPeakWavelength与PlanckRadianceByWavelength在温度≤ 0或非有限时返回 NaN;StefanBoltzmannFlux只在温度< 0或非有限时返回 NaN,0 K是合法输入并返回0(0 K 的通量为 0,而峰值波长无定义)。 - 会合周期:任一周期
≤ 0或非有限返回 NaN;两个周期相等时频率差为 0,返回+Inf。 - 星等族:
distanceParsec ≤ 0或非有限时DistanceModulus返回 NaN,两个换算函数随之返回 NaN;DistanceModulus(10)恒为0。 - 望远镜族:口径(或第二个口径)
≤ 0或非有限返回 NaN;LightGatheringPowerRatio的第二个口径为0会先被判为无效而不是除零;LimitingMagnitudeEmpirical不接收瞳径参数,7 mm 是内置常数。 - 恒星族:所有输入必须
> 0,否则返回 NaN;EffectiveTemperatureFromLuminositySolarRadius、LuminositySolarFromRadiusTemperature、RadiusSolarFromLuminosityTemperature先把太阳单位换成 SI 再计算。 - 大气质量族:高度角或天顶距落在
[0,90]之外(含负值)或非有限都返回 NaN;AirmassPlaneParallel(0)与AirmassPlaneParallelByZenithDistance(90)返回+Inf;AirmassKastenYoung(0)、AirmassPickering(0)仍是有限值。 - 本包没有
(值, error)或(值, ok)形式的返回:无效输入统一用 NaN 表达,调用者用math.IsNaN判断。
精度与适用范围
- 黑体族是理想黑体模型,不含吸收线、星际消光与大气消光。
WienPeakWavelength使用维恩位移常数b = 2.897771955e-3 m·K;按频率与按波长的峰值口径不同,严格意义上b/T是波长口径的峰值。 - 常数口径:
h = 6.62607015e-34 J·s、c = 299792458 m/s、k = 1.380649e-23 J/K、σ = 5.670374419e-8 W·m⁻²·K⁻⁴;太阳参数L☉ = 3.828e26 W、R☉ = 6.957e8 m、Teff = 5772 K,后者的公开入口是SolarEffectiveTemperature。 - 星等族假设无消光、无 K 修正、无宇宙学项;两个换算函数只是加减
DistanceModulus,因此精度完全取决于外部给的绝对星等与距离。 - 望远镜族是可见光经验值:Dawes 与 Rayleigh 用固定系数(
116、138.4,口径 mm),不随波长变化;LightGatheringPowerRatio只比较口径平方,不含中心遮挡、透过率与副镜损失;LimitingMagnitudeEmpirical不含天空背景、倍率、透过率与观测经验修正。 - 恒星族由
L = 4πR²σT⁴互相反解,假设球对称、无临边昏暗修正、无自转与磁场效应;Solar 变体与 MKS 变体共用同一组太阳常数,两者之间的差异只来自这一组常数的口径。 - 大气质量族:平行平板是纯几何
sec(z),只在中高空可作近似,接近地平线时发散;Kasten-Young(1989) 与 Pickering(2002) 是经验拟合,中高空彼此接近,低空差异最大。已经有视高度角时直接用AirmassKastenYoung/AirmassPickering;只有真高度角而需要折射时用coord的大气质量。 - 本包全部函数都是无状态纯函数,不做缓存、不读全局时标状态,可以安全地在任意顺序、任意并发(调用方自行同步)下调用。