astro/formula/blackbody.go
starainrt 3ffdbe0034
feat: 扩展天文计算能力
- 新增日食、月食、本地可见性、中心线、半影区域、SVG 图示与沙罗周期信息
- 新增行星冲合、留、方照、物理星历、视直径、相位、亮肢角、轨道节点等计算
- 新增木星伽利略卫星位置、现象与接触事件计算
- 新增恒星星表、星座判定、自行修正与观测辅助能力
- 新增 coord、formula、orbit、sundial、lite/sun、lite/moon 等扩展包
- 完善农历年号、月相英文别名、视差角、大气质量、折射、日晷与双星计算
- 增加 NASA、JPL Horizons、IMCCE 等回归测试数据与基线测试
- 重构基础算法文件组织,补充大量公开 API 注释和语义回归测试
- 更新中文和英文 README,补充示例、精度说明、SVG 配图
2026-05-01 22:38:44 +08:00

68 lines
2.0 KiB
Go

// Package formula 提供与具体时刻、星历表无关的研究型天文公式。
package formula
import "math"
const (
planckConstant = 6.62607015e-34
speedOfLight = 299792458.0
boltzmannConstant = 1.380649e-23
stefanBoltzmannConstant = 5.670374419e-8
wienDisplacementConstant = 2.897771955e-3
)
// WienPeakWavelength 维恩峰值波长 / Wien peak wavelength.
//
// temperatureK: 黑体温度,单位开尔文
//
// 返回:
//
// 峰值波长,单位米
func WienPeakWavelength(temperatureK float64) float64 {
if temperatureK <= 0 || math.IsNaN(temperatureK) || math.IsInf(temperatureK, 0) {
return math.NaN()
}
return wienDisplacementConstant / temperatureK
}
// StefanBoltzmannFlux 斯特藩-玻尔兹曼通量 / Stefan-Boltzmann flux.
//
// temperatureK: 黑体温度,单位开尔文
//
// 返回:
//
// 单位面积总出射度,单位 W/m^2
func StefanBoltzmannFlux(temperatureK float64) float64 {
if temperatureK < 0 || math.IsNaN(temperatureK) || math.IsInf(temperatureK, 0) {
return math.NaN()
}
return stefanBoltzmannConstant * math.Pow(temperatureK, 4)
}
// PlanckRadianceByWavelength 按波长的普朗克谱辐亮度 / Planck spectral radiance by wavelength.
//
// wavelengthM: 波长,单位米
// temperatureK: 黑体温度,单位开尔文
//
// 返回:
//
// 谱辐亮度,单位 W·sr^-1·m^-3
//
// 例:
//
// b := formula.PlanckRadianceByWavelength(500e-9, 5772)
func PlanckRadianceByWavelength(wavelengthM, temperatureK float64) float64 {
if wavelengthM <= 0 || temperatureK <= 0 ||
math.IsNaN(wavelengthM) || math.IsInf(wavelengthM, 0) ||
math.IsNaN(temperatureK) || math.IsInf(temperatureK, 0) {
return math.NaN()
}
exponent := planckConstant * speedOfLight / (wavelengthM * boltzmannConstant * temperatureK)
denominator := math.Expm1(exponent)
if denominator == 0 {
return math.Inf(1)
}
return 2 * planckConstant * speedOfLight * speedOfLight / math.Pow(wavelengthM, 5) / denominator
}