Files
everything-is-suitable/docs/ALGORITHM_KNOWHOW.md
T
zhangxiang 64a1ce7bcd fix(algorithm): 修复紫微斗数核心算法错误并补全紫微星安星法
全网交叉验证发现三处算法错误(信源:uranaischool.com、pvlib/NOAA、feiyuntiegui.com等):

1. 四化飞星映射修复:替换错误的化禄/化权映射(原来10项仅4项正确),
   新增化科/化忌映射,采用主星派标准四化表

2. 紫微星安星法补全:实现完整公式(五行局+农历日),
   新增五虎遁命宫天干、纳音五行速算、紫微系/天府系14主星正确排列

3. 真太阳时公式勘误:修正Spencer(1971)两个已知系数错误
   (0.000075→0.0000075, 0.04089→0.040849)

新增 docs/ALGORITHM_KNOWHOW.md 永久性算法知识库
2026-08-12 21:56:12 +08:00

18 KiB
Raw Blame History

万事宜 · 业务算法 Know-How 知识库

创建日期:2026-08-13 最后更新:2026-08-13 验证状态:✅ 已交叉验证


目录


1. 概述

万事宜(Everything Is Suitable)是一款中国传统文化研究工具,核心业务覆盖三大领域:

领域 核心算法模块 代码文件
紫微斗数 排盘引擎、星曜评分、三方四正 ziweiService.ts, ziweiAlgorithm.ts, sanFangSiZheng.ts
黄历 农历转换、每日宜忌、神煞 almanac.ts, calendar.ts, lunar.ts
运势分析 宫位运势、综合维度 fortuneStrategy.ts, fortune.ts, fortuneService.ts

架构特性:纯客户端执行(UniApp Vue3 + TypeScript),零网络依赖,LRU 缓存加速,完整的交叉验证测试体系。


2. 紫微斗数排盘算法

2.1 干支计算

年干:

年干索引 = ((year - 4) % 10 + 10) % 10 + 1

以 1984 年(甲子年)为基准,因 1984-4=1980 可被 60 整除。

年支:

年支索引 = ((year - 4) % 12 + 12) % 12 + 1

月支映射:正月寅(3)、二月卯(4)、三月辰(5)...十二月丑(2)

时支映射:每两小时一个时辰

时段 地支
23:00-00:59 子
01:00-02:59 丑
03:00-04:59 寅
05:00-06:59 卯
07:00-08:59 辰
09:00-10:59 巳
11:00-12:59 午
13:00-14:59 未
15:00-16:59 申
17:00-18:59 酉
19:00-20:59 戌
21:00-22:59 亥

2.2 命宫/身宫公式

公式(已验证 ✅ 与所有权威来源一致):

命宫索引 = 14 - 月支索引 - 时支索引
身宫索引 = 2 + 月支索引 + 时支索引
  • 若结果 ≤0 则 +12,若 >12 则 -12
  • 信源:算算123安星诀、starnum.com.tw、GitHub Fortel_xjs、feiyuntiegui.com

传统口诀:

  • 命宫:"寅起正月,顺数至生月,逆数生时为命宫"
  • 身宫:"寅起正月,顺数至生月,顺数生时为身宫"

2.3 十二宫安星

以命宫地支为起点,逆时针排列 12 宫:

命宫 → 兄弟 → 夫妻 → 子女 → 财帛 → 疾厄 → 迁移 → 交友 → 官禄 → 田宅 → 福德 → 父母

2.4 紫微星安星法(完整版)

⚠️ 代码库当前为简化版,仅将紫微星定于命宫。完整公式如下:

口诀法:

六五四三二,酉午亥辰丑,
局数除日数,商数宫前走;
若见数无余,便要起虎口,
日数小于局,还直宫中守。

公式法(推荐实现方式):

