FA-11971 / Discrete control systems / Open access
Removing a dead zone creates a command discontinuity · case 01
Removing a dead zone creates a command discontinuity.
ROOT CAUSE
Outside the dead zone the original magnitude is returned unchanged.
VERIFIED REPAIR
Subtract the dead-zone width from magnitude and retain sign.
Unsuccessful approach: Subtracting width without sign handling distorts negative commands.
Case contract
For symmetric nonnegative width d, output zero for abs(x)<=d, otherwise sign(x)*(abs(x)-d). This is an unscaled integer dead-zone model.
Why this case matters
An offline discrete controller model isolates this state or arithmetic fault; it makes no physical plant or safety claim.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x, d):
return 0 if abs(x)<=d else x
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('positive beyond', solve(3*N, N), 2*N)
check('negative beyond', solve(-3*N, N), -2*N)
check('positive edge', solve(N, N), 0)
check('negative edge', solve(-N, N), 0)
check('center', solve(0, N), 0)
check('zero width', solve(-N, 0), -N)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| positive beyond | 3 | 2 | Failed |
| negative beyond | -3 | -2 | Failed |
| positive edge | 0 | 0 | Passed |
| negative edge | 0 | 0 | Passed |
| center | 0 | 0 | Passed |
| zero width | -1 | -1 | Passed |
SHA-256 / 356e8289519a1c0b3c9057704f36858462e0c863e0da6df9afe11e78af9400e1
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x, d):
return 0 if abs(x)<=d else x-d
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('positive beyond', solve(3*N, N), 2*N)
check('negative beyond', solve(-3*N, N), -2*N)
check('positive edge', solve(N, N), 0)
check('negative edge', solve(-N, N), 0)
check('center', solve(0, N), 0)
check('zero width', solve(-N, 0), -N)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| positive beyond | 2 | 2 | Passed |
| negative beyond | -4 | -2 | Failed |
| positive edge | 0 | 0 | Passed |
| negative edge | 0 | 0 | Passed |
| center | 0 | 0 | Passed |
| zero width | -1 | -1 | Passed |
SHA-256 / 52f3faf9993a35fa73adbcc112f3d1c2aa8b6958d6af87dab9b16f5cdff388cd
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x, d):
return max(0,x-d) if x>=0 else min(0,x+d)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('positive beyond', solve(3*N, N), 2*N)
check('negative beyond', solve(-3*N, N), -2*N)
check('positive edge', solve(N, N), 0)
check('negative edge', solve(-N, N), 0)
check('center', solve(0, N), 0)
check('zero width', solve(-N, 0), -N)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| positive beyond | 2 | 2 | Passed |
| negative beyond | -2 | -2 | Passed |
| positive edge | 0 | 0 | Passed |
| negative edge | 0 | 0 | Passed |
| center | 0 | 0 | Passed |
| zero width | -1 | -1 | Passed |
SHA-256 / a12f726c4194d711ad9195aa37bf114fdd0d9caa3db2dabf1faf593f53de295e
Verification & scope
Integer-valued controlled examples only; no physical plant, stability guarantee, timing jitter, or hardware behavior is modeled. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:38:52.653776+00:00.
Case digest / ab2ab3fc9c21cd27938d9049b6451d3378bd3c1a0031e7d837fafabb8ca2fc29