Skip to main content
Glama

Ziwei Astrology MCP Server

by smogievogie
真太阳时算法详解.md10.5 kB
# 真太阳时算法详解 ## 概述 真太阳时(Apparent Solar Time)是以太阳在天空中的实际位置为基准的时间系统。当太阳位于正南方向(上中天)时,真太阳时为正午12点。由于地球轨道的椭圆性和地轴倾斜,真太阳时与我们日常使用的平太阳时(标准时间)之间存在差异。 本文档详细介绍了基于《天文算法》(Jean Meeus著)实现的高精度真太阳时计算算法。 ## 算法原理 ### 基本公式 ``` 真太阳时 = 地方平太阳时 + 均时差 ``` 其中: - **地方平太阳时** = 标准时间 + 经度修正 - **经度修正** = (当地经度 - 标准经度) × 4分钟/度 - **均时差**(时间差方程)= 复杂的天文计算函数 ### 核心概念 #### 1. 均时差(Equation of Time) 均时差是真太阳时与平太阳时之间的差值,主要由两个因素造成: 1. **地球轨道椭圆性**:地球轨道不是完美的圆形,导致地球公转速度不均匀 2. **黄道倾角**:地轴相对于轨道平面倾斜23.5°,导致太阳在天球上的运动轨迹复杂 均时差的变化范围:**-16分钟 到 +14分钟** #### 2. 地理经度修正 由于地球自转,不同经度的地方时存在差异: - 东经120°以东:地方时比北京时间快 - 东经120°以西:地方时比北京时间慢 - 每度经度差异:4分钟时间差 ## 算法实现 ### 主函数:calculateApparentSolarTime ```typescript function calculateApparentSolarTime(beijingTime: string, longitude: number): string { try { const date = new Date(beijingTime); if (isNaN(date.getTime())) { throw new Error('无效的时间格式'); } // 1. 计算儒略日 const julianDay = getJulianDay(date); // 2. 计算时间差方程(均时差) const equationOfTime = getEquationOfTime(julianDay); // 3. 计算地方平太阳时 const localMeanTime = date.getTime() + (longitude - 120) * 4 * 60 * 1000; // 4. 计算真太阳时 const apparentSolarTime = new Date(localMeanTime + equationOfTime * 60 * 1000); // 5. 格式化输出 return formatDateTime(apparentSolarTime); } catch (error) { throw new Error(`真太阳时计算失败: ${error.message}`); } } ``` ### 1. 儒略日计算(getJulianDay) 儒略日是天文学中常用的连续计日法,以公元前4713年1月1日正午为起点。 ```typescript function getJulianDay(date: Date): number { const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); const hour = date.getHours(); const minute = date.getMinutes(); const second = date.getSeconds(); // 格里高利历转儒略日的标准算法 let a = Math.floor((14 - month) / 12); let y = year + 4800 - a; let m = month + 12 * a - 3; let jdn = day + Math.floor((153 * m + 2) / 5) + 365 * y + Math.floor(y / 4) - Math.floor(y / 100) + Math.floor(y / 400) - 32045; let jd = jdn + (hour - 12) / 24 + minute / 1440 + second / 86400; return jd; } ``` **算法说明:** - 使用格里高利历转儒略日的标准公式 - 考虑了闰年规则(400年、100年、4年周期) - 精确到秒级 ### 2. 均时差计算(getEquationOfTime) 这是算法的核心部分,基于《天文算法》第28章的高精度公式。 ```typescript function getEquationOfTime(julianDay: number): number { // 儒略世纪数 const T = (julianDay - 2451545.0) / 36525.0; // 平黄道倾角(弧度) const epsilon = (84381.406 + T * (-46.836769 + T * (-0.0001831 + T * (0.0020034 + T * (-0.000000576 - T * 0.0000000434))))) * Math.PI / (180 * 3600); // 几何平黄经(度) let L0 = 280.4664567 + T * (36000.76982779 + T * (0.0003032028 + T * (1/49931 - T * (T/15300000 + T/2000000)))); L0 = ((L0 % 360) + 360) % 360; // 规范化到0-360度 const L0_rad = L0 * Math.PI / 180; // 地球轨道离心率 const e = 0.0167086342 + T * (-0.004203654 + T * (-0.0000126734 + T * (0.000001444 + T * (-0.000000002 + T * 0.000000003)))); // 平近点角(度) let M = (1287104.79305 + T * (129596581.0481 + T * (-0.5532 + T * (0.000136 - T * 0.00001149)))) / 3600; M = ((M % 360) + 360) % 360; // 规范化到0-360度 const M_rad = M * Math.PI / 180; // y = tan²(ε/2) const y = Math.tan(epsilon / 2) ** 2; // 时间差方程(弧度) const E_rad = -y * Math.sin(2 * L0_rad) + 2 * e * Math.sin(M_rad) - 4 * e * y * Math.sin(M_rad) * Math.cos(2 * L0_rad) + 0.5 * y * y * Math.sin(4 * L0_rad) + 1.25 * e * e * Math.sin(2 * M_rad); // 转换为分钟 const E_minutes = 4 * E_rad * 180 / Math.PI; return E_minutes; } ``` **关键参数说明:** 1. **儒略世纪数(T)**:从J2000.0历元开始的世纪数 2. **平黄道倾角(ε)**:地轴倾斜角,考虑岁差影响 3. **几何平黄经(L₀)**:太阳的平黄经,不考虑章动 4. **地球轨道离心率(e)**:地球轨道椭圆的扁率 5. **平近点角(M)**:地球在轨道上的平均位置角 6. **y参数**:tan²(ε/2),简化计算的中间变量 **公式推导:** 均时差的完整公式包含多个三角函数项: ``` E = -y·sin(2L₀) + 2e·sin(M) - 4ey·sin(M)·cos(2L₀) + 0.5y²·sin(4L₀) + 1.25e²·sin(2M) ``` 每一项的物理意义: - `-y·sin(2L₀)`:黄道倾角的主要影响 - `2e·sin(M)`:轨道椭圆性的主要影响 - `-4ey·sin(M)·cos(2L₀)`:椭圆性和倾角的耦合项 - `0.5y²·sin(4L₀)`:倾角的二阶修正 - `1.25e²·sin(2M)`:椭圆性的二阶修正 ## 算法特点 ### 精度分析 1. **时间精度**:秒级精度,误差通常小于1秒 2. **适用范围**:公元1000年至3000年 3. **理论基础**:基于VSOP87行星理论和IAU2000岁差章动模型 ### 与简化算法的对比 | 特性 | 本算法 | CSDN简化算法 | |------|--------|-------------| | 理论基础 | 《天文算法》VSOP87理论 | 经验公式 | | 精度 | 秒级 | 分钟级 | | 适用范围 | 1000-3000年 | 近现代 | | 计算复杂度 | 高 | 低 | | 参数数量 | 多项高精度参数 | 5个固定系数 | **CSDN简化公式:** ``` Et = 0.0028 - 1.9857×sin(θ) + 9.9059×sin(2θ) - 7.0924×cos(θ) - 0.6882×cos(2θ) ``` 其中 θ = 2π × (日序数-1) / 365 ## 实际应用示例 ### 示例1:庐江县真太阳时计算 **输入参数:** - 北京时间:1991-02-02 12:30:00 - 经度:117.28°E(庐江县) **计算过程:** 1. **儒略日计算:** ``` JD = 2448290.0208333335 ``` 2. **均时差计算:** ``` T = (2448290.0208333335 - 2451545.0) / 36525.0 = -0.089 均时差 = +13.81分钟 ``` 3. **经度修正:** ``` 经度修正 = (117.28 - 120) × 4 = -10.88分钟 ``` 4. **地方平太阳时:** ``` 地方平太阳时 = 12:30:00 - 10:88分钟 = 12:19:07 ``` 5. **真太阳时:** ``` 真太阳时 = 12:19:07 + 13:81分钟 = 12:32:55 ``` **结果分析:** - 虽然庐江县在东经120°以西,地方平太阳时确实比北京时间慢 - 但由于1991年2月2日的均时差为正值且较大(+13.81分钟) - 最终真太阳时反而比北京时间快了约3分钟 ### 示例2:不同地区对比 | 地区 | 经度 | 经度修正 | 2024-06-21均时差 | 真太阳时差异 | |------|------|----------|------------------|-------------| | 北京 | 116.4°E | -14.4分钟 | -1.4分钟 | -15.8分钟 | | 上海 | 121.5°E | +6.0分钟 | -1.4分钟 | +4.6分钟 | | 乌鲁木齐 | 87.6°E | -129.6分钟 | -1.4分钟 | -131.0分钟 | | 拉萨 | 91.1°E | -115.6分钟 | -1.4分钟 | -117.0分钟 | ## 代码使用方法 ### 基本调用 ```typescript import { calculateApparentSolarTime } from './index'; // 计算真太阳时 const result = calculateApparentSolarTime('2024-06-21 12:00:00', 116.4); console.log(result); // 输出:2024-06-21 11:44:12 ``` ### 批量计算 ```typescript const locations = [ { name: '北京', longitude: 116.4 }, { name: '上海', longitude: 121.5 }, { name: '乌鲁木齐', longitude: 87.6 } ]; const beijingTime = '2024-06-21 12:00:00'; locations.forEach(location => { const solarTime = calculateApparentSolarTime(beijingTime, location.longitude); console.log(`${location.name}: ${solarTime}`); }); ``` ### 错误处理 ```typescript try { const result = calculateApparentSolarTime('invalid-date', 116.4); } catch (error) { console.error('计算失败:', error.message); } ``` ## 应用场景 ### 1. 紫微斗数排盘 在紫微斗数中,准确的出生时辰对排盘结果至关重要。使用真太阳时可以: - 确保时辰划分的准确性 - 避免因地理位置差异导致的时辰错误 - 提高命盘的精确度 ### 2. 天文观测 - 日晷校准 - 太阳位置计算 - 天文摄影规划 ### 3. 历史研究 - 古代时间记录的现代转换 - 历史事件的精确时间定位 ## 技术细节 ### 数值稳定性 1. **角度规范化**:所有角度值都规范化到0-360度范围 2. **精度控制**:使用双精度浮点数进行计算 3. **边界处理**:对极值情况进行特殊处理 ### 性能优化 1. **预计算常数**:将不变的常数预先计算 2. **三角函数优化**:减少重复的三角函数计算 3. **内存管理**:避免不必要的对象创建 ### 扩展性 算法设计考虑了未来的扩展需求: - 支持更高精度的行星理论 - 可添加大气折射修正 - 支持其他历法系统 ## 参考文献 1. Meeus, Jean. *Astronomical Algorithms*. 2nd Edition. Willmann-Bell, 1998. 2. Bretagnon, P., and Francou, G. "Planetary theories in rectangular and spherical variables - VSOP 87 solutions." *Astronomy and Astrophysics*, 202, 309-315 (1988). 3. IAU Working Group on Precession and the Ecliptic. "Expressions for IAU 2000 precession quantities." *Astronomy & Astrophysics*, 400, 1145-1154 (2003). 4. 中国科学院紫金山天文台. 《中国天文年历》. ## 版本历史 - **v1.0.0** (2024): 初始版本,基于《天文算法》实现 - 支持高精度真太阳时计算 - 集成地理编码功能 - 支持紫微斗数应用 ## 许可证 本算法实现遵循MIT许可证,可自由使用和修改。 --- *本文档详细介绍了真太阳时算法的理论基础、实现细节和应用方法。如有疑问或建议,欢迎提出issue或贡献代码。*

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/smogievogie/ziwei_iztro-mcpserver'

If you have feedback or need assistance with the MCP directory API, please join our Discord server