{"record":{"id":"7be4c42c7d6094c1","repo":"MudBlazor/MudBlazor","slug":"first-diagonal-element-is-zero-or-near-zero","errorCode":null,"errorMessage":"First diagonal element is zero or near-zero.","messagePattern":"First diagonal element is zero or near-zero\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/MudBlazor/Components/Chart/Interpolation/TridiagonalSolver.cs","lineNumber":48,"sourceCode":"\n        var x = new double[n];\n        if (n == 1)\n        {\n            if (Math.Abs(b[0]) < 1e-12)\n            {\n                throw new InvalidOperationException(\"Diagonal element is zero or near-zero.\");\n            }\n\n            x[0] = d[0] / b[0];\n            return x;\n        }\n\n        var cPrime = new double[n];\n        var dPrime = new double[n];\n\n        if (Math.Abs(b[0]) < 1e-12)\n        {\n            throw new InvalidOperationException(\"First diagonal element is zero or near-zero.\");\n        }\n\n        cPrime[0] = c[0] / b[0];\n        dPrime[0] = d[0] / b[0];\n\n        for (var i = 1; i < n; i++)\n        {\n            var denominator = b[i] - (a[i] * cPrime[i - 1]);\n            if (Math.Abs(denominator) < 1e-12)\n            {\n                throw new InvalidOperationException($\"Denominator at index {i} is zero or near-zero.\");\n            }\n\n            var m = 1.0 / denominator;\n            if (i < n - 1)\n            {\n                cPrime[i] = c[i] * m;\n            }","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/MudBlazor/MudBlazor/blob/bdb3acd5ddc0a563428488e7afef0d99549f7a6c/src/MudBlazor/Components/Chart/Interpolation/TridiagonalSolver.cs#L30-L66","documentation":"Thrown by TridiagonalSolver.Solve (n > 1 path) before the forward sweep when the first main-diagonal element b[0] is zero or near-zero (abs < 1e-12). The Thomas algorithm divides by b[0] to seed cPrime[0]/dPrime[0]; a zero pivot is fatal. It is internal plumbing used by the spline interpolators.","triggerScenarios":"Solving a multi-equation tridiagonal system whose first diagonal entry is ~0. Reached via spline construction with degenerate input yielding a zero leading diagonal coefficient.","commonSituations":"Degenerate chart data (zero spacing between the first two X values, or duplicated points) fed into a smoothing spline; custom solver misuse with a zero leading pivot.","solutions":["Correct the source data: ensure strictly increasing, distinct X values.","Disable interpolation for data that cannot support smoothing.","If calling the solver directly, guarantee b[0] is non-zero."],"exampleFix":"// before: first two X equal -> zero leading spacing\nxs = new[] { 1.0, 1.0, 2.0 };\nvar spline = new NaturalSpline(xs, ys);\n\n// after\nxs = new[] { 1.0, 2.0, 3.0 };","handlingStrategy":"validation","validationCode":"if (b.Length > 1 && Math.Abs(b[0]) < 1e-12)\n    throw new InvalidOperationException(\"First diagonal element is zero; data is degenerate.\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Ensure strictly increasing X so the leading spacing is non-zero.","Remove duplicate leading points.","Disable interpolation for ill-conditioned data."],"tags":["mudblazor","chart","interpolation","solver","internal","degenerate-data"],"backgroundTag":null,"analyzedSha":"bdb3acd5ddc0a563428488e7afef0d99549f7a6c","analyzedAt":"2026-08-13T19:36:54.040Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}