public static void FindSphericalCorrection(List <EllipseParameter> ellipses, double waveLength, double filmDistance, ref double radiusInverse, ref double radiusInverseDev) { double weightTotal = 0; double tempRtotal = 0; List <double> r = new List <double>(); for (int i = 0; i < ellipses.Count; i++) { for (int j = i + 1; j < ellipses.Count; j++) { for (int k = 0; k < ellipses[i].millimeters.Count; k++) { if (!double.IsNaN(ellipses[i].millimeters[k]) && !double.IsNaN(ellipses[j].millimeters[k])) { double obs1 = ellipses[i].millimeters[k]; double obs2 = ellipses[j].millimeters[k]; double d1 = ellipses[i].d; double d2 = ellipses[j].d; double tempR = FindParameter.FindSphericalCorrection(obs1, obs2, d1, d2, waveLength, filmDistance); double sigma1 = FindParameter.FindSphericalCorrection(obs1, obs2 + 0.01, d1, d2, waveLength, filmDistance) - tempR; if (sigma1 != 0) { weightTotal += 1 / (sigma1 * sigma1); tempRtotal += tempR / (sigma1 * sigma1); r.Add(tempR); } } } } } if (weightTotal > 0 && !double.IsInfinity(weightTotal)) { radiusInverse += tempRtotal / weightTotal; radiusInverseDev = Statistics.Deviation(r.ToArray()) / Math.Sqrt(Math.Sqrt(2 * r.Count)); } }