Token Lab搜索

IMPLEMENT → TEST → DEFEND

延迟反馈与有界控制

模拟质点,每次注入一个变化,测量跟踪与控制代价。

学习指南与本课目录LEARNING CONTRACT

理解 → 实现 → 研究

目标:解释本课机制、复现一个例子、测试一个失败案例。读完不自动代表掌握。

先修与预测

学习先修课程 →

将力限制为 5 牛顿是否保证不超调?

提示 1:识别机制

有界力改变速度,却不会消除动量。

预测后展开分析

不保证。状态和速度仍演化,即使每次力都在限值内,延迟反馈仍可能产生超调。

运行参考实现

{
  "baseline": {
    "config": {
      "delay": 0
    },
    "finalError": 0.0013615041560250951,
    "overshoot": 0.18748702554551544,
    "saturationSteps": 25,
    "maxForce": 5,
    "first": {
      "time": 0.01,
      "x": 0,
      "v": 0.05,
      "force": 5
    },
    "last": {
      "time": 4,
      "x": 1.001361504156025,
      "v": -0.010752819203442319,
      "force": 0.018092826086232645
    }
  },
  "delayed": {
    "config": {
      "delay": 10
    },
    "finalError": 0.008125716946019934,
    "overshoot": 0.3147122500242969,
    "saturationSteps": 54,
    "maxForce": 5,
    "first": {
      "time": 0.01,
      "x": 0,
      "v": 0.05,
      "force": 5
    },
    "last": {
      "time": 4,
      "x": 0.9918742830539801,
      "v": 0.03304393949300494,
      "force": 0.03608296388340165
    }
  },
  "massShift": {
    "config": {
      "delay": 0,
      "mass": 2
    },
    "finalError": 0.0009019295580974251,
    "overshoot": 0.32158346698785345,
    "saturationSteps": 41,
    "maxForce": 5,
    "first": {
      "time": 0.01,
      "x": 0,
      "v": 0.025,
      "force": 5
    },
    "last": {
      "time": 4,
      "x": 1.0009019295580974,
      "v": 0.12493732365183198,
      "force": -0.3768011508587378
    }
  },
  "limitation": "Teaching simulator; no collision geometry, contacts, sensor noise or hardware safety validation."
}

初始输出在构建时实际计算;按钮会在浏览器重新计算。不涉及模型、GPU 或硬件。

完整实现与测试入口

将下面四个文件下载到同一目录,执行 node check.mjs。检查覆盖三个项目,无需安装依赖或 API Key。

// Explicit Euler point-mass simulator. Units: kg, m, s, N. No hardware control.
export function simulate({delay=0,mass=1,kp=10,kd=3,limit=5,dt=.01,steps=400}={}) {
  if (!Number.isInteger(delay)||delay<0||delay>100||!Number.isInteger(steps)||steps<1||steps>10000||![mass,kp,kd,limit,dt].every(Number.isFinite)||mass<=0||dt<=0||limit<0) throw Error('Invalid configuration');
  let x=0,v=0,peak=0,clamps=0;const history=[{x,v}],trace=[];
  for(let t=0;t<steps;t++){
    const sensed=history[Math.max(0,history.length-1-delay)];
    const proposed=kp*(1-sensed.x)-kd*sensed.v;
    const force=Math.max(-limit,Math.min(limit,proposed));
    if(force!==proposed)clamps++;
    const nextX=x+dt*v;v+=dt*force/mass;x=nextX;peak=Math.max(peak,x);
    history.push({x,v});trace.push({time:(t+1)*dt,x,v,force});
  }
  return {finalError:Math.abs(1-x),overshoot:Math.max(0,peak-1),saturationSteps:clamps,
    maxForce:Math.max(...trace.map(r=>Math.abs(r.force))),trace};
}
export function run(){const summarize=config=>{const {trace,...metrics}=simulate(config);return {config,...metrics,first:trace[0],last:trace.at(-1)}};return {baseline:summarize({delay:0}),delayed:summarize({delay:10}),massShift:summarize({delay:0,mass:2}),
  limitation:'Teaching simulator; no collision geometry, contacts, sensor noise or hardware safety validation.'}}