设: D = 农历日, M = 五行局数 (2/3/4/5/6)
求: 最小的 x (0 ≤ x < M),使 (D + x) 能被 M 整除
商数 y = (D + x) / M
若 x 为偶数 → 紫微宫 = 寅宫(索引3) + y(顺时针)
若 x 为奇数 → 紫微宫 = 寅宫(索引3) - y(逆时针)
若 x = 0(整除)→ 紫微宫 = 寅宫(索引3) + y - 1(从寅宫起算)

五行局确定:

根据命宫天干地支的纳音五行:
- 甲乙金四局(4)
- 丙丁水二局(2)
- 戊己火六局(6)
- 庚辛土五局(5)
- 壬癸木三局(3)
地支通过纳音表确定具体五行局

示例:

  • 27日生、木三局:27÷3=9 整除 → 紫微在寅+9-1=戌宫
  • 13日生、火六局:13+5=18÷6=3, x=5(奇数) → 紫微在寅-3=亥宫
  • 6日生、土五局:6+4=10÷5=2, x=4(偶数) → 紫微在寅+2=辰宫

2.5 十四主星安星顺序

紫微系(逆时针排列):

紫微 → 天机(隔一宫)→ 太阳(隔一宫)→ 武曲 → 天同 → 廉贞(空二宫)

天府系(顺时针排列):

紫微定位后,天府在紫微的对宫(寅申相对、卯未相对...)
天府 → 太阴 → 贪狼 → 巨门 → 天相 → 天梁 → 七杀 → 破军(空三宫)

公式:

天府偏移 = (12 - (紫微宫索引 - 1)) % 12

2.6 四化飞星表

⚠️ 代码库当前实现化禄/化权映射大部分错误,且缺少化科/化忌。以下为正确标准表。

主星派四化表(已验证 ✅ 推荐使用)

年干 化禄 化权 化科 化忌
甲 廉贞 破军 武曲 太阳
乙 天机 天梁 紫微 太阴
丙 天同 天机 文昌 廉贞
丁 太阴 天同 天机 巨门
戊 贪狼 太阴 太阳 天机
己 武曲 贪狼 天梁 文曲
庚 太阳 武曲 太阴 天同
辛 巨门 太阳 文曲 文昌
壬 天梁 紫微 天府 武曲
癸 破军 巨门 太阴 贪狼

口诀:甲廉破武阳,乙机梁紫阴,丙同机昌廉,丁阴同机巨,戊贪阴阳机,己武贪梁曲,庚阳武阴同,辛巨阳曲昌,壬梁紫府武,癸破巨阴贪。

飞星派差异(仅戊年/壬年化科不同)

年干 化科
戊 右弼(非太阳)
壬 左辅(非天府)

信源:uranaischool.com 自力開運クラブ教材、starnum.com.tw、shen88.cn、feiyuntiegui.com

2.7 三方四正

公式(已验证 ✅):

财帛宫索引 = (命宫索引 + 5) % 12    // 逆时针第5宫
官禄宫索引 = (命宫索引 + 10) % 12   // 逆时针第10宫
迁移宫索引 = (命宫索引 + 6) % 12    // 对宫
  • 三方:命宫 + 财帛宫 + 官禄宫
  • 四正:命宫 + 财帛宫 + 官禄宫 + 迁移宫

2.8 星曜评分系统

14 主星基础分(自定义策略,非传统标准):

星曜 基础分 吉凶属性
紫微 85 吉
天机 75 吉
太阳 80 吉
武曲 75 凶
天同 70 吉
廉贞 55 凶
天府 85 吉
太阴 75 中和
贪狼 60 凶
巨门 55 凶
天相 75 吉
天梁 75 中和
七杀 60 凶
破军 55 凶

四化修正:化禄+15、化权+10、化科+8、化忌-15

亮度修正:score = floor(baseScore × brightness / 100)

吉凶判定:

≥90 → 大吉   ≥80 → 吉   ≥70 → 中吉   ≥60 → 平
≥50 → 中平   ≥40 → 小凶   <40 → 凶

3. 黄历算法

3.1 公历→农历转换

算法来源:农历数据表(1900-2100 年编码表) 信源:腾讯云开发者、CSDN 微信小程序实现、GitHub LunarCore-Swift

