private static double log10RmsErr(double[] xreal, double[] ximag, double[] yreal, double[] yimag)
{
if (xreal.Length != ximag.Length || xreal.Length != yreal.Length || yreal.Length != yimag.Length)
throw new ArgumentException("Mismatched lengths");
double err = 0;
for (int i = 0; i < xreal.Length; i++)
err += (xreal[i] - yreal[i]) * (xreal[i] - yreal[i]) + (ximag[i] - yimag[i]) * (ximag[i] - yimag[i]);
err = Math.Sqrt(err / Math.Max(xreal.Length, 1)); // Now this is a root mean square (RMS) error
err = Math.Log10(err);
if (err < maxLogError)
maxLogError = err;
return err;
}