ocs-calculators 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/common/resistance.ts","../src/common/ice.ts","../src/data/wire-specs.ts","../src/data/tb2809-ampacity.ts","../src/tension/meta.ts","../src/tension/index.ts","../src/dropper/meta.ts","../src/dropper/index.ts","../src/wind/meta.ts","../src/wind/index.ts","../src/force/meta.ts","../src/force/index.ts","../src/ampacity/meta.ts","../src/ampacity/index.ts","../src/wear/meta.ts","../src/wear/index.ts","../src/copper/meta.ts","../src/copper/index.ts","../src/stroke/meta.ts","../src/stroke/index.ts","../src/wavespeed/meta.ts","../src/wavespeed/index.ts","../src/voltage-drop/meta.ts","../src/voltage-drop/index.ts","../src/curve-stagger/meta.ts","../src/curve-stagger/index.ts","../src/icing/meta.ts","../src/icing/index.ts"],"sourcesContent":["/**\n * 全库公共类型定义。\n *\n * 命名约定(重要):\n * 所有数值字段的单位都写在变量名末尾,例如 tensionKN / spanM / crossSectionMM2。\n * 工程计算里单位混淆是头号 bug 来源,宁可名字长,也不要靠注释记单位。\n */\n\n/**\n * 每个计算器模块必须导出的元信息。\n * 这是本库区别于\"玩具代码\"的核心 —— 公式、依据、适用范围、免责声明全部可机读。\n */\nexport interface CalculatorMeta {\n /** 计算器中文名 */\n readonly name: string;\n /** 计算器英文名,用于国际检索 */\n readonly nameEn: string;\n /** 一句话用途说明 */\n readonly summary: string;\n /** 核心公式,LaTeX 或纯文本,可多条 */\n readonly formula: readonly string[];\n /** 参考依据:标准号、设计手册、教材。注意标注该标准是否真正包含此公式 */\n readonly references: readonly string[];\n /** 适用范围与已知限制 */\n readonly scope: readonly string[];\n /** 免责声明 */\n readonly disclaimer: string;\n /** 在线版本地址 */\n readonly online: string;\n}\n\n/** 重力加速度,N/kg(m/s²) */\nexport const G0 = 9.81;\n","/**\n * 电阻温度修正 —— copper 与 voltage-drop 共用。\n *\n * ⚠️ 注意别与线膨胀系数混淆:\n * - 本文件的 α = 0.00393 /℃ 是**电阻**温度系数\n * - wire-specs 的 COPPER_ALLOY_ALPHA_PER_DEG_C = 1.7e-5 /℃ 是**热膨胀**系数\n * 两者相差两个数量级,混用会导致结果严重偏离。\n */\n\n/** 铜的电阻温度系数,1/℃ */\nexport const COPPER_ALPHA_PER_DEG_C = 0.00393;\n\n/** IACS 退火铜 20℃ 标准电阻率,Ω·mm²/m(= 1/58) */\nexport const IACS_RESISTIVITY_OHM_MM2_PER_M = 0.017241;\n\n/**\n * 单位电阻温度修正:r_T = r₂₀·[1 + α·(T − 20)]。\n *\n * @param r20OhmPerKm 20℃ 单位电阻,Ω/km\n * @param tempDegC 环境温度,℃\n * @param alphaPerDegC 电阻温度系数,1/℃。缺省铜 0.00393\n * @returns 该温度下的单位电阻,Ω/km\n */\nexport function resistanceAtTempOhmPerKm(\n r20OhmPerKm: number,\n tempDegC: number,\n alphaPerDegC: number = COPPER_ALPHA_PER_DEG_C,\n): number {\n if (!(r20OhmPerKm > 0)) {\n throw new RangeError(`20℃ 单位电阻必须为正数,收到 ${r20OhmPerKm} Ω/km`);\n }\n if (!(alphaPerDegC > 0)) {\n throw new RangeError(`电阻温度系数必须为正数,收到 ${alphaPerDegC} /℃`);\n }\n return r20OhmPerKm * (1 + alphaPerDegC * (tempDegC - 20));\n}\n","/**\n * 覆冰冰筒模型 —— tension 与 icing 共用。\n *\n * 统一使用 SI 单位(米),与站点 calc-core.js 的 icingCheck 内部口径一致。\n * 页面侧若以 mm 采集,调用前需自行 /1000。\n */\n\nimport { G0 } from '../types';\n\n/** 冰密度常用值,kg/m³ */\nexport const DEFAULT_ICE_DENSITY_KG_PER_M3 = 900;\n\nexport interface IceLoadParams {\n /** 线索直径 d,m */\n readonly wireDiameterM: number;\n /** 覆冰厚度 b,m。传 0 表示无冰 */\n readonly iceThicknessM: number;\n /** 冰密度 ρ_ice,kg/m³。缺省 900 */\n readonly iceDensityKgPerM3?: number;\n}\n\n/**\n * 冰筒模型单位长度冰重:g_ice = ρ_ice·g₀·π·b·(d + b),N/m。\n *\n * 传 iceThicknessM = 0 时返回 0。\n */\nexport function iceLoadNPerM(params: IceLoadParams): number {\n const { wireDiameterM, iceThicknessM } = params;\n const rho = params.iceDensityKgPerM3 ?? DEFAULT_ICE_DENSITY_KG_PER_M3;\n\n if (!(wireDiameterM > 0)) {\n throw new RangeError(`线索直径必须为正数,收到 ${wireDiameterM} m`);\n }\n if (!(iceThicknessM >= 0)) {\n throw new RangeError(`覆冰厚度不能为负,收到 ${iceThicknessM} m`);\n }\n if (!(rho > 0)) {\n throw new RangeError(`冰密度必须为正数,收到 ${rho} kg/m³`);\n }\n if (iceThicknessM === 0) return 0;\n\n return rho * G0 * Math.PI * iceThicknessM * (wireDiameterM + iceThicknessM);\n}\n","import { G0 } from '../types';\n\n/**\n * 接触线线材参数预设。\n *\n * ⚠️ 全部为标称参考值,实际取值以产品技术条件与设计文件为准。\n * ⚠️ 本站计算器的参数界面支持手工覆盖这些值 —— 那才是工程上正确的用法。\n *\n * 待核对项(见 README「开放问题」):\n * 站点页面注明\"参考单位质量按密度 8.94 g/cm³ 计\",据此 CTHM-120 应为 1.0728 kg/m。\n * 但由站点已发布的输出表反算,实际使用的 g ≈ 10.62 N/m,对应线密度 ≈ 1.083 kg/m,\n * 比标称值高约 0.9%,疑似计入了吊弦、线夹、接头的等效附加荷载。\n * 两者差异约 1%,在多数工程场景可接受,但请确认后统一。\n */\n\nexport interface WireSpec {\n /** 唯一标识 */\n readonly id: string;\n /** 中文名 */\n readonly name: string;\n /** 英文名 */\n readonly nameEn: string;\n /** 标称截面积 A,mm² */\n readonly crossSectionMM2: number;\n /** 弹性模量 E,GPa(标称参考值) */\n readonly elasticModulusGPa: number;\n /** 线膨胀系数 α,1/℃(标称参考值) */\n readonly expansionPerDegC: number;\n /** 线密度,kg/m(标称参考值) */\n readonly linearMassKgPerM: number;\n}\n\n/** 参考密度,g/cm³(站点页面注明值) */\nexport const REFERENCE_DENSITY_G_PER_CM3 = 8.94;\n\n/**\n * 由截面积与密度反算线密度。\n * @param crossSectionMM2 截面积 A,mm²\n * @param densityGPerCm3 密度,g/cm³\n * @returns 线密度,kg/m\n */\nexport function deriveLinearMassKgPerM(\n crossSectionMM2: number,\n densityGPerCm3: number = REFERENCE_DENSITY_G_PER_CM3,\n): number {\n // A[mm²] × 1e-6 [m²/mm²] × ρ[g/cm³] × 1000 [kg/m³ per g/cm³]\n return crossSectionMM2 * 1e-6 * densityGPerCm3 * 1000;\n}\n\n/** 铜及铜合金接触线的常用线膨胀系数,1/℃ */\nexport const COPPER_ALLOY_ALPHA_PER_DEG_C = 1.7e-5;\n\nexport const WIRE_PRESETS: readonly WireSpec[] = [\n {\n id: 'cthm120',\n name: 'CTHM-120(铜镁 120)',\n nameEn: 'CTHM-120 (CuMg 120 mm²)',\n crossSectionMM2: 120,\n elasticModulusGPa: 120,\n expansionPerDegC: COPPER_ALLOY_ALPHA_PER_DEG_C,\n linearMassKgPerM: deriveLinearMassKgPerM(120),\n },\n {\n id: 'cthm150',\n name: 'CTHM-150(铜镁 150)',\n nameEn: 'CTHM-150 (CuMg 150 mm²)',\n crossSectionMM2: 150,\n elasticModulusGPa: 120,\n expansionPerDegC: COPPER_ALLOY_ALPHA_PER_DEG_C,\n linearMassKgPerM: deriveLinearMassKgPerM(150),\n },\n {\n id: 'ctha120',\n name: 'CTHA-120(铜银 120)',\n nameEn: 'CTHA-120 (CuAg 120 mm²)',\n crossSectionMM2: 120,\n elasticModulusGPa: 120,\n expansionPerDegC: COPPER_ALLOY_ALPHA_PER_DEG_C,\n linearMassKgPerM: deriveLinearMassKgPerM(120),\n },\n];\n\n/** 按 id 取线材预设,找不到返回 undefined */\nexport function findWirePreset(id: string): WireSpec | undefined {\n return WIRE_PRESETS.find((w) => w.id === id);\n}\n\n/**\n * 由线密度求单位自重荷载 g,N/m。\n * @param linearMassKgPerM 线密度,kg/m\n */\nexport function weightPerLengthNPerM(linearMassKgPerM: number): number {\n return linearMassKgPerM * G0;\n}\n\n/**\n * 由线材预设直接取单位自重荷载 g,N/m。\n */\nexport function weightOfPresetNPerM(spec: WireSpec): number {\n return weightPerLengthNPerM(spec.linearMassKgPerM);\n}\n","/**\n * TB/T 2809-2017 表5 持续载流量参考值(A)。\n *\n * 来源:itswe.com 标准规范库,据 TB/T 2809-2017 无水印全文扫描件逐格复核。\n *\n * 查表语义:\n * - 返回数值:该项载流量\n * - 返回 null:该 (材质, 截面) 规格存在,但该工况按标准原文注\"不需要考核\"\n * (如纯铜接触线不考核 150℃ 工况)\n * - 返回 undefined:该材质无此截面规格(如铜铬锆无 120 mm²)\n *\n * ⚠️ 表中为室内(无风无日照试验条件)值与室外值;工程取值请以标准原文与\n * 产品技术条件为准。高海拔、隧道内等场景须另行叠加散热修正。\n */\n\nexport type ContactWireTypeCode =\n | 'CT'\n | 'CTA'\n | 'CTS'\n | 'CTSM'\n | 'CTSH'\n | 'CTM'\n | 'CTMM'\n | 'CTMH'\n | 'CTCZ';\n\n/** 载流量考核工况 */\nexport type AmpacityCondition = 'indoor-95' | 'outdoor-95' | 'indoor-150' | 'outdoor-150';\n\nexport type CrossSectionMM2 = 120 | 150;\n\n/** 按截面索引的载流量对,[120 mm², 150 mm²] */\ntype SectionPair = readonly [number | null, number | null];\n\nexport interface AmpacityEntry {\n readonly type: ContactWireTypeCode;\n readonly materialZh: string;\n /** 标称截面,mm² */\n readonly crossSectionMM2: CrossSectionMM2;\n readonly condition: AmpacityCondition;\n /** 持续载流量,A。null 表示该项不需要考核 */\n readonly ampacityA: number | null;\n}\n\nconst M = (\n type: ContactWireTypeCode,\n materialZh: string,\n sections: readonly CrossSectionMM2[],\n indoor95: SectionPair,\n outdoor95: SectionPair,\n indoor150: SectionPair,\n outdoor150: SectionPair,\n): AmpacityEntry[] => {\n const conditions: ReadonlyArray<readonly [AmpacityCondition, SectionPair]> = [\n ['indoor-95', indoor95],\n ['outdoor-95', outdoor95],\n ['indoor-150', indoor150],\n ['outdoor-150', outdoor150],\n ];\n const out: AmpacityEntry[] = [];\n for (const section of sections) {\n for (const [condition, pair] of conditions) {\n const value = section === 120 ? pair[0] : pair[1];\n out.push({\n type,\n materialZh,\n crossSectionMM2: section,\n condition,\n ampacityA: value ?? null,\n });\n }\n }\n return out;\n};\n\nexport const TB2809_AMPACITY_A: readonly AmpacityEntry[] = [\n ...M('CT', '铜', [120, 150], [360, 425], [495, 570], [null, null], [null, null]),\n ...M('CTA', '铜银', [120, 150], [360, 425], [495, 570], [515, 620], [680, 785]),\n ...M('CTS', '铜锡', [120, 150], [360, 425], [490, 565], [515, 620], [680, 790]),\n ...M('CTSM', '铜锡', [120, 150], [330, 400], [455, 525], [490, 560], [630, 730]),\n ...M('CTSH', '铜锡', [120, 150], [310, 360], [420, 480], [450, 520], [580, 670]),\n ...M('CTM', '铜镁', [120, 150], [330, 400], [455, 525], [490, 560], [630, 730]),\n ...M('CTMM', '铜镁', [120, 150], [310, 360], [420, 480], [450, 520], [580, 670]),\n ...M('CTMH', '铜镁', [120, 150], [300, 340], [410, 460], [430, 500], [560, 650]),\n ...M('CTCZ', '铜铬锆', [150], [null, 395], [null, 505], [null, 580], [null, 710]),\n];\n\n/**\n * 查表。\n * @returns 载流量 A;该规格存在但不考核时为 null;该材质无此截面时为 undefined\n */\nexport function findAmpacityA(params: {\n type: ContactWireTypeCode;\n crossSectionMM2: CrossSectionMM2;\n condition: AmpacityCondition;\n}): number | null | undefined {\n const row = TB2809_AMPACITY_A.find(\n (e) =>\n e.type === params.type &&\n e.crossSectionMM2 === params.crossSectionMM2 &&\n e.condition === params.condition,\n );\n return row === undefined ? undefined : row.ampacityA;\n}\n","import type { CalculatorMeta } from '../types';\n\nexport const tensionMeta: CalculatorMeta = {\n name: '张力-温度安装曲线',\n nameEn: 'Tension-Temperature Installation Curve',\n summary:\n '按张力-温度状态方程求解各温度档的施工张力与弛度,生成安装曲线表;支持当量跨距(多跨锚段)与覆冰工况校核。',\n formula: [\n '状态方程:T₂ − g₂²l²EA/(24T₂²) = T₁ − g₁²l²EA/(24T₁²) − αEA(t₂ − t₁)',\n '跨中弛度(抛物线近似):f = gl²/(8T)',\n '当量跨距:l_D = √(Σlᵢ³ / Σlᵢ)',\n '覆冰荷载(冰筒模型):g_ice = ρ_ice · g₀ · π · b · (d + b)',\n ],\n references: [\n 'TB 10009-2016《铁路电力牵引供电设计规范》—— 仅规定接触线最小张力、张力确定原则与张力差限值,不含张力-温度状态方程本身',\n '张力-温度状态方程为通用柔索状态方程,具体形式以设计文件及接触网设计教材/手册为准',\n '线材 E / α / 线密度为标称参考值,实际以产品技术条件为准',\n ],\n scope: [\n '弹性模量 E:50 ~ 200 GPa',\n '截面积 A:50 ~ 250 mm²',\n '跨距 l:20 ~ 90 m',\n '弛度采用抛物线近似,不适用于大弛度(f/l > 1/10)工况',\n '覆冰模型为均匀冰筒假设,不考虑不均匀覆冰与脱冰跳跃',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/tension/',\n};\n","export { tensionMeta } from './meta';\n\n/** 单个温度档的输入参数 */\nexport interface TensionPointInput {\n /** 基准工况张力 T₁,kN */\n readonly baseTensionKN: number;\n /** 基准温度 t₁,℃ */\n readonly baseTempDegC: number;\n /** 目标温度 t₂,℃ */\n readonly targetTempDegC: number;\n /** 单位自重荷载 g,N/m(覆冰工况传自重与冰重的组合值) */\n readonly weightPerLengthNPerM: number;\n /** 计算跨距 l,m(多跨锚段传当量跨距 l_D) */\n readonly spanM: number;\n /** 弹性模量 E,GPa */\n readonly elasticModulusGPa: number;\n /** 截面积 A,mm² */\n readonly crossSectionMM2: number;\n /** 线膨胀系数 α,1/℃ */\n readonly expansionPerDegC: number;\n}\n\n/** 安装曲线公共参数(不含目标温度) */\nexport type TensionCurveInput = Omit<TensionPointInput, 'targetTempDegC'>;\n\n/** 单个温度档的计算结果 */\nexport interface TensionResult {\n /** 目标温度 t₂,℃ */\n readonly targetTempDegC: number;\n /** 该温度下的张力 T₂,kN */\n readonly tensionKN: number;\n /** 跨中弛度 f,m(抛物线近似) */\n readonly sagM: number;\n /** 求解迭代次数 */\n readonly iterations: number;\n /** 状态方程残差,N(用于校验收敛,应接近 0) */\n readonly residualN: number;\n}\n\n/**\n * 跨中弛度,抛物线近似:f = gl²/(8T)\n * @param weightPerLengthNPerM 单位自重荷载 g,N/m\n * @param spanM 跨距 l,m\n * @param tensionN 张力 T,N\n * @returns 弛度 f,m\n */\nexport function sagM(\n weightPerLengthNPerM: number,\n spanM: number,\n tensionN: number,\n): number {\n if (!(tensionN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionN} N`);\n }\n return (weightPerLengthNPerM * spanM * spanM) / (8 * tensionN);\n}\n\n/**\n * 当量跨距(多跨锚段归算):l_D = √(Σlᵢ³ / Σlᵢ)\n * @param spansM 各跨跨距,m\n * @returns 当量跨距 l_D,m\n */\nexport function equivalentSpanM(spansM: readonly number[]): number {\n if (spansM.length === 0) {\n throw new RangeError('跨距数组不能为空');\n }\n let sumCubed = 0;\n let sum = 0;\n for (const s of spansM) {\n if (!(s > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${s}`);\n }\n sumCubed += s * s * s;\n sum += s;\n }\n return Math.sqrt(sumCubed / sum);\n}\n\n/**\n * 覆冰荷载(均匀冰筒模型)与 icing 模块共用 `src/common/ice.ts`,\n * 由根 index 统一导出,此处不再重复定义。\n */\n\n/**\n * 状态方程系数 K = g²l²EA/24,单位 N³。\n * 使状态方程可写成 F(T) = T − K/T² 的紧凑形式。\n */\nexport function stateCoefficientK(\n weightPerLengthNPerM: number,\n spanM: number,\n elasticModulusGPa: number,\n crossSectionMM2: number,\n): number {\n const ePa = elasticModulusGPa * 1e9;\n const aM2 = crossSectionMM2 * 1e-6;\n return (weightPerLengthNPerM * weightPerLengthNPerM * spanM * spanM * ePa * aM2) / 24;\n}\n\n/**\n * 求解状态方程 T − K/T² = target 的正根。\n *\n * h(T) = T − K/T² − target 在 T > 0 上严格单调递增(h′ = 1 + 2K/T³ > 0),\n * 因此用二分法必定收敛。又由 T = target + K/T² 可知 T > target,\n * 可直接取 target 作为下界,bracket 很紧。\n */\nexport function solveTensionN(\n K: number,\n targetN: number,\n): { tensionN: number; iterations: number; residualN: number } {\n const hOf = (t: number): number => t - K / (t * t) - targetN;\n\n let lo = Math.max(targetN, 1e-9);\n let hi = lo + 1;\n let guard = 0;\n while (hOf(hi) < 0 && guard++ < 200) {\n hi = lo + (hi - lo) * 2;\n if (!Number.isFinite(hi)) break;\n }\n\n let iterations = 0;\n for (let i = 0; i < 200; i++) {\n iterations = i + 1;\n const mid = 0.5 * (lo + hi);\n if (hOf(mid) < 0) {\n lo = mid;\n } else {\n hi = mid;\n }\n if (hi - lo <= 1e-12 * Math.max(1, hi)) break;\n }\n\n const tensionN = 0.5 * (lo + hi);\n return { tensionN, iterations, residualN: hOf(tensionN) };\n}\n\n/**\n * 求某一温度档的张力与弛度。\n *\n * 状态方程:T₂ − g²l²EA/(24T₂²) = T₁ − g²l²EA/(24T₁²) − αEA(t₂ − t₁)\n */\nexport function tensionAt(input: TensionPointInput): TensionResult {\n const T1N = input.baseTensionKN * 1000;\n if (!(T1N > 0)) {\n throw new RangeError(`基准张力必须为正数,收到 ${input.baseTensionKN} kN`);\n }\n if (!(input.spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${input.spanM} m`);\n }\n\n const K = stateCoefficientK(\n input.weightPerLengthNPerM,\n input.spanM,\n input.elasticModulusGPa,\n input.crossSectionMM2,\n );\n const ePa = input.elasticModulusGPa * 1e9;\n const aM2 = input.crossSectionMM2 * 1e-6;\n const alphaEA = input.expansionPerDegC * ePa * aM2;\n\n const fBase = T1N - K / (T1N * T1N);\n const target = fBase - alphaEA * (input.targetTempDegC - input.baseTempDegC);\n\n const { tensionN, iterations, residualN } = solveTensionN(K, target);\n\n return {\n targetTempDegC: input.targetTempDegC,\n tensionKN: tensionN / 1000,\n sagM: sagM(input.weightPerLengthNPerM, input.spanM, tensionN),\n iterations,\n residualN,\n };\n}\n\n/**\n * 批量求解多个温度档,生成安装曲线表。\n */\nexport function tensionCurve(\n base: TensionCurveInput,\n tempsDegC: readonly number[],\n): TensionResult[] {\n return tempsDegC.map((t) => tensionAt({ ...base, targetTempDegC: t }));\n}\n","import type { CalculatorMeta } from '../types';\n\nexport const dropperMeta: CalculatorMeta = {\n name: '吊弦长度计算',\n nameEn: 'Dropper Length Calculator',\n summary:\n '按抛物线弛度公式计算链形悬挂各吊弦长度,支持简单链形与弹性链形两种悬挂类型。',\n formula: [\n '接触线弛度(抛物线近似):f_c(x) = q_c·x·(L−x) / (2·T_c)',\n '承力索弛度:f_m(x) = q_m·x·(L−x) / (2·T_m)',\n '简单链形:l_i = H − f_c(x_i)',\n '弹性链形(计入承力索弛度):l_i = H − f_c(x_i) + f_m(x_i)',\n '跨中最大弛度:f_max = q_c·L² / (8·T_c)',\n ],\n references: [\n '抛物线近似,适用于 f/L ≤ 1/10 的小弛度工况',\n '吊弦间距须能整除跨距;实际吊弦布置以设计文件为准',\n '弹性链形悬挂须同时提供承力索张力与单位荷载',\n ],\n scope: [\n '跨距 L:5 ~ 80 m',\n '接触线张力 T_c:1 ~ 40 kN',\n '结构高度 H:0.3 ~ 3 m',\n '接触线单位荷载 q_c:0.001 ~ 0.1 kN/m',\n '吊弦间距 d:1 ~ 15 m,须能整除跨距',\n '抛物线近似,大弛度工况误差增大',\n '未计入吊弦自身伸长、温度变化与零部件制造公差',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/dropper/',\n};\n","export { dropperMeta } from './meta';\n\n/** 悬挂类型 */\nexport type SuspensionType = 'simple' | 'elastic';\n\nexport interface DropperInput {\n /** 悬挂类型。弹性链形须同时提供 messenger 参数 */\n readonly suspension: SuspensionType;\n /** 跨距 L,m */\n readonly spanM: number;\n /** 接触线张力 T_c,kN */\n readonly contactTensionKN: number;\n /** 结构高度 H,m */\n readonly structureHeightM: number;\n /** 接触线单位荷载 q_c,kN/m */\n readonly contactLoadKNPerM: number;\n /** 吊弦间距 d,m,须能整除跨距 */\n readonly dropperSpacingM: number;\n /**\n * 承力索参数。弹性链形悬挂('elastic')必填,\n * 简单链形悬挂传 null 或不传。\n */\n readonly messenger?: {\n /** 承力索张力 T_m,kN */\n readonly tensionKN: number;\n /** 承力索单位荷载 q_m,kN/m */\n readonly loadKNPerM: number;\n } | null;\n}\n\n/** 单个吊弦点的计算结果 */\nexport interface DropperPoint {\n /** 序号 i(0 为起始端) */\n readonly index: number;\n /** 距起始端的距离 x,m */\n readonly positionM: number;\n /** 接触线弛度 f_c(x),m */\n readonly contactSagM: number;\n /** 承力索弛度 f_m(x),m(简单链形恒为 0) */\n readonly messengerSagM: number;\n /** 吊弦长度 l,m */\n readonly dropperLengthM: number;\n}\n\nexport interface DropperResult {\n readonly points: readonly DropperPoint[];\n /** 跨中最大弛度 f_max,m */\n readonly maxSagM: number;\n /** 最短吊弦长度,m(位于跨中) */\n readonly shortestDropperM: number;\n /** 吊弦数量(含两端) */\n readonly count: number;\n}\n\n/**\n * 抛物线弛度:f(x) = q·x·(L−x) / (2·T)\n *\n * 对接触线和承力索通用,区别只在传哪一组 q / T。\n *\n * @param xM 距起始端距离,m\n * @param spanM 跨距 L,m\n * @param loadKNPerM 单位荷载 q,kN/m\n * @param tensionKN 张力 T,kN\n * @returns 该点弛度,m\n */\nexport function parabolaSagM(\n xM: number,\n spanM: number,\n loadKNPerM: number,\n tensionKN: number,\n): number {\n if (!(tensionKN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionKN} kN`);\n }\n if (xM < 0 || xM > spanM) {\n throw new RangeError(`位置 x = ${xM} m 超出跨距 0 ~ ${spanM} m`);\n }\n return (loadKNPerM * xM * (spanM - xM)) / (2 * tensionKN);\n}\n\n/**\n * 跨中最大弛度:f_max = q·L² / (8·T)\n */\nexport function maxParabolaSagM(\n spanM: number,\n loadKNPerM: number,\n tensionKN: number,\n): number {\n return (loadKNPerM * spanM * spanM) / (8 * tensionKN);\n}\n\n/**\n * 生成吊弦点位(含两端)。\n * @param spanM 跨距 L,m\n * @param spacingM 吊弦间距 d,m,须能整除跨距\n * @returns 各点位距起始端的距离,m\n */\nexport function dropperPositionsM(spanM: number, spacingM: number): number[] {\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(spacingM > 0)) {\n throw new RangeError(`吊弦间距必须为正数,收到 ${spacingM} m`);\n }\n const intervals = spanM / spacingM;\n const rounded = Math.round(intervals);\n if (Math.abs(intervals - rounded) > 1e-9 || rounded < 1) {\n throw new RangeError(\n `吊弦间距 ${spacingM} m 不能整除跨距 ${spanM} m(得到 ${intervals} 段)`,\n );\n }\n return Array.from({ length: rounded + 1 }, (_, i) => i * spacingM);\n}\n\n/**\n * 计算整跨各吊弦长度。\n *\n * 简单链形:l_i = H − f_c(x_i)\n * 弹性链形:l_i = H − f_c(x_i) + f_m(x_i)\n */\nexport function dropperLengths(input: DropperInput): DropperResult {\n const {\n suspension,\n spanM,\n contactTensionKN,\n structureHeightM,\n contactLoadKNPerM,\n dropperSpacingM: spacingM,\n } = input;\n\n if (!(contactTensionKN > 0)) {\n throw new RangeError(`接触线张力必须为正数,收到 ${contactTensionKN} kN`);\n }\n if (!(contactLoadKNPerM > 0)) {\n throw new RangeError(`接触线单位荷载必须为正数,收到 ${contactLoadKNPerM} kN/m`);\n }\n if (!(structureHeightM > 0)) {\n throw new RangeError(`结构高度必须为正数,收到 ${structureHeightM} m`);\n }\n\n if (suspension === 'elastic') {\n const m = input.messenger;\n if (!m) {\n throw new RangeError('弹性链形悬挂必须提供承力索参数(messenger)');\n }\n if (!(m.tensionKN > 0) || !(m.loadKNPerM > 0)) {\n throw new RangeError('承力索张力与单位荷载必须为正数');\n }\n }\n\n const positions = dropperPositionsM(spanM, spacingM);\n const messenger = suspension === 'elastic' ? input.messenger : null;\n\n const points: DropperPoint[] = positions.map((xM, index) => {\n const contactSag = parabolaSagM(\n xM,\n spanM,\n contactLoadKNPerM,\n contactTensionKN,\n );\n const messengerSag =\n messenger && messenger !== null\n ? parabolaSagM(xM, spanM, messenger.loadKNPerM, messenger.tensionKN)\n : 0;\n\n const dropperLengthM = structureHeightM - contactSag + messengerSag;\n if (dropperLengthM <= 0) {\n throw new RangeError(\n `x = ${xM} m 处吊弦长度非正(${dropperLengthM.toFixed(4)} m):` +\n `结构高度 ${structureHeightM} m 不足,请复核输入`,\n );\n }\n\n return { index, positionM: xM, contactSagM: contactSag, messengerSagM: messengerSag, dropperLengthM };\n });\n\n let maxSagM = 0;\n let shortestDropperM = Number.POSITIVE_INFINITY;\n for (const p of points) {\n if (p.contactSagM > maxSagM) maxSagM = p.contactSagM;\n if (p.dropperLengthM < shortestDropperM) shortestDropperM = p.dropperLengthM;\n }\n\n return {\n points,\n maxSagM,\n shortestDropperM,\n count: points.length,\n };\n}\n","import type { CalculatorMeta } from '../types';\n\nexport const windMeta: CalculatorMeta = {\n name: '风偏限界校验',\n nameEn: 'Wind Deflection Clearance Check',\n summary:\n '计算线索在风荷载作用下的跨中偏移 b,叠加拉出值后与限界允许值比较,给出合格/超限结论。',\n formula: [\n '单位风荷载:p = ½·ρ·v²·d·α·sin²θ(ρ = 1.225 kg/m³)',\n '跨中风偏(简支索抛物线近似):b = p·L² / (8·T)',\n '限界校验:b + a ≤ 限界允许值,满足判为合格',\n ],\n references: [\n '简支索抛物线近似,适用于 f/L ≤ 1/10 工况',\n '风载体型系数 α:圆柱形线索常取 1.2',\n '限界允许值按受电弓动态包络线取值',\n ],\n scope: [\n '风速 v:0 ~ 60 m/s',\n '风向与线路夹角 θ:0 ~ 180°,90° 为垂直于线路',\n '线索直径 d:1 ~ 30 mm',\n '线索张力 T:1 ~ 40 kN',\n '跨距 L:5 ~ 80 m',\n '风载体型系数 α:0.5 ~ 2.0',\n '拉出值 a:0 ~ 0.6 m',\n '限界允许值:0.1 ~ 2 m',\n '未计入线索风致振动、驰振与覆冰附加风载',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/wind/',\n};\n","export { windMeta } from './meta';\n\n/** 标准大气条件下的空气密度,kg/m³ */\nexport const AIR_DENSITY_KG_PER_M3 = 1.225;\n\nexport interface WindLoadInput {\n /** 风速 v,m/s */\n readonly windSpeedMPerS: number;\n /** 风向与线路夹角 θ,度。90° 表示风垂直于线路 */\n readonly windAngleDeg: number;\n /** 线索直径 d,mm */\n readonly wireDiameterMM: number;\n /** 风载体型系数 α(阻力系数),圆柱形线索常取 1.2 */\n readonly dragCoefficient: number;\n /** 空气密度 ρ,kg/m³。缺省为标准大气 1.225 */\n readonly airDensityKgPerM3?: number;\n}\n\nexport interface WindClearanceInput extends WindLoadInput {\n /** 线索张力 T,kN */\n readonly tensionKN: number;\n /** 跨距 L,m */\n readonly spanM: number;\n /** 拉出值 a,m */\n readonly staggerM: number;\n /** 限界允许值,m */\n readonly clearanceLimitM: number;\n}\n\nexport interface WindClearanceResult {\n /** 单位风荷载 p,N/m */\n readonly windLoadNPerM: number;\n /** 跨中风偏 b,m */\n readonly deflectionM: number;\n /** 风偏 + 拉出值 b + a,m */\n readonly totalOffsetM: number;\n /** 限界允许值,m */\n readonly clearanceLimitM: number;\n /** 富余量 = 限界允许值 − (b + a),m。负值表示超限 */\n readonly marginM: number;\n /** 是否合格 */\n readonly passes: boolean;\n}\n\n/**\n * 单位风荷载:p = ½·ρ·v²·d·α·sin²θ,N/m。\n *\n * 注意公式使用 sin²θ 而非 sinθ —— 风向与线路平行时(θ = 0° / 180°)不产生横向偏移。\n *\n * @returns 单位长度风荷载,N/m\n */\nexport function windLoadNPerM(params: WindLoadInput): number {\n const {\n windSpeedMPerS,\n windAngleDeg,\n wireDiameterMM,\n dragCoefficient,\n airDensityKgPerM3,\n } = params;\n\n if (!(windSpeedMPerS >= 0)) {\n throw new RangeError(`风速不能为负,收到 ${windSpeedMPerS} m/s`);\n }\n if (!(wireDiameterMM > 0)) {\n throw new RangeError(`线索直径必须为正数,收到 ${wireDiameterMM} mm`);\n }\n if (!(dragCoefficient > 0)) {\n throw new RangeError(`风载体型系数必须为正数,收到 ${dragCoefficient}`);\n }\n if (!(windAngleDeg >= 0 && windAngleDeg <= 180)) {\n throw new RangeError(\n `风向与线路夹角应为 0 ~ 180°,收到 ${windAngleDeg}°`,\n );\n }\n\n const rho = airDensityKgPerM3 ?? AIR_DENSITY_KG_PER_M3;\n if (!(rho > 0)) {\n throw new RangeError(`空气密度必须为正数,收到 ${rho} kg/m³`);\n }\n\n const dM = wireDiameterMM * 1e-3;\n const sinTheta = Math.sin((windAngleDeg * Math.PI) / 180);\n\n return 0.5 * rho * windSpeedMPerS * windSpeedMPerS * dM * dragCoefficient * sinTheta * sinTheta;\n}\n\n/**\n * 跨中风偏(简支索抛物线近似):b = p·L² / (8·T),m。\n *\n * @param windLoadNPerM 单位风荷载 p,N/m\n * @param spanM 跨距 L,m\n * @param tensionKN 线索张力 T,kN\n * @returns 跨中风偏,m\n */\nexport function windDeflectionM(\n windLoadNPerM: number,\n spanM: number,\n tensionKN: number,\n): number {\n if (!(windLoadNPerM >= 0)) {\n throw new RangeError(`单位风荷载不能为负,收到 ${windLoadNPerM} N/m`);\n }\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(tensionKN > 0)) {\n throw new RangeError(`线索张力必须为正数,收到 ${tensionKN} kN`);\n }\n return (windLoadNPerM * spanM * spanM) / (8 * tensionKN * 1000);\n}\n\n/**\n * 风偏限界校验:计算跨中风偏 b,叠加拉出值 a,与限界允许值比较。\n *\n * 判据:b + a ≤ 限界允许值 → 合格\n */\nexport function windClearanceCheck(input: WindClearanceInput): WindClearanceResult {\n const { staggerM, clearanceLimitM } = input;\n\n if (!(staggerM >= 0)) {\n throw new RangeError(`拉出值不能为负,收到 ${staggerM} m`);\n }\n if (!(clearanceLimitM > 0)) {\n throw new RangeError(`限界允许值必须为正数,收到 ${clearanceLimitM} m`);\n }\n\n const p = windLoadNPerM(input);\n const b = windDeflectionM(p, input.spanM, input.tensionKN);\n const totalOffsetM = b + staggerM;\n\n return {\n windLoadNPerM: p,\n deflectionM: b,\n totalOffsetM,\n clearanceLimitM,\n marginM: clearanceLimitM - totalOffsetM,\n passes: totalOffsetM <= clearanceLimitM,\n };\n}\n","import type { CalculatorMeta } from '../types';\n\nexport const forceMeta: CalculatorMeta = {\n name: '弓网接触力统计评价',\n nameEn: 'Pantograph-Catenary Contact Force Statistical Assessment',\n summary:\n '按 EN 50367 统计评价体系,由平均接触力 Fm 与标准差 σ 计算 Fmax=Fm+3σ、Fmin=Fm−3σ,对照验收限值给出判定,适用于 C1 检测数据评价。',\n formula: [\n '统计评价:Fmax = Fm + 3σ,Fmin = Fm − 3σ',\n '参考目标力(AC 体系):Fref = 0.00097·v² + 70(v 单位 km/h)',\n 'DC 3kV 体系:Fref = 0.00097·v² + 110',\n 'DC 1.5kV 体系:Fref = 0.00097·v² + 140',\n ],\n references: [\n '统计评价框架依据 EN 50367;测量方法见 EN 50317',\n 'AC 体系常数引自 EN 50367 表6;DC 体系常数引自 TSI ENE 2011/274/EU',\n '验收上下限须按现行验收大纲/合同填写,本模块不内置限值',\n 'v = 200 km/h 时 AC 体系 Fref = 108.8 N',\n ],\n scope: [\n 'Fm 与 σ 应取自同一检测区段的统计值(C1 检测数据)',\n '3σ 准则是统计极值近似,不替代逐点超限统计',\n '未考虑离线率、燃弧率等其他接触质量指标',\n '分档表值与允差带以标准原文为准',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/force/',\n};\n","export { forceMeta } from './meta';\n\n/** 供电制式,决定参考目标力 Fref 的常数项 */\nexport type PowerSystem = 'ac' | 'dc3kv' | 'dc15kv';\n\n/** 限值判定结果 */\nexport type LimitVerdict = 'pass' | 'fail' | 'not-assessed';\n\n/** Fref = 0.00097·v² + offset,offset 按供电制式取值 */\nexport const REF_TARGET_COEFF = 0.00097;\n\n/** 参考目标力常数项,N。AC 引自 EN 50367 表6,DC 引自 TSI ENE 2011/274/EU */\nexport const REF_TARGET_OFFSET_N: Record<PowerSystem, number> = {\n ac: 70,\n dc3kv: 110,\n dc15kv: 140,\n};\n\nexport interface ContactForceInput {\n /** 平均接触力 Fm,N(同一 C1 检测区段统计均值) */\n readonly meanForceN: number;\n /** 标准差 σ,N(同一区段统计标准差) */\n readonly stdDevN: number;\n /** 速度 v,km/h。传 null 则不输出参考目标力 */\n readonly speedKmH: number | null;\n /** 验收上限 Fmax,lim,N。传 null 则不判定 */\n readonly maxLimitN: number | null;\n /** 验收下限 Fmin,lim,N。传 null 则不判定 */\n readonly minLimitN: number | null;\n /** 供电制式。缺省为交流 */\n readonly system?: PowerSystem;\n}\n\nexport interface ContactForceResult {\n readonly meanForceN: number;\n readonly stdDevN: number;\n /** 统计最大力 Fmax = Fm + 3σ,N */\n readonly maxForceN: number;\n /** 统计最小力 Fmin = Fm − 3σ,N */\n readonly minForceN: number;\n /** 参考目标力 Fref,N。未提供速度时为 null */\n readonly referenceTargetN: number | null;\n /** 均值对参考目标的偏差 Fm − Fref,N。未提供速度时为 null */\n readonly meanDeviationN: number | null;\n /** 上限判定 */\n readonly maxVerdict: LimitVerdict;\n /** 下限判定 */\n readonly minVerdict: LimitVerdict;\n}\n\n/**\n * 参考目标力 Fref,N。\n *\n * Fref = 0.00097·v² + offset\n *\n * @param speedKmH 速度 v,km/h\n * @param system 供电制式,缺省 'ac'\n * @returns 参考目标力,N\n */\nexport function referenceTargetForceN(\n speedKmH: number,\n system: PowerSystem = 'ac',\n): number {\n if (!(speedKmH >= 0)) {\n throw new RangeError(`速度不能为负,收到 ${speedKmH} km/h`);\n }\n return REF_TARGET_COEFF * speedKmH * speedKmH + REF_TARGET_OFFSET_N[system];\n}\n\n/**\n * 统计极值:Fmax = Fm + 3σ,Fmin = Fm − 3σ。\n *\n * @returns 统计最大力与最小力,N\n */\nexport function statisticalForcesN(\n meanForceN: number,\n stdDevN: number,\n): { readonly maxN: number; readonly minN: number } {\n if (!(meanForceN > 0)) {\n throw new RangeError(`平均接触力必须为正数,收到 ${meanForceN} N`);\n }\n if (!(stdDevN >= 0)) {\n throw new RangeError(`标准差不能为负,收到 ${stdDevN} N`);\n }\n const threeSigma = 3 * stdDevN;\n return { maxN: meanForceN + threeSigma, minN: meanForceN - threeSigma };\n}\n\n/**\n * 弓网接触力统计评价(EN 50367 框架)。\n *\n * 上下限传 null 表示该侧不参与判定,对应判定结果为 'not-assessed'。\n */\nexport function assessContactForce(input: ContactForceInput): ContactForceResult {\n const { meanForceN, stdDevN, speedKmH, maxLimitN, minLimitN } = input;\n\n const { maxN, minN } = statisticalForcesN(meanForceN, stdDevN);\n\n const referenceTargetN = speedKmH === null ? null : referenceTargetForceN(speedKmH, input.system ?? 'ac');\n const meanDeviationN =\n referenceTargetN === null ? null : meanForceN - referenceTargetN;\n\n const maxVerdict: LimitVerdict =\n maxLimitN === null ? 'not-assessed' : maxN <= maxLimitN ? 'pass' : 'fail';\n const minVerdict: LimitVerdict =\n minLimitN === null ? 'not-assessed' : minN >= minLimitN ? 'pass' : 'fail';\n\n return {\n meanForceN,\n stdDevN,\n maxForceN: maxN,\n minForceN: minN,\n referenceTargetN,\n meanDeviationN,\n maxVerdict,\n minVerdict,\n };\n}\n","import type { CalculatorMeta } from '../types';\n\nexport const ampacityMeta: CalculatorMeta = {\n name: '载流量修正与短路热稳定',\n nameEn: 'Ampacity Derating and Short-Circuit Thermal Stability',\n summary:\n '按环境温度修正持续载流量,并按短路热稳定校核最小截面,用于接触线/附加导线截面选型与校核。',\n formula: [\n '载流量环境温度修正:I(Ta) = I₀·√((Tmax − Ta) / (Tmax − T₀))',\n '短路热稳定最小截面:S ≥ I_k·√t_k / C',\n ],\n references: [\n '允许工作温度:铜 95℃、铜合金 150℃(TB/T 2809-2017 表5)',\n '基准载流量 I₀ 可按 TB/T 2809-2017 表5 取值(室内为无风无日照试验条件下须符合值,室外值宜参照)',\n '热稳定系数 C 属设计输入,须按设计手册与产品技术条件取值',\n ],\n scope: [\n '修正式仅覆盖环境温度项',\n '高海拔、隧道、日照叠加场景须另行叠加散热修正',\n '短路电流 I_k 应为供电计算给出的热稳定等效值',\n '切除时间 t_k 为保护动作全切除时间',\n '未考虑邻近金属回流、集肤效应与短时过载工况',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/ampacity/',\n};\n","export { ampacityMeta } from './meta';\n\n/** 基准环境温度 T₀,℃(TB/T 2809-2017 标准环境) */\nexport const DEFAULT_BASE_AMBIENT_TEMP_DEG_C = 25;\n\n/** 载流量环境温度修正输入 */\nexport interface AmpacityDeratingInput {\n /** 基准载流量 I₀,A(标准环境 T₀ 下的持续载流量) */\n readonly baseAmpacityA: number;\n /** 最高允许工作温度 Tmax,℃(铜 95、铜合金 150) */\n readonly maxAllowedTempDegC: number;\n /** 最不利实际环境温度 Ta,℃ */\n readonly ambientTempDegC: number;\n /** 基准环境温度 T₀,℃。缺省 25 ℃ */\n readonly baseAmbientTempDegC?: number;\n}\n\nexport interface AmpacityDeratingResult {\n /** 修正系数,无量纲 */\n readonly deratingFactor: number;\n /** 修正后载流量 I(Ta),A */\n readonly deratedAmpacityA: number;\n}\n\n/**\n * 环境温度修正系数:√((Tmax − Ta) / (Tmax − T₀))。\n *\n * Ta 越接近允许温度,系数越小;Ta = T₀ 时为 1;Ta > Tmax 无解,直接抛错。\n */\nexport function ampacityDeratingFactor(input: AmpacityDeratingInput): number {\n const {\n maxAllowedTempDegC: tMax,\n ambientTempDegC: tAmbient,\n baseAmbientTempDegC: tBaseOpt,\n } = input;\n const tBase = tBaseOpt ?? DEFAULT_BASE_AMBIENT_TEMP_DEG_C;\n\n if (!(input.baseAmpacityA > 0)) {\n throw new RangeError(`基准载流量必须为正数,收到 ${input.baseAmpacityA} A`);\n }\n if (!(tMax > tBase)) {\n throw new RangeError(\n `允许温度 ${tMax} ℃ 必须高于基准环境温度 ${tBase} ℃`,\n );\n }\n if (!(tAmbient < tMax)) {\n throw new RangeError(\n `实际环境温度 ${tAmbient} ℃ 已达到或超过允许温度 ${tMax} ℃,无法持续运行`,\n );\n }\n if (!(tAmbient >= -273.15)) {\n throw new RangeError(`环境温度不能低于绝对零度,收到 ${tAmbient} ℃`);\n }\n\n return Math.sqrt((tMax - tAmbient) / (tMax - tBase));\n}\n\n/**\n * 修正后载流量:I(Ta) = I₀·√((Tmax − Ta)/(Tmax − T₀)),A。\n *\n * ⚠️ 修正式仅覆盖环境温度项;高海拔、隧道、日照叠加场景须另行叠加修正。\n */\nexport function deratedAmpacityA(input: AmpacityDeratingInput): number {\n return input.baseAmpacityA * ampacityDeratingFactor(input);\n}\n\n/** 热稳定校核判定结果 */\nexport type ThermalStabilityVerdict = 'pass' | 'fail' | 'not-assessed';\n\nexport interface ShortCircuitCheckInput {\n /** 短路电流 I_k,kA(热稳定等效值,由供电计算给出) */\n readonly shortCircuitCurrentKA: number;\n /** 全切除时间 t_k,s */\n readonly clearingTimeS: number;\n /** 热稳定系数 C,A·√s/mm²(设计输入) */\n readonly thermalCoefficientC: number;\n /** 拟选截面,mm²。传 null 则仅输出最小截面,不判定 */\n readonly selectedSectionMM2: number | null;\n}\n\nexport interface ShortCircuitCheckResult {\n /** 最小热稳截面 S_min = I_k·√t_k / C,mm² */\n readonly minSectionMM2: number;\n readonly selectedSectionMM2: number | null;\n /** 拟选截面判定 */\n readonly verdict: ThermalStabilityVerdict;\n}\n\n/**\n * 短路热稳定最小截面:S_min = I_k·√t_k / C,mm²。\n *\n * @param shortCircuitCurrentKA 短路电流,kA\n * @param clearingTimeS 切除时间,s\n * @param thermalCoefficientC 热稳定系数,A·√s/mm²\n */\nexport function shortCircuitMinSectionMM2(\n shortCircuitCurrentKA: number,\n clearingTimeS: number,\n thermalCoefficientC: number,\n): number {\n if (!(shortCircuitCurrentKA > 0)) {\n throw new RangeError(\n `短路电流必须为正数,收到 ${shortCircuitCurrentKA} kA`,\n );\n }\n if (!(clearingTimeS > 0)) {\n throw new RangeError(`切除时间必须为正数,收到 ${clearingTimeS} s`);\n }\n if (!(thermalCoefficientC > 0)) {\n throw new RangeError(\n `热稳定系数必须为正数,收到 ${thermalCoefficientC} A·√s/mm²`,\n );\n }\n const iA = shortCircuitCurrentKA * 1000;\n return (iA * Math.sqrt(clearingTimeS)) / thermalCoefficientC;\n}\n\n/**\n * 短路热稳定校核:给出最小截面,并在提供拟选截面时判定是否满足 S ≥ S_min。\n */\nexport function shortCircuitCheck(input: ShortCircuitCheckInput): ShortCircuitCheckResult {\n const minSectionMM2 = shortCircuitMinSectionMM2(\n input.shortCircuitCurrentKA,\n input.clearingTimeS,\n input.thermalCoefficientC,\n );\n\n const verdict: ThermalStabilityVerdict =\n input.selectedSectionMM2 === null\n ? 'not-assessed'\n : input.selectedSectionMM2 >= minSectionMM2\n ? 'pass'\n : 'fail';\n\n return { minSectionMM2, selectedSectionMM2: input.selectedSectionMM2, verdict };\n}\n","import type { CalculatorMeta } from '../types';\n\nexport const wearMeta: CalculatorMeta = {\n name: '接触线磨耗率',\n nameEn: 'Contact Wire Wear Ratio',\n summary: '根据原截面积与实测残存截面计算磨耗率 η,η > 20% 时建议更换接触线。',\n formula: [\n '磨耗率:η = (A₀ − A) / A₀ × 100%',\n '判定准则:η > 20% 建议更换接触线',\n '残径换算(近似):A = π·d² / 4',\n ],\n references: [\n '原截面积来源 TB/T 2809-2017《电气化铁路用铜及铜合金接触线》',\n '标称截面 120/150 mm² 为名义值,标准另列计算截面 121/151 mm²,实际截面由 TB/T 2809-2017 表2 外形尺寸公差带控制',\n '磨耗更换阈值请以最新版运维规程为准',\n ],\n scope: [\n '残径换算按圆截面近似,接触线实际为梯形截面,换算值存在系统性偏差',\n '未考虑磨耗沿跨距方向的不均匀分布',\n '实际产品截面以出厂检验单为准',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/wear/',\n};\n","export { wearMeta } from './meta';\n\n/** 默认更换阈值,% */\nexport const DEFAULT_REPLACEMENT_THRESHOLD_PERCENT = 20;\n\n/** 站点计算器内置的 6 个型号及其标称截面,mm² */\nexport type ContactWireModel =\n | 'CTHM-120'\n | 'CTHM-150'\n | 'CTHA-120'\n | 'CTHA-150'\n | 'CTHS-120'\n | 'CTHS-150';\n\nexport const NOMINAL_SECTION_MM2: Record<ContactWireModel, number> = {\n 'CTHM-120': 120,\n 'CTHM-150': 150,\n 'CTHA-120': 120,\n 'CTHA-150': 150,\n 'CTHS-120': 120,\n 'CTHS-150': 150,\n};\n\n/** 更换判定结果 */\nexport type WearVerdict = 'keep' | 'replace';\n\ninterface WearBaseInput {\n /** 原截面积 A₀,mm² */\n readonly originalSectionMM2: number;\n /** 更换阈值 η,%。缺省 20 */\n readonly replacementThresholdPercent?: number;\n}\n\n/** 按实测残截面积计算 */\nexport interface WearByAreaInput extends WearBaseInput {\n readonly mode: 'area';\n /** 实测残截面积 A,mm²,不得大于 A₀ */\n readonly residualSectionMM2: number;\n}\n\n/** 按实测残径计算(圆截面近似 A = πd²/4) */\nexport interface WearByDiameterInput extends WearBaseInput {\n readonly mode: 'residual-diameter';\n /** 实测残径 d,mm */\n readonly residualDiameterMM: number;\n}\n\nexport type WearInput = WearByAreaInput | WearByDiameterInput;\n\nexport interface WearResult {\n /** 原截面积 A₀,mm² */\n readonly originalSectionMM2: number;\n /** 参与计算的残截面积 A,mm²(残径模式为换算值) */\n readonly residualSectionMM2: number;\n /** 截面损失 A₀ − A,mm² */\n readonly sectionLossMM2: number;\n /** 磨耗率 η,% */\n readonly wearPercent: number;\n /** 使用的更换阈值,% */\n readonly thresholdPercent: number;\n readonly verdict: WearVerdict;\n}\n\n/**\n * 残径换算为截面积(圆截面近似):A = π·d²/4,mm²。\n *\n * ⚠️ 接触线实际为梯形截面,此换算存在系统性偏差,站点同此口径。\n */\nexport function sectionFromDiameterMM2(diameterMM: number): number {\n if (!(diameterMM > 0)) {\n throw new RangeError(`残径必须为正数,收到 ${diameterMM} mm`);\n }\n return (Math.PI * diameterMM * diameterMM) / 4;\n}\n\n/**\n * 计算磨耗率并给出更换建议。\n *\n * η = (A₀ − A) / A₀ × 100%,η > 阈值时建议更换。\n */\nexport function wearRatio(input: WearInput): WearResult {\n const { originalSectionMM2: a0 } = input;\n if (!(a0 > 0)) {\n throw new RangeError(`原截面积必须为正数,收到 ${a0} mm²`);\n }\n\n const residualSectionMM2 =\n input.mode === 'area'\n ? input.residualSectionMM2\n : sectionFromDiameterMM2(input.residualDiameterMM);\n\n if (!(residualSectionMM2 > 0)) {\n throw new RangeError(`残截面积必须为正数,收到 ${residualSectionMM2} mm²`);\n }\n if (residualSectionMM2 > a0) {\n throw new RangeError(\n `残截面积 ${residualSectionMM2.toFixed(2)} mm² 不能大于原截面积 ${a0} mm²`,\n );\n }\n\n const thresholdPercent =\n input.replacementThresholdPercent ?? DEFAULT_REPLACEMENT_THRESHOLD_PERCENT;\n if (!(thresholdPercent > 0)) {\n throw new RangeError(`更换阈值必须为正数,收到 ${thresholdPercent}%`);\n }\n\n const sectionLossMM2 = a0 - residualSectionMM2;\n const wearPercent = (sectionLossMM2 / a0) * 100;\n\n return {\n originalSectionMM2: a0,\n residualSectionMM2,\n sectionLossMM2,\n wearPercent,\n thresholdPercent,\n verdict: wearPercent > thresholdPercent ? 'replace' : 'keep',\n };\n}\n\n/** 按型号取标称截面积 A₀,mm² */\nexport function nominalSectionMM2(model: ContactWireModel): number {\n return NOMINAL_SECTION_MM2[model];\n}\n","import type { CalculatorMeta } from '../types';\n\nexport const copperMeta: CalculatorMeta = {\n name: '接触线参数速查',\n nameEn: 'Contact Wire Parameter Lookup',\n summary:\n '内置 CTHM / CTHA / CTHS 系列 120/150 mm² 接触线参数表,按长度与环境温度给出总重量与温度修正电阻。',\n formula: [\n '电阻温度修正(α = 0.00393 /℃):r_T = r₂₀·[1 + α·(T − 20)]',\n '总重量:W = w₀ × l(w₀ 单位重量 kg/km,l 长度 km)',\n ],\n references: [\n '内置参数表来源 TB/T 2809-2017《电气化铁路用铜及铜合金接触线》(2018-05-01 实施)',\n '单位重量为标称值',\n '载流量为 150℃ 持续值,室内/室外双口径按标准表5',\n 'r₂₀ 除 CTHM-120 取给定值外,均按导电率反算估算(IACS 标准电阻率 0.017241 Ω·mm²/m ÷ 导电率 ÷ 截面积;0.017241 = 1/58)',\n '正式工程以产品标准与出厂检验单为准',\n ],\n scope: [\n '温度修正仅覆盖电阻,未修正单位重量与载流量',\n '适用温度 −40 ~ 90 ℃',\n '载流量为 150℃ 允许温度下的持续值,未做环境温度修正',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/copper/',\n};\n","export { copperMeta } from './meta';\n\n// 电阻温度修正与铜常数统一放在 src/common/resistance.ts(copper 与 voltage-drop 共用),\n// 由根 index 统一导出,此处仅内部引用,避免重复导出同名符号。\nimport { resistanceAtTempOhmPerKm } from '../common/resistance';\n\n/** 站点计算器内置的 6 个型号 */\nexport type CopperWireModel =\n | 'CTHM-120'\n | 'CTHM-150'\n | 'CTHA-120'\n | 'CTHA-150'\n | 'CTHS-120'\n | 'CTHS-150';\n\nexport interface WireParamEntry {\n /** 单位重量,kg/km(标称值) */\n readonly unitWeightKgPerKm: number;\n /** 20℃ 直流电阻,Ω/km */\n readonly r20OhmPerKm: number;\n /** 150℃ 持续载流量,室内口径,A */\n readonly ampacityIndoor150A: number;\n /** 150℃ 持续载流量,室外口径,A */\n readonly ampacityOutdoor150A: number;\n /** 口径说明:本行实际对应标准中的哪一行 */\n readonly note: string;\n}\n\n/**\n * 接触线参数表,来源 TB/T 2809-2017。\n *\n * 载流量为 150℃ 持续值(室内/室外双口径,标准表5)。\n *\n * 已与站点 `/calculator/assets/calc-core.js` 中的 COPPER_TABLE 逐项比对,\n * 6 个型号 × 4 项参数完全一致。\n *\n * 注:站点曾因显示层 `fmt()` 的尾零剥离正则把载流量渲染成 43/56(应为 430/560),\n * 已于 R38 之后修复。若再遇渲染值与本表不符,先确认是否为显示层问题:\n * 本表与服务端数据源始终一致。\n *\n * ⚠️ 注意型号口径:CTHM / CTHA / CTHS 是站点计算器的型号代码,与标准中的\n * CTMH / CTA / CTS 并非同名对应。`note` 字段说明各行实际取自标准的哪一行,\n * 交叉引用 TB/T 2809-2017 时请以 note 为准。\n */\nexport const TB2809_WIRE_PARAMS: Record<CopperWireModel, WireParamEntry> = {\n 'CTHM-120': {\n unitWeightKgPerKm: 1082,\n r20OhmPerKm: 0.2113,\n ampacityIndoor150A: 430,\n ampacityOutdoor150A: 560,\n note: '取标准 CTMH 行(高强度铜镁合金),ρ 按标准上限 0.02535 计算',\n },\n 'CTHM-150': {\n unitWeightKgPerKm: 1350,\n r20OhmPerKm: 0.169,\n ampacityIndoor150A: 500,\n ampacityOutdoor150A: 650,\n note: '取标准 CTMH 行(高强度铜镁合金)',\n },\n 'CTHA-120': {\n unitWeightKgPerKm: 1070,\n r20OhmPerKm: 0.1481,\n ampacityIndoor150A: 515,\n ampacityOutdoor150A: 680,\n note: '取标准 CTA 行(铜银合金),ρ ≤ 0.01777',\n },\n 'CTHA-150': {\n unitWeightKgPerKm: 1330,\n r20OhmPerKm: 0.1185,\n ampacityIndoor150A: 620,\n ampacityOutdoor150A: 785,\n note: '取标准 CTA 行(铜银合金)',\n },\n 'CTHS-120': {\n unitWeightKgPerKm: 1080,\n r20OhmPerKm: 0.1916,\n ampacityIndoor150A: 515,\n ampacityOutdoor150A: 680,\n note: '取标准 CTS 行(铜锡合金),载流量按 CTS 行取值',\n },\n 'CTHS-150': {\n unitWeightKgPerKm: 1345,\n r20OhmPerKm: 0.1533,\n ampacityIndoor150A: 620,\n ampacityOutdoor150A: 790,\n note: '取标准 CTS 行(铜锡合金),载流量按 CTS 行取值',\n },\n};\n\nexport interface CopperLookupInput {\n readonly model: CopperWireModel;\n /** 长度 l,km */\n readonly lengthKm: number;\n /** 环境温度 T,℃ */\n readonly ambientTempDegC: number;\n}\n\nexport interface CopperLookupResult extends WireParamEntry {\n readonly model: CopperWireModel;\n /** 总重量 W = w₀ × l,kg */\n readonly totalWeightKg: number;\n /** 温度修正电阻 r_T,Ω/km */\n readonly rTOhmPerKm: number;\n /** 全长温度修正电阻,Ω */\n readonly totalResistanceOhm: number;\n}\n\n/**\n * 按型号、长度与环境温度给出接触线参数速查结果。\n */\nexport function wireLookup(input: CopperLookupInput): CopperLookupResult {\n const { model, lengthKm, ambientTempDegC } = input;\n\n const params = TB2809_WIRE_PARAMS[model];\n if (params === undefined) {\n throw new RangeError(`未知型号:${model}`);\n }\n if (!(lengthKm > 0)) {\n throw new RangeError(`长度必须为正数,收到 ${lengthKm} km`);\n }\n if (ambientTempDegC < -40 || ambientTempDegC > 90) {\n throw new RangeError(`适用温度为 −40 ~ 90 ℃,收到 ${ambientTempDegC} ℃`);\n }\n\n const rT = resistanceAtTempOhmPerKm(params.r20OhmPerKm, ambientTempDegC);\n\n return {\n model,\n ...params,\n totalWeightKg: params.unitWeightKgPerKm * lengthKm,\n rTOhmPerKm: rT,\n totalResistanceOhm: rT * lengthKm,\n };\n}\n","import type { CalculatorMeta } from '../types';\n\nexport const strokeMeta: CalculatorMeta = {\n name: '补偿行程',\n nameEn: 'Compensation Stroke',\n summary:\n '按温度伸缩量公式计算锚段线索伸缩量与补偿装置所需行程,可对照装置许用行程校核。',\n formula: [\n '温度伸缩量:ΔL = α·L·Δt',\n '补偿行程设计值(含裕度):S = n·ΔL + S₀',\n ],\n references: [\n '全补偿锚段接触线与承力索须分别计算(各自 α/L 不同);半补偿仅计算接触线侧',\n '传动比常见规格:滑轮组 1:2/1:3(主流)、1:4 见于教材案例,无标准统一档位表',\n '安装裕度可参照补偿器 a/b 值:任何情况下不小于 200mm(原铁运〔2007〕69号第87条,已由铁总运〔2017〕9号承接);设计取值惯例不小于 300mm,属教材/设计惯例而非规程条款',\n '补偿装置产品要求见 TB/T 2075.12-2024(滑轮补偿装置)、TB/T 2075.13-2024(棘轮补偿装置)与 TB/T 2073-2020(零部件技术条件)',\n ],\n scope: [\n '锚段长度 L 为两端锚固点之间长度',\n '设计温差 Δt 为最高与最低设计温度之差',\n '铜合金线膨胀系数约 1.7×10⁻⁵/℃(EN 50149 铜锡接触线数据表)',\n '全补偿锚段承力索侧须另行计算',\n '参数取值以设计规程为准',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/stroke/',\n};\n","export { strokeMeta } from './meta';\n\n/** 补偿装置传动比(滑轮组/棘轮),n:1 中的 n */\nexport type TransmissionRatio = 2 | 3 | 4;\n\n/** 常见传动比档位 */\nexport const TRANSMISSION_RATIOS: readonly TransmissionRatio[] = [2, 3, 4];\n\n/** 安装裕度规程下限,mm(原铁运〔2007〕69号第87条) */\nexport const MIN_MARGIN_MM = 200;\n\n/** 安装裕度设计惯例值,mm(教材/设计惯例,非规程条款) */\nexport const CONVENTIONAL_MARGIN_MM = 300;\n\nexport interface StrokeInput {\n /** 锚段长度 L,m(两端锚固点之间) */\n readonly anchorLengthM: number;\n /** 设计温差 Δt,℃(最高与最低设计温度之差) */\n readonly tempRangeDegC: number;\n /** 线膨胀系数 α,1/℃(铜合金约 1.7e-5) */\n readonly expansionPerDegC: number;\n /** 补偿传动比 n(1:2 / 1:3 / 1:4) */\n readonly transmissionRatio: TransmissionRatio;\n /** 安装裕度 S₀,mm */\n readonly marginMM: number;\n /** 装置许用行程,mm。传 null 则不判定 */\n readonly allowableStrokeMM: number | null;\n}\n\nexport interface StrokeResult {\n /** 每℃伸缩量 α·L,mm/℃ */\n readonly perDegreeMM: number;\n /** 总伸缩量 ΔL = α·L·Δt,mm */\n readonly elongationMM: number;\n /** 所需行程 S = n·ΔL + S₀,mm */\n readonly requiredStrokeMM: number;\n readonly allowableStrokeMM: number | null;\n /** 富余量 = 许用行程 − 所需行程,mm。未提供许用行程时为 null */\n readonly marginMM: number | null;\n readonly verdict: 'pass' | 'fail' | 'not-assessed';\n}\n\n/**\n * 温度伸缩量:ΔL = α·L·Δt,mm。\n *\n * @param expansionPerDegC 线膨胀系数 α,1/℃\n * @param anchorLengthM 锚段长度 L,m\n * @param tempRangeDegC 设计温差 Δt,℃\n * @returns 伸缩量,mm\n */\nexport function elongationMM(\n expansionPerDegC: number,\n anchorLengthM: number,\n tempRangeDegC: number,\n): number {\n if (!(expansionPerDegC > 0)) {\n throw new RangeError(`线膨胀系数必须为正数,收到 ${expansionPerDegC} 1/℃`);\n }\n if (!(anchorLengthM > 0)) {\n throw new RangeError(`锚段长度必须为正数,收到 ${anchorLengthM} m`);\n }\n if (!(tempRangeDegC > 0)) {\n throw new RangeError(`设计温差必须为正数,收到 ${tempRangeDegC} ℃`);\n }\n return expansionPerDegC * anchorLengthM * tempRangeDegC * 1000;\n}\n\n/**\n * 补偿行程设计值(含裕度):S = n·ΔL + S₀,mm。\n *\n * @param elongation 总伸缩量 ΔL,mm\n * @param ratio 传动比 n\n * @param marginMM 安装裕度 S₀,mm\n */\nexport function requiredStrokeMM(\n elongation: number,\n ratio: TransmissionRatio,\n marginMM: number,\n): number {\n if (!(elongation >= 0)) {\n throw new RangeError(`伸缩量不能为负,收到 ${elongation} mm`);\n }\n if (!(marginMM >= 0)) {\n throw new RangeError(`安装裕度不能为负,收到 ${marginMM} mm`);\n }\n return ratio * elongation + marginMM;\n}\n\n/**\n * 计算锚段伸缩量与补偿装置所需行程,并可选对照许用行程校核。\n *\n * ⚠️ 全补偿锚段接触线与承力索须分别计算;本函数单次只算一根线索。\n */\nexport function strokeCheck(input: StrokeInput): StrokeResult {\n const { transmissionRatio, allowableStrokeMM } = input;\n\n if (!(TRANSMISSION_RATIOS as readonly number[]).includes(transmissionRatio)) {\n throw new RangeError(\n `传动比应为 ${TRANSMISSION_RATIOS.map((r) => `1:${r}`).join(' / ')},收到 1:${transmissionRatio}`,\n );\n }\n if (!(input.marginMM >= 0)) {\n throw new RangeError(`安装裕度不能为负,收到 ${input.marginMM} mm`);\n }\n\n const elongation = elongationMM(\n input.expansionPerDegC,\n input.anchorLengthM,\n input.tempRangeDegC,\n );\n const perDegreeMM = elongation / input.tempRangeDegC;\n const required = requiredStrokeMM(elongation, transmissionRatio, input.marginMM);\n\n if (allowableStrokeMM === null) {\n return {\n perDegreeMM,\n elongationMM: elongation,\n requiredStrokeMM: required,\n allowableStrokeMM: null,\n marginMM: null,\n verdict: 'not-assessed',\n };\n }\n\n if (!(allowableStrokeMM > 0)) {\n throw new RangeError(`装置许用行程必须为正数,收到 ${allowableStrokeMM} mm`);\n }\n\n return {\n perDegreeMM,\n elongationMM: elongation,\n requiredStrokeMM: required,\n allowableStrokeMM,\n marginMM: allowableStrokeMM - required,\n verdict: required <= allowableStrokeMM ? 'pass' : 'fail',\n };\n}\n","import type { CalculatorMeta } from '../types';\n\nexport const wavespeedMeta: CalculatorMeta = {\n name: '波速利用率',\n nameEn: 'Wave Propagation Speed Utilisation',\n summary:\n '由接触线张力与线密度求波传播速度 c 与波速利用率 β = v/c,给出跨距前三阶固有频率与一阶共振车速。',\n formula: [\n '波传播速度:c = √(T/ρ)(T 取 N,ρ 取 kg/m)',\n '波速利用率:β = v / c(v 换算为 m/s)',\n '两端固定弦固有频率:f_n = n/(2L)·√(T/ρ)',\n '一阶共振车速:v_res = f₁·L = c/2(跨距通过频率 v/L 与 f₁ 相遇)',\n ],\n references: [\n '依据本站 弓网关系 / 波传播 条目',\n 'β 达 0.7 时提示接近共振区,该阈值属工程经验值,请以设计文件为准',\n ],\n scope: [\n '张力 T:5 ~ 40 kN',\n '线密度 ρ:0.5 ~ 3 kg/m',\n '速度 v:20 ~ 500 km/h',\n '跨距 l:30 ~ 90 m',\n '两端固定弦模型,未考虑弹性支承与阻尼',\n '未考虑承力索与吊弦对波传播的影响',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/wavespeed/',\n};\n","export { wavespeedMeta } from './meta';\n\n/** 波速利用率告警阈值(工程经验值) */\nexport const DEFAULT_WARN_THRESHOLD = 0.7;\n\nexport interface WaveSpeedInput {\n /** 接触线张力 T,kN */\n readonly tensionKN: number;\n /** 线密度 ρ,kg/m */\n readonly linearMassKgPerM: number;\n /** 列车速度 v,km/h */\n readonly speedKmH: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 告警阈值 β。缺省 0.7 */\n readonly warnThreshold?: number;\n}\n\nexport interface WaveSpeedResult {\n /** 波传播速度 c = √(T/ρ),m/s */\n readonly waveSpeedMPerS: number;\n /** 波速利用率 β = v/c,无量纲 */\n readonly beta: number;\n /** 波速利用率,% */\n readonly betaPercent: number;\n /** 前三阶固有频率 f₁ ~ f₃,Hz */\n readonly naturalFrequenciesHz: readonly number[];\n /** 一阶共振车速 v_res = f₁·l,km/h */\n readonly resonanceSpeedKmH: number;\n /** β 是否达到告警阈值 */\n readonly warn: boolean;\n}\n\n/**\n * 波传播速度:c = √(T/ρ),m/s。\n *\n * @param tensionKN 接触线张力 T,kN\n * @param linearMassKgPerM 线密度 ρ,kg/m\n */\nexport function wavePropagationSpeedMPerS(\n tensionKN: number,\n linearMassKgPerM: number,\n): number {\n if (!(tensionKN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionKN} kN`);\n }\n if (!(linearMassKgPerM > 0)) {\n throw new RangeError(`线密度必须为正数,收到 ${linearMassKgPerM} kg/m`);\n }\n return Math.sqrt((tensionKN * 1e3) / linearMassKgPerM);\n}\n\n/**\n * 两端固定弦第 n 阶固有频率:f_n = n/(2L)·√(T/ρ) = n·c/(2L),Hz。\n *\n * @param n 阶次,正整数\n * @param spanM 跨距 L,m\n * @param waveSpeedMPerS 波速 c,m/s\n */\nexport function naturalFrequencyHz(\n n: number,\n spanM: number,\n waveSpeedMPerS: number,\n): number {\n if (!Number.isInteger(n) || n < 1) {\n throw new RangeError(`阶次必须为正整数,收到 ${n}`);\n }\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(waveSpeedMPerS > 0)) {\n throw new RangeError(`波速必须为正数,收到 ${waveSpeedMPerS} m/s`);\n }\n return (n / (2 * spanM)) * waveSpeedMPerS;\n}\n\n/** km/h → m/s */\nexport function kmHToMPerS(speedKmH: number): number {\n return speedKmH / 3.6;\n}\n\n/**\n * 波速利用率校核。\n *\n * β = v/c;β 越接近 1 越接近共振区,达到阈值(默认 0.7)时告警。\n * 一阶共振车速 v_res 为跨距通过频率与一阶固有频率相遇时的车速。\n */\nexport function waveSpeedCheck(input: WaveSpeedInput): WaveSpeedResult {\n const { tensionKN, linearMassKgPerM, speedKmH, spanM } = input;\n\n if (!(speedKmH >= 0)) {\n throw new RangeError(`速度不能为负,收到 ${speedKmH} km/h`);\n }\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n\n const c = wavePropagationSpeedMPerS(tensionKN, linearMassKgPerM);\n const beta = kmHToMPerS(speedKmH) / c;\n const fns = [1, 2, 3].map((n) => naturalFrequencyHz(n, spanM, c));\n const f1 = fns[0];\n if (f1 === undefined) {\n throw new Error('固有频率计算失败');\n }\n\n const threshold = input.warnThreshold ?? DEFAULT_WARN_THRESHOLD;\n\n return {\n waveSpeedMPerS: c,\n beta,\n betaPercent: beta * 100,\n naturalFrequenciesHz: fns,\n resonanceSpeedKmH: f1 * spanM * 3.6,\n warn: beta >= threshold,\n };\n}\n","import type { CalculatorMeta } from '../types';\n\nexport const voltageDropMeta: CalculatorMeta = {\n name: '电压降校核',\n nameEn: 'Voltage Drop Check',\n summary:\n '按温度修正后的单位电阻计算供电臂电压损失 ΔU 与末端电压,用于供电臂长度与导线截面校核。',\n formula: [\n '单位电阻温度修正:r_T = r₂₀·[1 + α·(T − 20)](α = 0.00393 /℃)',\n '并联 n 路时:r_T / n',\n '电压损失:ΔU = I · r_T · L(r_T 单位 Ω/km,L 单位 km)',\n '末端电压:U_end = U₀ − ΔU;压降率 = ΔU / U₀',\n ],\n references: [\n '依据本站 供电计算 / 电气设计 条目',\n '末端电压限值:25kV 体系常按 20kV 掌握;实际限值以设计文件与供电计算书为准',\n ],\n scope: [\n '母线电压 U₀:20000 ~ 30000 V',\n '持续电流 I:10 ~ 3000 A',\n '单位电阻 r₂₀:0.05 ~ 1 Ω/km',\n '供电臂等效长度 L:1 ~ 60 km',\n '环境温度:−40 ~ 80 ℃',\n '单回路集中负荷模型,未考虑负荷沿供电臂分布与再生制动',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/voltage-drop/',\n};\n","export { voltageDropMeta } from './meta';\n\n/** 25kV 体系常用的末端电压下限,V */\nexport const DEFAULT_MIN_END_VOLTAGE_V = 20000;\n\n// 电阻温度修正统一来自 src/common/resistance.ts(copper 与 voltage-drop 共用)\nimport { resistanceAtTempOhmPerKm } from '../common/resistance';\n\nexport interface VoltageDropInput {\n /** 变电所母线电压 U₀,V */\n readonly busVoltageV: number;\n /** 持续电流 I,A */\n readonly currentA: number;\n /** 20℃ 单位电阻 r₂₀,Ω/km */\n readonly r20OhmPerKm: number;\n /** 供电臂等效长度 L,km */\n readonly feederLengthKm: number;\n /** 环境温度 T,℃。缺省 25 */\n readonly tempDegC?: number;\n /** 并联导线数。缺省 1 */\n readonly parallelCount?: number;\n /** 末端最低允许电压,V。缺省 20000 */\n readonly minEndVoltageV?: number;\n}\n\nexport interface VoltageDropResult {\n /** 温度修正(并含并联折减)后的单位电阻 r_T,Ω/km */\n readonly rTOhmPerKm: number;\n /** 电压损失 ΔU,V */\n readonly voltageDropV: number;\n /** 末端电压 U_end,V */\n readonly endVoltageV: number;\n /** 压降率,% */\n readonly dropPercent: number;\n /** 末端电压是否满足要求 */\n readonly passes: boolean;\n}\n\n/**\n * 电压降校核:ΔU = I·r_T·L(并联 n 路时 r_T/n),U_end = U₀ − ΔU。\n */\nexport function voltageDropCheck(input: VoltageDropInput): VoltageDropResult {\n const { busVoltageV, currentA, r20OhmPerKm, feederLengthKm } = input;\n\n if (!(busVoltageV > 0)) {\n throw new RangeError(`母线电压必须为正数,收到 ${busVoltageV} V`);\n }\n if (!(currentA > 0)) {\n throw new RangeError(`持续电流必须为正数,收到 ${currentA} A`);\n }\n if (!(feederLengthKm > 0)) {\n throw new RangeError(`供电臂长度必须为正数,收到 ${feederLengthKm} km`);\n }\n\n const parallelCount = input.parallelCount ?? 1;\n if (!(parallelCount > 0) || !Number.isInteger(parallelCount)) {\n throw new RangeError(`并联导线数必须为正整数,收到 ${parallelCount}`);\n }\n\n const minEndVoltageV = input.minEndVoltageV ?? DEFAULT_MIN_END_VOLTAGE_V;\n\n const rT =\n resistanceAtTempOhmPerKm(r20OhmPerKm, input.tempDegC ?? 25) / parallelCount;\n const voltageDropV = currentA * rT * feederLengthKm;\n const endVoltageV = busVoltageV - voltageDropV;\n\n return {\n rTOhmPerKm: rT,\n voltageDropV,\n endVoltageV,\n dropPercent: (voltageDropV / busVoltageV) * 100,\n passes: endVoltageV >= minEndVoltageV,\n };\n}\n","import type { CalculatorMeta } from '../types';\n\nexport const curveStaggerMeta: CalculatorMeta = {\n name: '曲线拉出值校核',\n nameEn: 'Curve Stagger Clearance Check',\n summary:\n '计算曲线区段跨中综合偏移(拉出值均值、曲线矢度、风偏的组合),与受电弓容许偏移比较给出判定。',\n formula: [\n '平均拉出值:ā = (a₁ + a₂) / 2',\n '曲线矢度:c = l² / (8R)(直线段 R = ∞ 时 c = 0)',\n '超高横移:δ = H·h / l₀',\n '跨中风偏:p_w = (½·ρ·v²·d·α) · l² / (8T)(取风向垂直线路的最不利工况)',\n '综合偏移:e = max(|ā + c|, |ā − c|) + p_w ≤ [e]',\n ],\n references: [\n '依据本站 拉出值设计 条目',\n '风偏取风向垂直线路的最不利工况(sin²θ = 1)',\n '容许偏移 [e] 按受电弓动态包络线取值,以设计文件为准',\n ],\n scope: [\n '曲线半径 R:0 ~ 20000 m(直线传 0 或 Infinity)',\n '跨距 l:20 ~ 80 m',\n '拉出值 a₁/a₂:−0.6 ~ 0.6 m(曲线内侧为正)',\n '风速 v:0 ~ 60 m/s',\n '线索直径 d:1 ~ 30 mm',\n '风载体型系数 α:0.5 ~ 2',\n '张力 T:5 ~ 40 kN',\n '滑板面距轨面 H:4 ~ 8 m;外轨超高 h:0 ~ 0.25 m;轨距 l₀ 默认 1.435 m',\n '⚠️ 站点源码的 JSDoc 写明综合偏移含超高横移项 ∓δ,但实现中 δ 仅计算返回、未参与 e 的合成。本库按实现行为对齐,详见测试中的说明',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/curve-stagger/',\n};\n","export { curveStaggerMeta } from './meta';\n\n/** 标准轨距,m */\nexport const STANDARD_GAUGE_M = 1.435;\n\n/** 滑板面距轨面的常用值,m */\nexport const DEFAULT_PANTOGRAPH_HEIGHT_M = 6.0;\n\nexport interface CurveStaggerInput {\n /** 曲线半径 R,m。直线段传 0 或 Infinity */\n readonly curveRadiusM: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 定位点 1 拉出值 a₁,m(曲线内侧为正) */\n readonly stagger1M: number;\n /** 定位点 2 拉出值 a₂,m(曲线内侧为正) */\n readonly stagger2M: number;\n /** 风速 v,m/s */\n readonly windSpeedMPerS: number;\n /** 线索直径 d,m */\n readonly wireDiameterM: number;\n /** 风载体型系数 α */\n readonly dragCoefficient: number;\n /** 线索张力 T,N */\n readonly tensionN: number;\n /** 容许偏移 [e],m */\n readonly allowableOffsetM: number;\n /** 滑板面距轨面 H,m。缺省 6.0 */\n readonly pantographHeightM?: number;\n /** 外轨超高 h,m。缺省 0 */\n readonly cantM?: number;\n /** 轨距 l₀,m。缺省 1.435 */\n readonly gaugeM?: number;\n}\n\nexport interface CurveStaggerResult {\n /** 平均拉出值 ā,m */\n readonly meanStaggerM: number;\n /** 曲线矢度 c = l²/(8R),m。直线段为 0 */\n readonly versineM: number;\n /** 超高横移 δ = H·h/l₀,m */\n readonly cantShiftM: number;\n /** 跨中风偏 p_w,m */\n readonly windOffsetM: number;\n /** 矢度与拉出值同向时的偏移,m */\n readonly offsetPlusM: number;\n /** 矢度与拉出值反向时的偏移,m */\n readonly offsetMinusM: number;\n /** 取两者较大值,m */\n readonly maxOffsetM: number;\n /** 是否满足容许偏移 */\n readonly passes: boolean;\n}\n\n/**\n * 曲线矢度:c = l² / (8R),m。\n * 直线段(R = 0 或 Infinity)返回 0。\n */\nexport function versineM(spanM: number, curveRadiusM: number): number {\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(curveRadiusM > 0) || !Number.isFinite(curveRadiusM)) {\n return 0;\n }\n return (spanM * spanM) / (8 * curveRadiusM);\n}\n\n/**\n * 超高横移:δ = H·h / l₀,m。\n *\n * @param cantM 外轨超高 h,m\n * @param pantographHeightM 滑板面距轨面 H,m\n * @param gaugeM 轨距 l₀,m\n */\nexport function cantShiftM(\n cantM: number,\n pantographHeightM: number = DEFAULT_PANTOGRAPH_HEIGHT_M,\n gaugeM: number = STANDARD_GAUGE_M,\n): number {\n if (!(cantM >= 0)) {\n throw new RangeError(`外轨超高不能为负,收到 ${cantM} m`);\n }\n if (!(pantographHeightM > 0)) {\n throw new RangeError(`滑板面距轨面必须为正数,收到 ${pantographHeightM} m`);\n }\n if (!(gaugeM > 0)) {\n throw new RangeError(`轨距必须为正数,收到 ${gaugeM} m`);\n }\n return (pantographHeightM * cantM) / gaugeM;\n}\n\n/**\n * 曲线区段跨中综合偏移校核。\n *\n * 风偏取风向垂直线路的最不利工况(sin²θ = 1)。\n *\n * ⚠️ 与站点源码一致:超高横移 δ 会计算并返回,但**不参与** e 的合成。\n * 站点 JSDoc 描述的公式为 `e = |ā ± c ∓ δ| + p_w`,与其实现不符;\n * 若站点后续修正,本库的 offsetPlusM / offsetMinusM 需同步调整。\n */\nexport function curveStaggerCheck(input: CurveStaggerInput): CurveStaggerResult {\n const { spanM, stagger1M, stagger2M, wireDiameterM, dragCoefficient, tensionN } = input;\n\n if (!(tensionN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionN} N`);\n }\n if (!(wireDiameterM > 0)) {\n throw new RangeError(`线索直径必须为正数,收到 ${wireDiameterM} m`);\n }\n if (!(dragCoefficient > 0)) {\n throw new RangeError(`风载体型系数必须为正数,收到 ${dragCoefficient}`);\n }\n if (!(input.windSpeedMPerS >= 0)) {\n throw new RangeError(`风速不能为负,收到 ${input.windSpeedMPerS} m/s`);\n }\n if (!(input.allowableOffsetM > 0)) {\n throw new RangeError(`容许偏移必须为正数,收到 ${input.allowableOffsetM} m`);\n }\n\n const meanStaggerM = (stagger1M + stagger2M) / 2;\n const c = versineM(spanM, input.curveRadiusM);\n const delta = cantShiftM(\n input.cantM ?? 0,\n input.pantographHeightM ?? DEFAULT_PANTOGRAPH_HEIGHT_M,\n input.gaugeM ?? STANDARD_GAUGE_M,\n );\n\n // 单位风荷载 p = ½·ρ·v²·d·α·sin²θ,取 sin²θ = 1(风向垂直线路最不利)\n const rhoAir = 1.225;\n const windLoadNPerM =\n 0.5 * rhoAir * input.windSpeedMPerS * input.windSpeedMPerS * wireDiameterM * dragCoefficient;\n const pw = (windLoadNPerM * spanM * spanM) / (8 * tensionN);\n\n const offsetPlusM = Math.abs(meanStaggerM + c) + pw;\n const offsetMinusM = Math.abs(meanStaggerM - c) + pw;\n const maxOffsetM = Math.max(offsetPlusM, offsetMinusM);\n\n return {\n meanStaggerM,\n versineM: c,\n cantShiftM: delta,\n windOffsetM: pw,\n offsetPlusM,\n offsetMinusM,\n maxOffsetM,\n passes: maxOffsetM <= input.allowableOffsetM,\n };\n}\n","import type { CalculatorMeta } from '../types';\n\nexport const icingMeta: CalculatorMeta = {\n name: '覆冰荷载校核',\n nameEn: 'Ice Load Check',\n summary:\n '按冰筒模型计算覆冰荷载,给出覆冰后的总垂直荷载、弛度及相对无冰工况的增幅。',\n formula: [\n '冰筒模型冰重:g_ice = ρ_ice · g₀ · π · b · (d + b)',\n '覆冰后总垂直荷载:g_total = g_self + g_ice',\n '无冰弛度:f₀ = g_self·l² / (8T)',\n '覆冰弛度:f_ice = g_total·l² / (8T)',\n '弛度增幅:(f_ice / f₀ − 1) × 100%',\n ],\n references: [\n '依据本站 覆冰荷载 / 荷载计算 条目',\n '冰密度默认 900 kg/m³,轻覆冰地区可取更小值,以当地气象资料为准',\n '均匀冰筒假设,未考虑不规则覆冰形态',\n ],\n scope: [\n '线索直径 d:1 ~ 40 mm',\n '覆冰厚度 b:0 ~ 50 mm(0 表示无冰)',\n '张力 T:1 ~ 40 kN',\n '跨距 l:10 ~ 90 m',\n '线索自重 g_self:1 ~ 60 N/m',\n '冰密度 ρ_ice:500 ~ 950 kg/m³',\n '均匀冰筒模型,未考虑不均匀覆冰、脱冰跳跃与风冰组合',\n '弛度按抛物线近似,未考虑覆冰后张力变化(未与状态方程耦合)',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/icing/',\n};\n","export { icingMeta } from './meta';\n\n// 冰筒模型与 tension 模块共用 src/common/ice.ts,由根 index 统一导出\nimport { iceLoadNPerM, type IceLoadParams } from '../common/ice';\n\nexport interface IcingCheckInput {\n /** 线索直径 d,m */\n readonly wireDiameterM: number;\n /** 覆冰厚度 b,m。传 0 表示无冰 */\n readonly iceThicknessM: number;\n /** 线索张力 T,N */\n readonly tensionN: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 线索自重 g_self,N/m */\n readonly selfWeightNPerM: number;\n /** 冰密度 ρ_ice,kg/m³。缺省 900 */\n readonly iceDensityKgPerM3?: number;\n}\n\nexport interface IcingCheckResult {\n /** 单位长度冰重 g_ice,N/m */\n readonly iceLoadNPerM: number;\n /** 覆冰后总垂直荷载 g_total,N/m */\n readonly totalLoadNPerM: number;\n /** 无冰弛度 f₀,m */\n readonly sagNoIceM: number;\n /** 覆冰弛度 f_ice,m */\n readonly sagWithIceM: number;\n /** 弛度增幅,% */\n readonly growthPercent: number;\n /** 冰重是否超过线索自重(重覆冰判据) */\n readonly heavy: boolean;\n}\n\n/**\n * 覆冰综合校核。\n *\n * 给出覆冰后的总垂直荷载、弛度及增幅;冰重超过线索自重时 `heavy` 为真。\n *\n * ⚠️ 弛度按抛物线近似,且**未与张力-温度状态方程耦合** —— 覆冰引起的\n * 张力变化未计入,大覆冰工况偏于乐观。\n */\nexport function icingCheck(input: IcingCheckInput): IcingCheckResult {\n const { wireDiameterM, iceThicknessM, tensionN, spanM, selfWeightNPerM } = input;\n\n if (!(tensionN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionN} N`);\n }\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(selfWeightNPerM > 0)) {\n throw new RangeError(`线索自重必须为正数,收到 ${selfWeightNPerM} N/m`);\n }\n\n const iceParams: IceLoadParams = {\n wireDiameterM,\n iceThicknessM,\n ...(input.iceDensityKgPerM3 === undefined\n ? {}\n : { iceDensityKgPerM3: input.iceDensityKgPerM3 }),\n };\n const gIce = iceLoadNPerM(iceParams);\n const gTotal = selfWeightNPerM + gIce;\n\n const fNoIce = (selfWeightNPerM * spanM * spanM) / (8 * tensionN);\n const fIce = (gTotal * spanM * spanM) / (8 * tensionN);\n\n return {\n iceLoadNPerM: gIce,\n totalLoadNPerM: gTotal,\n sagNoIceM: fNoIce,\n sagWithIceM: fIce,\n growthPercent: (fIce / fNoIce - 1) * 100,\n heavy: gIce > selfWeightNPerM,\n };\n}\n"],"mappings":"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","names":["weightPerLengthNPerM","windLoadNPerM","windLoadNPerM"]}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "ocs-calculators",
3
+ "version": "0.1.0",
4
+ "description": "铁路接触网(OCS)工程计算工具集 —— 张力、弛度、吊弦、风偏移等计算,零依赖纯函数实现 / Railway overhead contact system (OCS) engineering calculators as zero-dependency pure functions",
5
+ "keywords": [
6
+ "catenary",
7
+ "overhead-contact-line",
8
+ "overhead-contact-system",
9
+ "ocs",
10
+ "pantograph",
11
+ "railway",
12
+ "railway-electrification",
13
+ "contact-wire",
14
+ "engineering-calculator",
15
+ "接触网",
16
+ "电气化铁路",
17
+ "铁路供电"
18
+ ],
19
+ "license": "MIT",
20
+ "type": "module",
21
+ "main": "./dist/index.cjs",
22
+ "module": "./dist/index.js",
23
+ "types": "./dist/index.d.ts",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js",
28
+ "require": "./dist/index.cjs"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "README.md",
34
+ "README_EN.md",
35
+ "DISCLAIMER.md",
36
+ "CHANGELOG.md"
37
+ ],
38
+ "sideEffects": false,
39
+ "scripts": {
40
+ "build": "tsup src/index.ts --format esm,cjs --dts --sourcemap --target es2022",
41
+ "test": "vitest run",
42
+ "test:watch": "vitest",
43
+ "typecheck": "tsc --noEmit",
44
+ "prepublishOnly": "npm run typecheck && npm run test && npm run build"
45
+ },
46
+ "devDependencies": {
47
+ "tsup": "^8.3.5",
48
+ "typescript": "^5.7.2",
49
+ "vitest": "^2.1.8"
50
+ },
51
+ "engines": {
52
+ "node": ">=18"
53
+ },
54
+ "homepage": "https://www.itswe.com",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/showhoo/ocs-calculators.git"
58
+ },
59
+ "bugs": {
60
+ "url": "https://github.com/showhoo/ocs-calculators/issues"
61
+ },
62
+ "author": "思维接触网百科"
63
+ }