feat: 扩展天文计算能力
- 新增日食、月食、本地可见性、中心线、半影区域、SVG 图示与沙罗周期信息 - 新增行星冲合、留、方照、物理星历、视直径、相位、亮肢角、轨道节点等计算 - 新增木星伽利略卫星位置、现象与接触事件计算 - 新增恒星星表、星座判定、自行修正与观测辅助能力 - 新增 coord、formula、orbit、sundial、lite/sun、lite/moon 等扩展包 - 完善农历年号、月相英文别名、视差角、大气质量、折射、日晷与双星计算 - 增加 NASA、JPL Horizons、IMCCE 等回归测试数据与基线测试 - 重构基础算法文件组织,补充大量公开 API 注释和语义回归测试 - 更新中文和英文 README,补充示例、精度说明、SVG 配图
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
package formula
|
||||
|
||||
import "math"
|
||||
|
||||
const (
|
||||
solarLuminosityW = 3.828e26
|
||||
solarRadiusM = 6.957e8
|
||||
solarEffectiveTempK = 5772.0
|
||||
)
|
||||
|
||||
// LuminosityFromRadiusTemperature 由半径和温度求光度 / luminosity from radius and temperature.
|
||||
//
|
||||
// radiusM: 恒星半径,单位米
|
||||
// temperatureK: 恒星有效温度,单位开尔文
|
||||
//
|
||||
// 返回:
|
||||
//
|
||||
// 总光度,单位瓦特
|
||||
func LuminosityFromRadiusTemperature(radiusM, temperatureK float64) float64 {
|
||||
if radiusM <= 0 || temperatureK <= 0 ||
|
||||
math.IsNaN(radiusM) || math.IsInf(radiusM, 0) ||
|
||||
math.IsNaN(temperatureK) || math.IsInf(temperatureK, 0) {
|
||||
return math.NaN()
|
||||
}
|
||||
return 4 * math.Pi * radiusM * radiusM * StefanBoltzmannFlux(temperatureK)
|
||||
}
|
||||
|
||||
// RadiusFromLuminosityTemperature 由光度和温度求半径 / radius from luminosity and temperature.
|
||||
//
|
||||
// luminosityW: 恒星总光度,单位瓦特
|
||||
// temperatureK: 恒星有效温度,单位开尔文
|
||||
//
|
||||
// 返回:
|
||||
//
|
||||
// 恒星半径,单位米
|
||||
func RadiusFromLuminosityTemperature(luminosityW, temperatureK float64) float64 {
|
||||
if luminosityW <= 0 || temperatureK <= 0 ||
|
||||
math.IsNaN(luminosityW) || math.IsInf(luminosityW, 0) ||
|
||||
math.IsNaN(temperatureK) || math.IsInf(temperatureK, 0) {
|
||||
return math.NaN()
|
||||
}
|
||||
denominator := 4 * math.Pi * StefanBoltzmannFlux(temperatureK)
|
||||
if denominator == 0 {
|
||||
return math.NaN()
|
||||
}
|
||||
return math.Sqrt(luminosityW / denominator)
|
||||
}
|
||||
|
||||
// EffectiveTemperatureFromLuminosityRadius 由光度和半径求温度 / effective temperature from luminosity and radius.
|
||||
//
|
||||
// luminosityW: 恒星总光度,单位瓦特
|
||||
// radiusM: 恒星半径,单位米
|
||||
//
|
||||
// 返回:
|
||||
//
|
||||
// 恒星有效温度,单位开尔文
|
||||
func EffectiveTemperatureFromLuminosityRadius(luminosityW, radiusM float64) float64 {
|
||||
if luminosityW <= 0 || radiusM <= 0 ||
|
||||
math.IsNaN(luminosityW) || math.IsInf(luminosityW, 0) ||
|
||||
math.IsNaN(radiusM) || math.IsInf(radiusM, 0) {
|
||||
return math.NaN()
|
||||
}
|
||||
denominator := 4 * math.Pi * radiusM * radiusM * stefanBoltzmannConstant
|
||||
if denominator == 0 {
|
||||
return math.NaN()
|
||||
}
|
||||
return math.Pow(luminosityW/denominator, 0.25)
|
||||
}
|
||||
|
||||
// LuminositySolarFromRadiusTemperature 由太阳半径单位和温度求光度 / luminosity in solar units from radius and temperature.
|
||||
//
|
||||
// radiusSolar: 恒星半径,单位为太阳半径
|
||||
// temperatureK: 恒星有效温度,单位开尔文
|
||||
//
|
||||
// 返回:
|
||||
//
|
||||
// 总光度,单位为太阳光度 L☉
|
||||
func LuminositySolarFromRadiusTemperature(radiusSolar, temperatureK float64) float64 {
|
||||
if radiusSolar <= 0 || temperatureK <= 0 ||
|
||||
math.IsNaN(radiusSolar) || math.IsInf(radiusSolar, 0) ||
|
||||
math.IsNaN(temperatureK) || math.IsInf(temperatureK, 0) {
|
||||
return math.NaN()
|
||||
}
|
||||
return LuminosityFromRadiusTemperature(radiusSolar*solarRadiusM, temperatureK) / solarLuminosityW
|
||||
}
|
||||
|
||||
// RadiusSolarFromLuminosityTemperature 由太阳光度单位和温度求半径 / radius in solar units from luminosity and temperature.
|
||||
//
|
||||
// luminositySolar: 恒星总光度,单位为太阳光度 L☉
|
||||
// temperatureK: 恒星有效温度,单位开尔文
|
||||
//
|
||||
// 返回:
|
||||
//
|
||||
// 恒星半径,单位为太阳半径 R☉
|
||||
func RadiusSolarFromLuminosityTemperature(luminositySolar, temperatureK float64) float64 {
|
||||
if luminositySolar <= 0 || temperatureK <= 0 ||
|
||||
math.IsNaN(luminositySolar) || math.IsInf(luminositySolar, 0) ||
|
||||
math.IsNaN(temperatureK) || math.IsInf(temperatureK, 0) {
|
||||
return math.NaN()
|
||||
}
|
||||
return RadiusFromLuminosityTemperature(luminositySolar*solarLuminosityW, temperatureK) / solarRadiusM
|
||||
}
|
||||
|
||||
// EffectiveTemperatureFromLuminositySolarRadius 由太阳光度和半径单位求温度 / effective temperature from solar luminosity and radius.
|
||||
//
|
||||
// luminositySolar: 恒星总光度,单位为太阳光度 L☉
|
||||
// radiusSolar: 恒星半径,单位为太阳半径 R☉
|
||||
//
|
||||
// 返回:
|
||||
//
|
||||
// 恒星有效温度,单位开尔文
|
||||
//
|
||||
// 例:
|
||||
//
|
||||
// // 半径 2.5 R☉、光度 20 L☉ 的主序星
|
||||
// t := formula.EffectiveTemperatureFromLuminositySolarRadius(20, 2.5)
|
||||
func EffectiveTemperatureFromLuminositySolarRadius(luminositySolar, radiusSolar float64) float64 {
|
||||
if luminositySolar <= 0 || radiusSolar <= 0 ||
|
||||
math.IsNaN(luminositySolar) || math.IsInf(luminositySolar, 0) ||
|
||||
math.IsNaN(radiusSolar) || math.IsInf(radiusSolar, 0) {
|
||||
return math.NaN()
|
||||
}
|
||||
return EffectiveTemperatureFromLuminosityRadius(luminositySolar*solarLuminosityW, radiusSolar*solarRadiusM)
|
||||
}
|
||||
|
||||
// SolarEffectiveTemperature 太阳有效温度常数 / solar effective temperature constant.
|
||||
//
|
||||
// 返回:
|
||||
//
|
||||
// 太阳有效温度,单位开尔文
|
||||
func SolarEffectiveTemperature() float64 {
|
||||
return solarEffectiveTempK
|
||||
}
|
||||
Reference in New Issue
Block a user