查看可执行验收测试
import assert from 'node:assert/strict';
import {run as attention,softmax,attend,full,cached} from './attention.mjs';
import {run as retrieval,retrieve} from './retrieval.mjs';
import {run as control,simulate} from './control.mjs';
assert.ok(attention().passes);assert.throws(()=>softmax([-Infinity,-Infinity]));assert.throws(()=>attend([1,2],[[1]],[[1]]));
assert.equal(retrieval().baseline.accuracy,.4);assert.equal(retrieval().treatment.accuracy,1);assert.equal(retrieve('unseen vocabulary'),null);
const result=control();assert.ok(result.baseline.maxForce<=5);assert.ok(result.delayed.maxForce<=5);assert.equal(simulate({steps:1}).trace[0].x,0);assert.equal(simulate({steps:1}).trace[0].v,.05);assert.throws(()=>simulate({mass:0}));

// Full and cached paths must reject inconsistent shapes, not just the single-query helper.
assert.throws(()=>full([[1,2]],[[1]],[[1]]),/Shape mismatch/);
assert.throws(()=>cached([[1,2]],[],[]),/sequence shape/);

console.log('PASS: 12 capstone checks. Toy arithmetic and invariants only; no GPU or hardware benchmark.');

迁移任务与消融

固定质量、增益与积分步长,扫描延迟 0/5/10/20,再将步长减半重复以识别数值伪影。

评分标准

声明单位与 Euler 约定;执行力限幅;分离延迟与质量;报告超调、误差和模型局限。

四项分别按 0(缺失)、1(需帮助)、2(有独立证据)评分。每项均为 2 才过关,自评不是认证。

参考报告与自己的报告

参考配置:即 run() 中的常量,不使用随机采样。上方展示样例实测结果。先复现,再只改一个因素并记录影响。

不含接触、碰撞或真实传感器,不能认证硬件安全或复现机器人基础模型结果。

Hypothesis:
Code revision / runtime:
Dataset or fixture version:
Baseline:
One-factor intervention:
Raw outputs and acceptance tests:
Negative result / failure case:
What this does NOT establish:
Next falsifiable hypothesis:
← 全部项目
MATHEMATICAL REVIEW · 2026-10-26

假设、参考实现与验收

显式 Euler 用旧速度更新位置。力饱和单位牛顿,延迟为整数步数。不建模接触动力学、碰撞,也不保证真实硬件表现。

已复核实现、不变性及声明的证据边界;保留原有验收测试。

运行前:预测一个边界情况

显式 Euler 用旧速度更新位置。力饱和单位牛顿,延迟为整数步数。不建模接触动力学、碰撞,也不保证真实硬件表现。

提示:隔离假设

固定基线输入,只改变一个参数或边界;同时比较数值与声明单位。单例通过仅验证该样例。

最小可运行算例

将算例及所链接模块保存在同一目录。使用 Node.js 22 或更高版本,然后运行 node project-control.mjs. 无需第三方运行依赖。

import {run} from './project-control-core.mjs';
console.log(run());

测试与迁移

显式 Euler 用旧速度更新位置。力饱和单位牛顿,延迟为整数步数。不建模接触动力学、碰撞,也不保证真实硬件表现。

在下方笔记记录输入、代码版本、期望值和实测值;再构造违反上述假设的反例,解释原结论为何不再成立。

下载完整代码包(.tar.gz) · 完整参考代码与回归检查

预测、检验与证据记录

展开答案前先预测一个结果;练习后记录差异和迁移测试。记录仅存本地,在不同语言版本间共用。

打开记录/导出/清除 →

数学复核范围逐篇记录,不代表完成论文实证复现;可在笔记中记录疑似错误。 复核范围