Open validation benchmark — can you trust the cone crusher model?

Run it yourself. 26 of 26 checks pass. The benchmark found a real bug — we publish that too.

6/6物理不变量
2/2确定性
5/5失效边界
8/8不确定度
5/5回归
93 ms运行时间

生成于 2026-10-08 21:52 · 模型文件 plugin/lib/simulate.mjs

How to run it

node distribution/03_验证与基准/公开基准/run-benchmark.mjs

# 机器可读结果
node run-benchmark.mjs --json

# 退出码 0 = 全部通过;非 0 = 有失败项,会打印具体原因

Zero dependencies. Node.js ≥ 18. Takes about 100 ms. Licensed CC-BY-4.0 — copy it, modify it, redistribute it.

What it checks

四类可严格验证的性质。这些是【必要条件】,不是预测精度的证明 —— 见下方「已知边界」。

物理不变量 6 / 6

编号检查项结果实测
A-01质量守恒:28 组工况 |ΣP−1| < 1e-2✅ 通过最坏 1.40e-3 @CSS6/F80=300
A-02无负质量分量(数值稳定)✅ 通过最大负质量 0.00e+0
A-03产品 P80 < 给料 P80(破碎必然变细)✅ 通过6 组全部满足
A-04CSS 越大 → 产品越粗(严格单调)✅ 通过10.9 → 11.7 → 12.6 → 13.8 → 15.1 → 16.8 → 19.5 → 24.3 → 29.1
A-05给料越粗 → 产品不更细(单调不降)✅ 通过16 → 17 → 17 → 17 → 17 → 17
A-06啮合区 K1 > CSS > K2(几何自洽)✅ 通过K1=36 K2=0.1 (CSS=16)

确定性 2 / 2

编号检查项结果实测
B-01重复计算 10 次逐字节一致✅ 通过输出 1324 字符完全一致
B-02顺序无关(无全局状态泄漏)✅ 通过插入 3 次其他计算后结果不变

失效边界 5 / 5

编号检查项结果实测
C-01CSS = 0 必须拒绝✅ 通过已拒绝: cssMm 必须为正数(紧边排矿口 mm)
C-02CSS 为负必须拒绝✅ 通过已拒绝: cssMm 必须为正数(紧边排矿口 mm)
C-03CSS = NaN 必须拒绝✅ 通过已拒绝: cssMm 必须为正数(紧边排矿口 mm)
C-04CSS = Infinity 必须拒绝✅ 通过已拒绝: cssMm 必须为正数(紧边排矿口 mm)
C-05正常工况必须接受✅ 通过正常接受

不确定度 8 / 8

编号检查项结果实测
D-01返回点估计(数值在合理量级)✅ 通过15.12 mm
D-02返回误差区间且区间包含点估计✅ 通过12.54 – 17.7 mm
D-03给出置信分级 A/B/C/D✅ 通过B (±17.1%) —— 区间中等(±10~25%),可用于初步方案与设备预选
D-04指出主导误差源(可指导标定优先级)✅ 通过啮合区宽度系数 (75.9%)
D-05未标定时明确声明"未经实测标定"✅ 通过已声明
D-06设备参数(铭牌值)不计入未知不确定度✅ 通过单列提示: 偏心距(冲程)mm、偏心轴转速 rpm
D-07确定性:同样输入两次结果一致✅ 通过逐字节一致
D-08误差棒随 CSS 变化(不是写死的常数)✅ 通过CSS10 → ±24%,CSS30 → ±9.3%

回归 5 / 5

编号检查项结果实测
R-01CSS10/F80100 与基线一致(相对差 < 1%)✅ 通过P80 12.609 vs 基线 12.609(差 0.00%)
R-02CSS16/F80120 与基线一致(相对差 < 1%)✅ 通过P80 15.12 vs 基线 15.12(差 0.00%)
R-03CSS25/F80200 与基线一致(相对差 < 1%)✅ 通过P80 19.534 vs 基线 19.534(差 0.00%)
R-04CSS32/F80250 与基线一致(相对差 < 1%)✅ 通过P80 24.32 vs 基线 24.32(差 0.00%)
R-05CSS6/F8060 与基线一致(相对差 < 1%)✅ 通过P80 10.837 vs 基线 10.837(差 0.00%)

The bug this benchmark found

2026-10:质量守恒检查报告误差 5.21e+78,而 P80 输出看起来完全合理。

这是最危险的一类错误 —— 静默产错。逐层剥离后定位到三处根本性问题:

  1. 破碎矩阵用了累积型(列和 1.00 / 1.52 / 1.84 … ≠ 1)。质量守恒的必要条件是矩阵列随机。
  2. 算子顺序反了:解 (I−BC)·P = (I−C)·F,正确应为 (I−bC)·X = F 再 P = (I−C)·X。两者不可交换。
  3. 最细级未吸收亚筛级物料 → 质量漏出计算网格。

另有一段写着「数值保护」的 C_EPS = 1e-9 夹紧 —— 它才是爆炸的直接原因:把对角元 1−C 变成 1e-9,回代时被直接相除,逐级放大 1e9。

修正后:1.40e-3,跨越 81 个数量级。P80 数值也变了(19.35 → 15.12 mm,差 28%)—— 新值才是对的。