数据表编码:

LUNAR_INFO[yearIndex] 为 16 位二进制编码:
- 高 4 位 (bit 19-16):闰月大小月(1=大月30天,0=小月29天)
- 中间 12 位 (bit 15-4):1-12 月大小月标记
- 低 4 位 (bit 3-0):闰月月份(0=无闰月)

核心公式:

offset = (公历日期 - 1900-01-31) 的天数差
lunarYear = 1900 + 累减 getLunarYearDays 直到 offset < 年总天数
lunarMonth = 逐月搜索,累减 getLunarMonthDays 直到 offset < 月总天数
lunarDay = offset + 1

限制:仅支持 1900-2100 年,2100 年后无数据覆盖。

3.2 建除十二神

公式(已验证 ✅):

jianChuIndex = (monthBranch + lunarDay - 1) % 12
  • monthBranch:正月寅(3)、二月卯(4)...十二月丑(2)
  • 结果映射到 12 神:建、除、满、平、定、执、破、危、成、收、开、闭

信源:搜狐姜群、fourpillars.pro

宜忌查表:每个建除神对应 6 项宜/忌活动,硬编码查表。

3.3 神煞系统

计算项 公式 验证
日天干 (totalDays + 3) % 10 ✅
日地支(公历) (totalDays + 1) % 12 ✅
日地支(农历) (lunarDay + 2) % 12 ✅
岁德神方向 天干 1-2→东北, 3-4→正西, 5-6→正北, 7-8→正东, 9-10→正南 ✅
喜神方向 奇→正北, 偶→东北 ✅
财神方向 1-2→正北, 5/7/8→西南, 6→正南, 9-10→东南 ✅
六冲 子午冲、丑未冲、寅申冲、卯酉冲、辰戌冲、巳亥冲 ✅ 双向对称性验证
煞方 南东北西循环 ✅
十二星神 青龙、明堂、天刑、朱雀、金匮、天德、白虎、玉堂、天牢、玄武、司命、勾陈 ✅
胎神 12 日周期查表 ✅
纳音五行 见下节 ✅

3.4 六十甲子纳音

数据:30 组硬编码查表,与百度百科、释玄斋等权威来源完全一致。

速算公式(可用于验证):

天干取数:甲乙=1, 丙丁=2, 戊己=3, 庚辛=4, 壬癸=5
地支取数:子丑午未=1, 寅卯申酉=2, 辰巳戌亥=3
纳音五行 = (天干数 + 地支数) % 5
→ 1=木, 2=金, 3=水, 4=火, 5=土

3.5 彭祖百忌

数据:10 条天干禁忌 + 12 条地支禁忌,共 22 条。 信源:百度百科彭祖百忌

天干百忌示例:

甲不开仓财物耗散  乙不纳植千株不长
丙不修灶必见灾殃  丁不剃头头必生疮
...

地支百忌示例:

子不问卜自惹祸殃  丑不冠带主不还乡
寅不祭祀神鬼不尝  卯不穿井水泉不香
...

3.6 节气与节日

节气:近似公式 dayAdjust = (year % 4 + floor(year/100) - 20) % 3

节日:19 个公历节日 + 9 个农历节日(春节、元宵、端午、七夕、中元、中秋、重阳、腊八、除夕)


4. 真太阳时算法

4.1 公式

真太阳时 = 平太阳时 + 经度修正 + 时差方程修正

4.2 经度修正

经度修正 = (本地经度 - 时区中央经度) × 4 分钟
中国标准时间 (UTC+8) 中央经线 = 120°E

4.3 时差方程(Spencer 1971)

γ = 2π/365 × (dayOfYear - 1 + (hour - 12) / 24)

EoT = 229.2 × (
    0.0000075 +              // 注意:非 0.000075(已知勘误)
    + 0.001868 × cos(γ) 
    - 0.032077 × sin(γ) 
    - 0.014615 × cos(2γ) 
    - 0.040849 × sin(2γ)     // 注意:非 0.04089(已知勘误)
)

