Files
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 Permalink 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/