lingshu-solver 1.0.6 → 1.0.7

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.
Files changed (2) hide show
  1. package/index.html +22 -8
  2. package/package.json +1 -1
package/index.html CHANGED
@@ -4737,7 +4737,7 @@ function suan7(state) {
4737
4737
  for (var kb in known) ibox[kb] = { min: known[kb], max: known[kb] };
4738
4738
  ibox[uv] = box;
4739
4739
  var iF = intervalEval(eq, ibox);
4740
- if (iF && (iF.max < 0 || iF.min > 0)) {
4740
+ if (iF && _ivExcludesZero(iF)) {
4741
4741
  state.done = true;
4742
4742
  var knownList = Object.keys(known).sort().map(function(v) { return v + "=" + known[v]; }).join(", ");
4743
4743
  state.result = { solutions: [], error: "NO_SOLUTION", message: "前向传播检测到矛盾:代入已知值后,方程在变量 " + uv + " 的全域上 f 的严格区间包络不含 0(包络=[" + iF.min.toExponential(2) + "," + iF.max.toExponential(2) + "]),严格证明无根", detail: "已知值: " + knownList, executionPath: "前向传播矛盾检测", timeMs: performance.now() - state.startTime, confidence: "high", varNames: state.varNames, resultType: 1, resultTypeName: "空结果", resultTypeDesc: "前向传播检测到矛盾" };
@@ -6594,6 +6594,16 @@ var _affSym = 0;
6594
6594
  function _Aff(c, e) { return { c: c, e: e || {} }; }
6595
6595
  function _affRad(a) { if (!a) return 0; var r = 0; for (var k in a.e) r += Math.abs(a.e[k]); return r; }
6596
6596
  function _affToInterval(a) { if (!a) return null; var r = _affRad(a); return _iNorm({ min: a.c - r, max: a.c + r }); }
6597
+ // sound 容差:区间求值受浮点舍入影响,包络可能偏离真值几个 ulp(如 12/5 经 12*(1/5)
6598
+ // 算得 2.4000000000000001,与字面 2.4 差 ~2e-16,加仿射半径后包络中心落正侧)。
6599
+ // 判"严格不含 0 → 证明无解/严格单调"时,必须要求包络离 0 超过此容差;否则保守地
6600
+ // 不判无解(降级为继续求解 / 诚实报未找到),绝不因舍入把真解误杀为假阴性(sound-safe,
6601
+ // 绝不引入假阳性)。容差随量级缩放(相对 1e-12)+ 1e-12 绝对下限。
6602
+ function _ivExcludesZero(iv) {
6603
+ if (!iv || !isFinite(iv.min) || !isFinite(iv.max)) return false;
6604
+ var pad = Math.max(1e-12, 1e-12 * Math.max(1, Math.abs(iv.min), Math.abs(iv.max)));
6605
+ return iv.max < -pad || iv.min > pad;
6606
+ }
6597
6607
  function _affAdd(a, b) { var e = {}; for (var k in a.e) e[k] = a.e[k]; for (var k in b.e) e[k] = (e[k] || 0) + b.e[k]; return _Aff(a.c + b.c, e); }
6598
6608
  function _affSub(a, b) { var e = {}; for (var k in a.e) e[k] = a.e[k]; for (var k in b.e) e[k] = (e[k] || 0) - b.e[k]; return _Aff(a.c - b.c, e); }
6599
6609
  function _affMul(a, b) {
@@ -6610,14 +6620,18 @@ function _affMul(a, b) {
6610
6620
  }
6611
6621
  function _affInv(b) {
6612
6622
  // 1/b 一阶泰勒,误差保守界 |(b-b0)^2|/(2 b0^2 ξ^2),ξ∈盒,min|ξ|=|b0|-rb
6623
+ // ⚠️ 修正(sound 正确性,2026-09-07):旧实现 r=0-b=-b,lin=(-1/b.c²)·(-b) 的中心 lin.c 已是 1/b.c,
6624
+ // return 又写 1/b.c + lin.c → 中心被双重计数为 2/b.c(如 1/5 算成 0.4、12/5 算成 4.8),
6625
+ // 导致所有含除法的区间包络 / 中值定理判无解(suan7/suan29/suan35 等)系统性假阴性。
6626
+ // 正确:dev = b - b.c(中心 0)做一阶泰勒,lin.c=0,return 中心恰为 1/b.c,且噪声符号正确。
6613
6627
  var rb = _affRad(b); if (b.c === 0) return null;
6614
- var r = _affSub(_Aff(0, {}), b);
6615
- var lin = _affMul(r, _Aff(-1 / (b.c * b.c), {}));
6628
+ var dev = _affSub(b, _Aff(b.c, {})); // b - b0,中心为 0
6629
+ var lin = _affMul(dev, _Aff(-1 / (b.c * b.c), {})); // 一阶项,中心为 0
6616
6630
  var e = {}; for (var k in lin.e) e[k] = lin.e[k];
6617
6631
  var m = Math.abs(b.c) - rb; if (m <= 0) return null;
6618
6632
  var err = (rb * rb) / (2 * b.c * b.c * m * m);
6619
6633
  var sym = _affSym++; e[sym] = err;
6620
- return _Aff(1 / b.c + lin.c, e);
6634
+ return _Aff(1 / b.c + lin.c, e); // 现 lin.c=0 → 中心 = 1/b.c
6621
6635
  }
6622
6636
  function _affDiv(a, b) { var ib = _affInv(b); return ib ? _affMul(a, ib) : null; }
6623
6637
  function _buildAffEnv(intervals) {
@@ -6705,7 +6719,7 @@ function suan29(state) {
6705
6719
 
6706
6720
  // 严格测试①(最强):f 在区间上的区间包络不含 0 → 由中值定理严格证明该盒内无根
6707
6721
  var F = intervalEval(state.equations[0], box);
6708
- if (F && (F.max < 0 || F.min > 0)) {
6722
+ if (F && _ivExcludesZero(F)) {
6709
6723
  state.done = true;
6710
6724
  state.result = { solutions: [], error: "NO_SOLUTION", provenEmpty: true, message: "f 在 [" + a + "," + b + "] 上的严格区间包络不含 0(包络=[" + F.min.toExponential(2) + "," + F.max.toExponential(2) + "]),由中值定理严格证明该盒内无根", executionPath: "导数单调性剪枝", timeMs: performance.now() - state.startTime, confidence: "high", varNames: state.varNames, resultType: 1, resultTypeName: "空结果", resultTypeDesc: "区间包络严格证明区间内无根" };
6711
6725
  return;
@@ -6716,7 +6730,7 @@ function suan29(state) {
6716
6730
  // 用符号微分+区间求值得到【紧致】导数包络,取代原“3 条割线同号”启发式(会漏根,见评审 unsound)。
6717
6731
  var dAST = _diffAST(state.equations[0], vn);
6718
6732
  var dI = dAST ? intervalEval(dAST, box) : null;
6719
- if (dI && (dI.min > 0 || dI.max < 0)) {
6733
+ if (dI && _ivExcludesZero(dI)) {
6720
6734
  var faBox = {}, fbBox = {}; faBox[vn] = { min: a, max: a }; fbBox[vn] = { min: b, max: b };
6721
6735
  var faI = intervalEval(state.equations[0], faBox);
6722
6736
  var fbI = intervalEval(state.equations[0], fbBox);
@@ -6870,7 +6884,7 @@ function suan35(state) {
6870
6884
  // 故仅在“不含 0”时返回 false(不可行)。
6871
6885
  for (var r = 0; r < subEqs.length; r++) {
6872
6886
  var iF = intervalEval(subEqs[r], box);
6873
- if (iF && isFinite(iF.min) && isFinite(iF.max) && (iF.max < 0 || iF.min > 0)) {
6887
+ if (iF && _ivExcludesZero(iF)) {
6874
6888
  return false; // 该方程在 used 全域上严格无根 ⇒ 子问题不可行 ⇒ 全局不可行
6875
6889
  }
6876
6890
  }
@@ -11083,7 +11097,7 @@ function _runTail(state) {
11083
11097
 
11084
11098
  // —— 可审计结构化溯源(切片A):每个结果附带完整证据链元数据 ——
11085
11099
  // 设计目标:Agent / 上层系统拿到的不只是裸数字,而是"为什么是这个解"的可读证据链。
11086
- var SOLVER_VERSION = "lingshu-solver/1.0.0-auditable";
11100
+ var SOLVER_VERSION = "lingshu-solver/1.0.7-auditable";
11087
11101
 
11088
11102
  // Movability 完整读取(切片B):每变量携带 status + width,供 Agent 读懂"为何是这个解"
11089
11103
  function _movabilityFull(state) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lingshu-solver",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "description": "灵数求解器 · 确定性实数方程组求解 MCP 工具(≤6变量):区间收缩 + Krawczyk 认证,离线零依赖零数据,诚实标记 truncated。",
5
5
  "homepage": "https://genesis-plan.github.io/lingshu-solver/",
6
6
  "repository": {