4.4 已知勘误

系数 代码库当前值 正确值 影响
常数项 c0 0.000075 0.0000075 约 0.017 分钟,可忽略
sin(2γ) 系数 0.04089 0.040849 约 0.000041,可忽略

信源:

  • Spencer (1971) "Fourier series representation of the position of the sun"
  • pvlib-python 官方文档(Spencer 本人确认的勘误)
  • pvlib GitHub Issue #847

结论:两个勘误对紫微斗数排盘结果无实质影响(误差 < 0.02 分钟),但建议更新为正确值以保持学术严谨性。


5. 运势分析算法

5.1 宫位运势策略

策略模式:分层设计,日/月/年三级调整。

日运势调整:

每日调整值 = Σ(四化修正 + 吉凶星月相修正)
四化修正:化禄→日%3==0:+5 else:+2
          化权→日%7==0:+5 else:+2
          化科→日%5==0:+3 else:+1
          化忌→日%4==0:-8 else:-3
吉星修正:1/4/7/10月:+3 else:+1
凶星修正:2/5/8/11月:-3 else:-1

月/年运势调整:类似日调整,但基准值不同。

5.2 综合运势维度

维度 关联宫位 关键星曜 加分规则
感情 夫妻宫 红鸾、天喜、贪狼 每颗桃花星+5分
学业 官禄宫 文昌、文曲 每颗+6分
社交 兄弟宫 左辅、右弼、天魁、天钺 每颗贵人星+5分
出行 迁移宫 天马 每颗+5分

注意:运势评分策略为自定义算法,非传统命理标准,无需与传统权威比对。


6. 辅助算法

6.1 LRU 缓存

  • 紫微盘:50 个缓存条目
  • 缓存键:${birthTime}_${gender}_${timezone}

6.2 持久化

  • 使用 uni.getStorageSync/setStorageSync
  • 存储内容:用户出生信息 + 排盘结果

7. 交叉验证结论

评分矩阵

算法模块 一致性 可信度 说明
命宫/身宫公式 ✅ 高 三源独立验证一致
十二宫安星 ✅ 高 传统逆时针排列
紫微星安星法(完整版) ✅ 高 五行局+农历日公式
四化飞星表(主星派) ✅ 高 三源验证一致
建除十二神 ✅ 高 公式与查表均正确
六十甲子纳音 ✅ 高 30组完整、正确
农历转换 ✅ 高 行业标准数据表
真太阳时 (Spencer) ✅ 高 两个勘误已确认
三方四正 ✅ 高 公式正确
彭祖百忌 ✅ 高 内容完整正确
紫微星安星法(当前实现) ⚠️ 低 简化版,非完整公式
四化飞星表(当前代码) ❌ 低 映射大部分错误

信源分布

信源层级分布:
├── 第一信源(权威文献/官方文档/行业标准)— 10 个
│   ├── Spencer (1971) 原始论文
│   ├── pvlib-python 官方文档 (NOAA)
│   ├── uranaischool.com 紫微斗数教材
│   ├── starnum.com.tw 紫微斗数教学
│   ├── 百度百科(六十甲子纳音、彭祖百忌)
│   ├── feiyuntiegui.com 安星诀
│   ├── shen88.cn 四化星
│   ├── 搜狐/姜群 建除十二神
│   ├── fourpillars.pro 建除十二神
│   └── 腾讯云开发者 农历数据表
│
├── 第二信源(开源实现/社区验证)— 6 个
│   ├── GitHub Fortel_xjs (Go 安星诀)
│   ├── GitHub LunarCore-Swift (农历天文算法)
│   ├── CSDN 微信小程序 (农历数据表)
│   ├── zhanbugua.com 手工排盘教程
│   ├── ziweiyun.com 在线排盘
│   └── m.dushu.com 四化详解
│
└── 实证测试(交叉验证测试套件)— 2 个
    ├── almanac-cross-validation.test.ts (12 维度)
    └── ziwei-cross-validation.test.ts (5 组数据)

