dsh-math-calculator 2.3.1 → 2.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +191 -0
- package/dsh.plugin.json +1 -1
- package/lib/formula-library-macro-materials.js +31 -2
- package/lib/help.js +185 -41
- package/lib/index.js +190 -35
- package/lib/ode.js +34 -0
- package/lib/ops/ode-op.js +42 -1
- package/lib/ops/recurrence-op.js +222 -0
- package/lib/ops/shared.js +19 -0
- package/lib/types/ode.d.ts +17 -0
- package/lib/types/ops/recurrence-op.d.ts +44 -0
- package/lib/types/ops/shared.d.ts +22 -1
- package/lib/units-data.js +29 -6
- package/package.json +1 -1
- package/src/formula-library-macro-materials.ts +31 -2
- package/src/help.ts +186 -41
- package/src/index.ts +190 -35
- package/src/ode.ts +46 -0
- package/src/ops/ode-op.ts +43 -1
- package/src/ops/recurrence-op.ts +215 -0
- package/src/ops/shared.ts +33 -0
- package/src/units-data.ts +29 -6
package/src/help.ts
CHANGED
|
@@ -269,30 +269,67 @@ const STATS_BODY = (): string => `【统计与概率】
|
|
|
269
269
|
A/B 结果差异是不是巧合 → t 分布`
|
|
270
270
|
|
|
271
271
|
/** 【微分方程】ODE 数值解。 */
|
|
272
|
-
const ODE_BODY = (): string =>
|
|
272
|
+
const ODE_BODY = (): string => `【动力学】连续用 ode,离散用 recurrence
|
|
273
273
|
|
|
274
|
+
★★ 先判断:你的模型是「连续变化」还是「按期结算」?
|
|
275
|
+
连续(每个人随时都在增长)→ ode
|
|
276
|
+
离散(年度结算、批次解锁、世代更替)→ recurrence
|
|
277
|
+
两者答案不同,写年表必须用离散值(见下面第 3 段)。
|
|
278
|
+
|
|
279
|
+
══ 1. ode:连续时间积分(RK4)══
|
|
274
280
|
一阶方程组(SIR / 捕食模型)与二阶方程(自动降阶)都能解。
|
|
275
281
|
|
|
276
282
|
参数:
|
|
277
|
-
expression
|
|
278
|
-
例:"S'=-k1*S*I; I'=k1*S*I-k2*I; R'=k2*I" ← SIR
|
|
279
|
-
"x'=y; y'=-k*x" ←
|
|
280
|
-
initial
|
|
283
|
+
expression 状态方程,分号分隔。等号左边是导数变量
|
|
284
|
+
例:"S'=-k1*S*I; I'=k1*S*I-k2*I; R'=k2*I" ← SIR
|
|
285
|
+
"x'=y; y'=-k*x" ← 简谐
|
|
286
|
+
initial 初值 {S:999, I:1, R:0}
|
|
281
287
|
from/to 积分区间(默认 0 → 10)
|
|
282
|
-
steps RK4 步数(默认 1000
|
|
283
|
-
samples
|
|
288
|
+
steps RK4 步数(默认 1000,刚性方程加大)
|
|
289
|
+
samples 返回采样点数(默认 24)
|
|
290
|
+
at ★ 要精确输出的时点,如 [5,10,20]
|
|
291
|
+
|
|
292
|
+
返回:轨迹、终点值、极值、指定时点的值、**发散警告**
|
|
293
|
+
|
|
294
|
+
★ at 是什么用的:默认采样是均匀的(t = 1, 2.9, 4.8, …),
|
|
295
|
+
写年表时「第 5 年、第 10 年」一个都对不上。传 at:[5,10,20] 就精确给那几个。
|
|
296
|
+
|
|
297
|
+
★ 二阶方程降阶:y'' 写成 y'=y_d; y_d'=…(y_d = dy/dt)。
|
|
298
|
+
缺辅助变量会提示补哪个,不会静默给错。
|
|
299
|
+
|
|
300
|
+
★ 数值解不是解析解:steps 太少会失真,刚性方程易发散 ——
|
|
301
|
+
看到发散警告就加大 steps,或换解析思路。
|
|
302
|
+
|
|
303
|
+
══ 2. recurrence:离散递推(出逐年表)══
|
|
304
|
+
{operation:"recurrence", recurrence:"P*2", initial:{P:1}, periods:20}
|
|
305
|
+
→ 逐期表 + 终值 + 与连续模型的差额
|
|
306
|
+
|
|
307
|
+
参数:
|
|
308
|
+
recurrence 下一期 = f(本期)。单状态最常见:
|
|
309
|
+
"P*2" ← 每期翻倍
|
|
310
|
+
"P*min(1.2, 1000/P)" ← 带资源上限的年度增长
|
|
311
|
+
initial 初值,可多个状态(逗号/分号分隔的表达式各自求一次)
|
|
312
|
+
periods 迭代期数(默认 12,上限 5000)
|
|
284
313
|
|
|
285
|
-
|
|
314
|
+
★ 支持 min()/max() 约束 —— 「增速 20% 但不超过 1000」这种写法直接可用,
|
|
315
|
+
结果会在第 38 期左右平滑收敛到 1000,不会越过。
|
|
286
316
|
|
|
287
|
-
|
|
288
|
-
|
|
317
|
+
══ 3. 为什么非要区分(实测数字)══
|
|
318
|
+
同一件事「从 1 起每年 ×2」:
|
|
319
|
+
离散(recurrence) 2^19 = 524,288
|
|
320
|
+
连续(ode, 0.693P) e^(0.693×19) = 522,824
|
|
321
|
+
差 0.28%
|
|
289
322
|
|
|
290
|
-
|
|
291
|
-
|
|
323
|
+
0.28% 看着可忽略,但第 33 年换成本「亿人」时差 0.5 亿 ——
|
|
324
|
+
**而写作时写的是「第 33 年,四十二亿人」这种具体整数。**
|
|
325
|
+
连续模型的 4.24e9 会让你在「42 亿还是 43 亿」上反复纠结。
|
|
292
326
|
|
|
293
|
-
★
|
|
294
|
-
|
|
295
|
-
|
|
327
|
+
★ 所以 recurrence 会在结果末尾直接给出「连续近似 vs 离散」的差额,
|
|
328
|
+
让你一眼看出「用 ode 顶替会差多少」。
|
|
329
|
+
|
|
330
|
+
★ 写故事时的常见用法:
|
|
331
|
+
传染病扩散(SIR)、捕食者-猎物振荡(Lotka-Volterra)、
|
|
332
|
+
碳循环、人口动态、冷却曲线、**逐年人口/资源年表**`
|
|
296
333
|
|
|
297
334
|
/** 【公式库】442 条公式的调用与检索。 */
|
|
298
335
|
const FORMULA_BODY = (): string => `【公式库】共 ${FORMULAS.length} 条自然科学公式
|
|
@@ -535,14 +572,70 @@ const RECIPE_BODY = (): string => `【锚点 sanity】工具不知道这个数
|
|
|
535
572
|
★ 结论通常是「不能靠扩散活,必须进化出循环 + 换气」,而不是「不可能」
|
|
536
573
|
—— 差别在于前者给了可行路径。
|
|
537
574
|
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
575
|
+
【材料推演】三层链:**微观决定 → 本构 → 构件失效**
|
|
576
|
+
分两档起步:① 只想要工程结论 → 从 B 开始,硬设定 E/σ_y/K_IC/ρ
|
|
577
|
+
② 想让材料「自洽地生出来」→ 从 A 开始,从键强度推
|
|
578
|
+
|
|
579
|
+
A. 微观决定(材料属性从基础物理量推出)
|
|
580
|
+
输入:每原子结合能(J)、原子间距、键的非谐性 γ
|
|
581
|
+
① melting_from_cohesive T_m ≈(2/3)·E_k/k_B
|
|
582
|
+
★ 反推设计:要熔点 2000°C → 需要多大结合能?这一条能算
|
|
583
|
+
⚠ 系数 0.036(不是 2/3!)由 12 种金属实测反算得来:
|
|
584
|
+
Fe 1797K vs 实测 1811(−0.8%)、W −0.5%、Mo −1.6%、Ag −0.4%
|
|
585
|
+
但 Al +52%、Mg +52% 偏高 —— 轻金属的结合能构成不同,别用它推轻合金
|
|
586
|
+
⚠ 输入是**每原子**结合能(J),若资料给 kJ/mol 要先除以 6.022e23
|
|
587
|
+
② ideal_strength σ_ideal ≈ E/10
|
|
588
|
+
★ 真正有用的是**比值**:实际强度只有理论的 1/100(工艺差) ~ 1/10(精密)
|
|
589
|
+
「这个文明的冶金水平」= 他们能发挥百分之几
|
|
590
|
+
③ pugh_ductility G/K >0.57 偏脆、<0.57 偏韧
|
|
591
|
+
★ 更强的键往往同增 K 与 G —— 这条检查「变强了但更脆」的副作用
|
|
592
|
+
④ gruneisen_expansion α = γ·C_v/(3KV)
|
|
593
|
+
★ 补闭环:原来 α 只能硬填,现在由 K、C_v、γ 推出来
|
|
594
|
+
⑤ wiedemann_franz κ/σ = L₀·T(L₀ 是基本常数)
|
|
595
|
+
★ 罕见的严格关系:设了电导率,导热系数自动定,不必两个都编
|
|
596
|
+
|
|
597
|
+
★ 关键的物理直觉:**结合能越深 → 势能井越陡 → E 越大 → 熔点与强度都上升**
|
|
598
|
+
所以「改基础物理量」不是各自拍脑袋,而是有方向、有幅度的推导。
|
|
599
|
+
|
|
600
|
+
B. 本构(应力 → 应变 → 失效)
|
|
601
|
+
输入:E、σ_y、K_IC、ρ
|
|
602
|
+
① hooke_law σ = E·ε。σ=200MPa → ε=1e-3
|
|
603
|
+
★ 弹性区公理;超屈服后失效,别用它算大变形
|
|
604
|
+
② safety_factor_check σ_allow = σ_y/n。200/235=1.18 → 低于 1.5,不安全
|
|
605
|
+
n 取 1.5~2(静载)/2~4(冲击)/3~6(疲劳)
|
|
606
|
+
③ fracture_kic σ_c = K_IC/(Y·√(πa))
|
|
607
|
+
5mm 裂纹 → 30e6/√(π·0.005)=239MPa(与屈服几乎相等)
|
|
608
|
+
★ σ_c ∝1/√a:裂纹 1mm→1cm,承载降 √10≈3.2 倍
|
|
609
|
+
⚠ 仅脆性/小范围屈服;高韧材料会低估(需 J 积分)
|
|
610
|
+
④ hall_petch σ_y = σ₀ + k_y·d^(−1/2)
|
|
611
|
+
★ 同一成分,晶粒细化一档强度可翻倍
|
|
612
|
+
「锻造水平」= 这个文明能达到的 d
|
|
613
|
+
⚠ 有反 Hall-Petch 区(纳米晶反而变弱)
|
|
614
|
+
⑤ ashby_index M = E^a·σ^b/ρ^c
|
|
615
|
+
轻而刚的梁 E^½/ρ | 轻而强的梁 σ^(2/3)/ρ | 储能 σ²/E
|
|
616
|
+
★ 把「这合金轻又强」从形容词变成可比的数
|
|
617
|
+
|
|
618
|
+
C. 构件失效(接已有的工程公式)
|
|
619
|
+
buckling_euler / beam_bending_stress / beam_uniform_load_deflection / bolt_shear_capacity
|
|
620
|
+
★ 到这一步才谈「这根梁要多粗」—— 前面两层定材料,这层定尺寸
|
|
621
|
+
|
|
622
|
+
完整例子(铁:结合能 415 kJ/mol、E=2e11、σy=235MPa、K_IC=30MPa·√m、ρ=7850)
|
|
623
|
+
输入换算:415 kJ/mol ÷ 6.022e23 = 6.89e-19 J/原子
|
|
624
|
+
melting_from_cohesive → 1797 K(实测铁 1811 K,−0.8% ✓ 自洽)
|
|
625
|
+
ideal_strength → 2e10 Pa = 20 GPa(理论值上限)
|
|
626
|
+
实际/理论 = 235e6/2e10 = **1.2%** → 属「工艺一般」而非精密
|
|
627
|
+
(精密工艺能到 10%,差一个数量级 —— 这就是该调的世界观参数)
|
|
628
|
+
pugh_ductility 设 G=8e10、K=1.6e11 → 0.5 <0.57,韧性好 ✓
|
|
629
|
+
hooke_law 200MPa → ε=1e-3
|
|
630
|
+
safety_factor_check 许用 156.7MPa,而实际 200MPa
|
|
631
|
+
200/156.7=1.28 → 只有 1.28 倍余量,低于要求的 1.5
|
|
632
|
+
fracture_kic 5mm 裂纹时 σ_c=239MPa,与屈服 235MPa 之比 **1.02**
|
|
633
|
+
★ 结论:这钢的瓶颈不在强度而在**裂纹容限**——
|
|
634
|
+
5mm 裂纹就让承载降到屈服线,所以要定期探伤、限制缺陷尺寸。
|
|
635
|
+
这是单看屈服强度绝对推不出来的结论。
|
|
636
|
+
|
|
637
|
+
★ 一条纪律:工具**不判断你的材料合不合理**,只保证「基于你给的性质,后果算对」。
|
|
638
|
+
A 层给方向、B 层给数值、C 层给尺寸 —— 想让哪层自洽,就从哪层起步。
|
|
546
639
|
|
|
547
640
|
【失败时】返回 ok=false + error.type / message / hint,按 hint 修正即可,不会崩溃。
|
|
548
641
|
常见 error.type:
|
|
@@ -776,7 +869,7 @@ export const HELP_TOPICS: HelpTopic[] = [
|
|
|
776
869
|
tier: 'core',
|
|
777
870
|
/** 实践文档信号量 250,断层第一:算术/带单位/批量/label 全落在这一节。 */
|
|
778
871
|
weight: 250,
|
|
779
|
-
title: '
|
|
872
|
+
title: '求值 evaluate',
|
|
780
873
|
summary: '算一条式子。物理量带单位写,量纲错当场拦下;批量一次多条。',
|
|
781
874
|
aliases: ['算式', '计算', '求值', 'mathjs', 'expression'],
|
|
782
875
|
body: EVALUATE_BODY,
|
|
@@ -790,7 +883,7 @@ export const HELP_TOPICS: HelpTopic[] = [
|
|
|
790
883
|
* 前者要写方程、要看解的形式(唯一解/无穷多解/无解)。
|
|
791
884
|
*/
|
|
792
885
|
weight: 59,
|
|
793
|
-
title: '解方程与微积分(solve
|
|
886
|
+
title: '解方程与微积分(solve)',
|
|
794
887
|
summary: '解方程与方程组、符号求导积分。退化方程组会说「无穷多解」而非静默给单解。',
|
|
795
888
|
aliases: ['方程', '求解', 'solve', '积分', '求导', '微积分', 'algebra'],
|
|
796
889
|
body: ALGEBRA_BODY,
|
|
@@ -800,7 +893,7 @@ export const HELP_TOPICS: HelpTopic[] = [
|
|
|
800
893
|
tier: 'core',
|
|
801
894
|
/** 信号量 173:中制单位(里/丈/斤/亩)与 to 换算在各文档频繁出现。 */
|
|
802
895
|
weight: 173,
|
|
803
|
-
title: '
|
|
896
|
+
title: '单位换算 units',
|
|
804
897
|
summary: '中外古今单位换算、自定义单位,以及输出为什么是大数配吨/公里。',
|
|
805
898
|
aliases: ['单位', '换算', '里', '丈', '斤', '亩', 'unit', 'conversion'],
|
|
806
899
|
body: UNITS_BODY,
|
|
@@ -821,7 +914,7 @@ export const HELP_TOPICS: HelpTopic[] = [
|
|
|
821
914
|
/** 信号量 26。 */
|
|
822
915
|
weight: 26,
|
|
823
916
|
title: '世界观推演(world / 地形 / 气候)',
|
|
824
|
-
summary: '
|
|
917
|
+
summary: '星球参数 → 体感画像:重力昼夜气候、天空、恒星寿命、卫星、生命闸门。★ 字段表在这。',
|
|
825
918
|
aliases: ['星球', '世界', '重力', '气候', '恒星', '地形', 'world', 'planet'],
|
|
826
919
|
body: WORLD_BODY,
|
|
827
920
|
},
|
|
@@ -838,7 +931,7 @@ export const HELP_TOPICS: HelpTopic[] = [
|
|
|
838
931
|
/** 新增节,文档中尚无信号;按用户明确要求保留 core。 */
|
|
839
932
|
weight: 0,
|
|
840
933
|
title: '工程 / 生物 / 材料 / 财政 / 宏观(57 条领域公式)',
|
|
841
|
-
summary: '
|
|
934
|
+
summary: '梁柱应力、热机煤耗、泵功率;扩散供氧、异速生长;胡克与断裂韧性、熔点与结合能;财政赤字与债务螺旋。★ 每条都写了 scaling 律。',
|
|
842
935
|
aliases: ['工程', '生物', '材料', '经济', '宏观', '财政', '税收', '债务', '建筑', '结构', '热机', '流体', '生态', '畜牧', '通胀', '作物'],
|
|
843
936
|
body: DOMAINS_BODY,
|
|
844
937
|
},
|
|
@@ -866,13 +959,30 @@ export const HELP_TOPICS: HelpTopic[] = [
|
|
|
866
959
|
},
|
|
867
960
|
{
|
|
868
961
|
key: 'ode',
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
962
|
+
/**
|
|
963
|
+
* ★ 从 extra 提到 core(2026-11-08)。
|
|
964
|
+
*
|
|
965
|
+
* 实测反馈里最重的一条:该会话「写了 300 行 Python 做逐年迭代、参数扫描、
|
|
966
|
+
* 双状态耦合」,而 ode 就在那里 —— 只是排在「低频」栏的最后一行。
|
|
967
|
+
*
|
|
968
|
+
* 所以「低频」这个分档本身是错的:它表达的是「用得少」,
|
|
969
|
+
* 但用得少不等于「该在想建模时绕过它」。
|
|
970
|
+
*/
|
|
971
|
+
tier: 'core',
|
|
972
|
+
/**
|
|
973
|
+
* 权重从 4 提到 60。
|
|
974
|
+
*
|
|
975
|
+
* 原来的 4 是「实践文档里出现 4 次」的信号量 —— 但这只反映**已经发生的使用**,
|
|
976
|
+
* 不反映**该用而没用的机会数**。实测那份会话里手写了 6 个脚本做逐年迭代,
|
|
977
|
+
* 那些都该是一次 ode/recurrence 调用。所以按「错过的机会」重估。
|
|
978
|
+
*/
|
|
979
|
+
weight: 60,
|
|
980
|
+
short: '微分方程与递推',
|
|
981
|
+
title: '动力学:微分方程与离散递推(ode / recurrence)',
|
|
982
|
+
summary:
|
|
983
|
+
'连续用 ode(RK4,支持 min() 约束/多状态);离散用 recurrence 出逐年表。' +
|
|
984
|
+
'★ 写年表用离散值;ode 传 at:[5,10,20] 精确取那几个年份。',
|
|
985
|
+
aliases: ['微分方程', 'ode', '递推', 'recurrence', '逐年', '年表', '增长模型', '传染病', '捕食模型', 'rk4'],
|
|
876
986
|
body: ODE_BODY,
|
|
877
987
|
},
|
|
878
988
|
{
|
|
@@ -899,12 +1009,13 @@ export const HELP_TOPICS: HelpTopic[] = [
|
|
|
899
1009
|
},
|
|
900
1010
|
{
|
|
901
1011
|
key: 'derivation',
|
|
902
|
-
|
|
1012
|
+
/** 同上,从 extra 提到 core:参数扫描与结论翻转是建模的一部分。 */
|
|
1013
|
+
tier: 'core',
|
|
903
1014
|
/** 信号量 21。 */
|
|
904
1015
|
weight: 21,
|
|
905
1016
|
short: '推演栈 29 子命令',
|
|
906
1017
|
title: '推演栈(derivation 子命令)',
|
|
907
|
-
summary: '
|
|
1018
|
+
summary: '敏感度/结论翻转/逆推校准/相图/算力预算等 29 子命令。★ 全部子命令在这。',
|
|
908
1019
|
aliases: ['推演', 'derivation', '混沌', '白皮书', '相图', '敏感度', '算力'],
|
|
909
1020
|
body: DERIVATION_BODY,
|
|
910
1021
|
},
|
|
@@ -921,12 +1032,13 @@ export const HELP_TOPICS: HelpTopic[] = [
|
|
|
921
1032
|
},
|
|
922
1033
|
{
|
|
923
1034
|
key: 'recipe',
|
|
924
|
-
|
|
1035
|
+
/** 同上:配方是「怎么把上面几个串起来」,属于建模段。 */
|
|
1036
|
+
tier: 'core',
|
|
925
1037
|
/** 信号量 17。 */
|
|
926
1038
|
weight: 17,
|
|
927
1039
|
short: '锚点/账本/错误码',
|
|
928
1040
|
title: '常见配方(锚点/账本闭合/多步链/错误码)',
|
|
929
|
-
summary: '
|
|
1041
|
+
summary: '锚点比对、账本闭合、多步链、三条推演配方(文明/巨兽/材料)、错误码。',
|
|
930
1042
|
aliases: ['锚点', 'sanity', '账本', '闭合', '多步', '错误', '配方'],
|
|
931
1043
|
body: RECIPE_BODY,
|
|
932
1044
|
},
|
|
@@ -1001,12 +1113,45 @@ function renderIndex(): string {
|
|
|
1001
1113
|
const byWeight = (a: HelpTopic, b: HelpTopic) => (b.weight ?? 0) - (a.weight ?? 0)
|
|
1002
1114
|
const core = HELP_TOPICS.filter((item) => item.tier === 'core').sort(byWeight)
|
|
1003
1115
|
const extra = HELP_TOPICS.filter((item) => item.tier === 'extra').sort(byWeight)
|
|
1116
|
+
/**
|
|
1117
|
+
* ## 目录分三段:算术 / 建模与推演 / 其余
|
|
1118
|
+
*
|
|
1119
|
+
* 实测反馈(能力评估文档第 4 节)是本轮最重的一条:
|
|
1120
|
+
*
|
|
1121
|
+
* > 「一个能做动力学 + 参数扫描 + 499 条领域公式的工具,被排在了『低频』栏里。」
|
|
1122
|
+
* > 「我写了 300 行 Python 做逐年迭代、参数扫描、双状态耦合 ——
|
|
1123
|
+
* > 而 ode、sensitivity、formula 就在那里,只是排在了『低频』栏的最后一行。」
|
|
1124
|
+
*
|
|
1125
|
+
* 原始证据也很硬:该会话调用 math_execute 18 次、手写 Python 6 个脚本约 300 行,
|
|
1126
|
+
* 而脚本做的事(逐年迭代、参数扫描、状态耦合)工具全都有对应的 operation。
|
|
1127
|
+
*
|
|
1128
|
+
* ## 所以改动只有一处,但很关键
|
|
1129
|
+
*
|
|
1130
|
+
* 不是「再加一句说明」,而是**把建模类从『低频』栏里提出来单独成段**。
|
|
1131
|
+
* 因为「低频」这个词本身就在劝退 —— 它表达的是「用得少」,
|
|
1132
|
+
* 而 `ode` 用得少不代表不该在写增长模型时想起它。
|
|
1133
|
+
*
|
|
1134
|
+
* 并且在这一段的开头直接给一句**触发词**:「正在手写循环/逐年表/参数扫描?先看这几节」。
|
|
1135
|
+
* 文档的建议原话也是这句:「能力不缺,缺的是一句『你正在手写循环?先看这里』」。
|
|
1136
|
+
*/
|
|
1137
|
+
const MODELING_KEYS = ['ode', 'formula', 'derivation', 'recipe', 'world', 'domains']
|
|
1138
|
+
const isModeling = (topic: HelpTopic) => MODELING_KEYS.includes(topic.key)
|
|
1139
|
+
const arithmetic = core.filter((topic) => !isModeling(topic))
|
|
1140
|
+
const modeling = core.filter(isModeling)
|
|
1004
1141
|
const lines: string[] = [
|
|
1005
1142
|
'══════ math_execute 能力目录(' + HELP_TOPICS.length + ' 节)══════',
|
|
1006
1143
|
'helpTopic:"键名" 取该节全文;也可用中文词(矩阵/星球/单位…)。',
|
|
1007
1144
|
'',
|
|
1145
|
+
' ── 一、算术 ──',
|
|
1008
1146
|
]
|
|
1009
|
-
for (const topic of
|
|
1147
|
+
for (const topic of arithmetic) {
|
|
1148
|
+
lines.push(' ' + topic.key.padEnd(10) + topic.title)
|
|
1149
|
+
lines.push(' ' + topic.summary)
|
|
1150
|
+
}
|
|
1151
|
+
lines.push('')
|
|
1152
|
+
lines.push(' ── 二、建模与推演 ──')
|
|
1153
|
+
lines.push(' ★ 正在手写循环 / 逐年表 / 参数扫描?先看这几节,别用脚本重写')
|
|
1154
|
+
for (const topic of modeling) {
|
|
1010
1155
|
lines.push(' ' + topic.key.padEnd(10) + topic.title)
|
|
1011
1156
|
lines.push(' ' + topic.summary)
|
|
1012
1157
|
}
|
|
@@ -1016,7 +1161,7 @@ function renderIndex(): string {
|
|
|
1016
1161
|
* 而它们本来只是「顺带知道一下」的存在。
|
|
1017
1162
|
*/
|
|
1018
1163
|
lines.push('')
|
|
1019
|
-
lines.push('
|
|
1164
|
+
lines.push(' ── 三、其余能力(同样可查,正文里有完整说明)──')
|
|
1020
1165
|
const folded = extra.map(function (item) {
|
|
1021
1166
|
const label = item.short ?? item.title.slice(0, 8)
|
|
1022
1167
|
return item.key + '=' + label
|