这段经历本身就是基准价值的证明:单点测试抓不到,物理不变量检查抓到了。

Uncertainty — and one classification mistake we made

第一版不确定度分析给出 ±162.6%,主导误差源是「转速 rpm」占 96.6%。这个结论是错的。

转速与偏心距是设备铭牌参数,查铭牌就有 —— 把它们算进「模型不确定度」是分类错误,会得出过度悲观的结论。真正需要标定的是 φ / γ / β / 啮合区宽度系数。

修正后:±17.1%,置信分级 B。未提供的设备参数单列提示,而不是混进误差棒。

参数敏感度(标定优先级)

参数P80 区间 mm跨度含义
φ 粗粒生成占比15.91 – 14.33±5%影响较小
γ 粗端指数13.9 – 15.8±6%影响较小
β 细端指数14.8 – 15.35±2%影响较小
偏心距 mm12.63 – 20.04±25%中等影响
啮合区宽度系数12.72 – 17.23±15%影响较小
转速 rpm59.97 – 11.64±160%最敏感 —— 标定优先测它

Cross-check against published measured data

我们找到并下载了一份公开的、CC-BY-4.0 许可的破碎实测数据集,用它做交叉验证:

项内容
数据集Granite jaw crushing dataset: particle size distribution of feed and product
DOI10.5281/zenodo.21239431(CC-BY-4.0)
来源Piotr Bortnowski,Wrocław University of Science and Technology
样本23 组配对(给料 8 粒级,产品 11 粒级)
拟合结果23 / 23 组产品细端服从 Rosin-Rammler,R² 中位数 0.9875
n 稳定性均值 0.728 · 标准差 0.046(同类矿石同工艺下行为一致)

这确认了:产品粒度分布确实服从 Rosin-Rammler 形式 —— 支持本模型用 RR 拟合给料的做法。

这份交叉验证【不能】证明什么(如实说明):

  1. 平台不同:该数据集是颚式破碎机,本模型是圆锥破碎机。破碎函数形式相同但参数不同,不验证绝对预测精度。
  2. 产品只覆盖细端:产品与给料的质量比仅 1.92%,说明产品表只记录了细端样本,全粒级质量平衡无法闭合。
  3. 不验证 φ/γ/β 的具体取值:那需要圆锥破的现场实测数据。欢迎提供。

Cross-check 2 — single-particle breakage experiments

第二份公开实测数据:单颗粒压缩破碎试验,用来自动识别破碎事件并拟合破碎力分布。

项内容
数据集Data for Discrete element modelling and experimental validation of brittle particle comminution
DOI10.5281/zenodo.21702040(CC-BY-4.0)
材料沸石 ZEOLITE_DASUN(软质,莫氏 3.5-4)
设备Microtest MA Schmeltzer 单颗粒压缩试验机,0.5 mm/min
样本4 个粒级 · 共 200 次单颗粒压缩试验

威布尔拟合(P(F) = 1 − exp(−(F/F0)^m))

粒级d̄ mmm(形状)F0 N(特征力)R²
2.50-2.80mm2.653.00827.090.9261
3.15-3.35mm3.253.26535.760.9509
3.55-4.00mm3.7752.62146.140.9664
4.00-4.50mm4.252.19450.810.9771

破碎力确实服从威布尔分布 → 支持本模型所有基于 Weibull 的分析(衬板寿命 B10、市场统计的 weibull 模式)。

尺寸效应

比强度 F0/d² 随粒径下降 27.1% —— 存在尺寸效应,与 Weibull 最弱链理论一致

这份交叉验证【不能】证明什么:

  1. 材料不同:数据为软质沸石(莫氏 3.5-4),我们的目标矿石是中等硬度以上(莫氏 6-7)。不验证绝对强度数值。
  2. 单颗粒 ≠ 料层:圆锥破是料层破碎,单颗粒压缩的破碎函数数值不可直接套用。

What this benchmark does NOT do

  1. 不验证绝对预测精度。我们没有权威的现场实测数据集可用于对标,做不到。这是已知缺口,如实标注。
  2. 物理不变量是必要条件,不是充分条件。一个恒定输出 0 的模型也满足「无负质量」。
  3. 回归基线不是「真值」,只是当前行为快照 —— 它的作用是逼改动者解释为什么数值变了。
  4. 不覆盖动态行为(启动、堵料、衬板磨损演化)与所有机型。

How to extend it with your own plant data

输入:该工况的给料筛析(累积通过 %)+ CSS + 机型/腔型
     该工况的产品筛析(累积通过 %)

步骤:1. 用 mackorn_calibrate 反算 φ/γ/β 与啮合系数
     2. 记录拟合 RMSE 与逐点残差
     3. 用【另一工况】的数据做独立验证(不是同一批数据)
     4. 把结果加进基准的 expected.json

判据:独立验证工况的 P80 相对误差 < 10% 视为通过

我们欢迎任何人提交实测数据来扩充这个基准。数据要求:公开可引用、来源可核查、含 CSS 与两侧筛析。

How to call the model

curl -s https://mackorn.cn/ai/api/mcp.php \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"mackorn_crusher_curve",
                 "arguments":{"css_mm":16,"feed_p80_mm":120,"ore":"granite"}}}'

# 返回里含 uncertainty 字段:点估计、误差区间、置信分级、主导误差源