MudBlazor/MudBlazor · error · InvalidOperationException

First diagonal element is zero or near-zero.

Error message

First diagonal element is zero or near-zero.

What it means

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.

Source

Thrown at src/MudBlazor/Components/Chart/Interpolation/TridiagonalSolver.cs:48

        var x = new double[n];
        if (n == 1)
        {
            if (Math.Abs(b[0]) < 1e-12)
            {
                throw new InvalidOperationException("Diagonal element is zero or near-zero.");
            }

            x[0] = d[0] / b[0];
            return x;
        }

        var cPrime = new double[n];
        var dPrime = new double[n];

        if (Math.Abs(b[0]) < 1e-12)
        {
            throw new InvalidOperationException("First diagonal element is zero or near-zero.");
        }

        cPrime[0] = c[0] / b[0];
        dPrime[0] = d[0] / b[0];

        for (var i = 1; i < n; i++)
        {
            var denominator = b[i] - (a[i] * cPrime[i - 1]);
            if (Math.Abs(denominator) < 1e-12)
            {
                throw new InvalidOperationException($"Denominator at index {i} is zero or near-zero.");
            }

            var m = 1.0 / denominator;
            if (i < n - 1)
            {
                cPrime[i] = c[i] * m;
            }

View on GitHub (pinned to bdb3acd5dd)

Solutions

  1. Correct the source data: ensure strictly increasing, distinct X values.
  2. Disable interpolation for data that cannot support smoothing.
  3. If calling the solver directly, guarantee b[0] is non-zero.

Example fix

// before: first two X equal -> zero leading spacing
xs = new[] { 1.0, 1.0, 2.0 };
var spline = new NaturalSpline(xs, ys);

// after
xs = new[] { 1.0, 2.0, 3.0 };
Defensive patterns

Strategy: validation

Validate before calling

if (b.Length > 1 && Math.Abs(b[0]) < 1e-12)
    throw new InvalidOperationException("First diagonal element is zero; data is degenerate.");

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of MudBlazor/MudBlazor@bdb3acd5dd (2026-08-13). Data as JSON: /api/errors/7be4c42c7d6094c1. Report an issue: GitHub.