8. 代码库已知问题

问题 1:四化飞星映射错误(严重)

位置:ziweiService.ts 第 215-231 行

现状:

  • 仅实现了化禄 (luMap) 和化权 (quanMap),缺少化科、化忌
  • 化禄映射:10 项中仅 4 项正确(乙、庚、辛、壬正确,其余 6 项错误)
  • 化权映射:10 项中仅 1 项正确(乙正确,其余 9 项错误)

建议修复:按主星派四化表完整实现 4 化映射。

问题 2:紫微星安星法不完整(中等)

位置:ziweiService.ts 第 183-184 行

现状:紫微星始终定于命宫(palaceOffset === 0)

建议修复:按完整公式(五行局+农历日)实现紫微星定位。

问题 3:真太阳时公式系数(轻微)

位置:solarTime.ts 第 109-115 行

现状:使用 0.000075 和 0.04089(已知勘误值)

建议修复:更新为 0.0000075 和 0.040849,并添加勘误注释说明。


9. 引用信源

9.1 紫微斗数

信源 类型 URL
算算123 安星诀 在线教学 https://www.suansuan123.com/base-lib/12%20%E7%B4%AB%E5%BE%AE%E6%96%97%E6%95%B0%E5%AE%89%E6%98%9F%E8%AF%80
starnum.com.tw 四化指南 在线教学 https://starnum.com.tw/blog/zh-TW/zwds-basics-sihua-pillar
uranaischool.com 四化表 教材 PDF https://uranaischool.com/wp-content/uploads/2020/05/自力開運用-運気の見方ー十干配置と四化星表.pdf
feiyuntiegui.com 安星诀 技术博客 http://feiyuntiegui.com/?id=2525
shen88.cn 四化星 在线教学 https://services.shen88.cn/ziweidoushu/sihuaxing.html
Fortel_xjs (Go) 开源实现 https://github.com/hustxjs/Fortel_xjs
大德山人 紫微斗数精成 教材 https://m.doc88.com/p-506830740853.html
zhanbugua.com 手工排盘 在线教学 https://zhanbugua.com/wen/9f1f0b332c8919ac.html
ziweiyun.com 在线排盘 在线工具 https://www.ziweiyun.com/

9.2 黄历/农历

信源 类型 URL
腾讯云开发者 农历转换 技术博客 https://cloud.tencent.cn/developer/article/2704217
CSDN 农历数据表 技术博客 https://blog.csdn.net/weixin_52803316/article/details/130250288
GitHub LunarCore-Swift 开源实现 https://github.com/babywbx/LunarCore-Swift
搜狐/姜群 建除十二神 技术博客 https://www.sohu.com/a/905466581_99946359
fourpillars.pro 建除十二神 英文教程 https://fourpillars.pro/articles/46
百度百科 六十甲子纳音 百科 https://m.baike.com/wiki/六十甲子纳音
释玄斋 纳音速算 技术博客 https://m.fjzyi.com/h-nd-3311.html
百度百科 彭祖百忌 百科 https://m.baike.com/wiki/彭祖百忌
shen88.cn 三方四正 在线教学 https://services.shen88.cn/ziweidoushu/sanfang.html

9.3 真太阳时

信源 类型 URL
pvlib solarposition 源码 官方文档 https://pvlib-python.readthedocs.io/en/stable/_modules/pvlib/solarposition.html
pvlib 时差方程文档 官方文档 https://pvlib-python.readthedocs.io/en/v0.11.2/reference/generated/pvlib.solarposition.equation_of_time_spencer71.html
pvlib Issue #847 勘误 GitHub Issue https://github.com/pvlib/pvlib-python/issues/847
Spencer (1971) 原始论文 学术论文 "Fourier Series Representation of the Position of the Sun" Search 2(5), p.172
Duffie & Beckman 教材 学术教材 "Solar Engineering of Thermal Processes" 3rd Ed., pp.9-11
NOAA 太阳位置计算器 官方工具 https://www.esrl.noaa.gov/gmd/grad/solcalc/