public void FitToFunctionPolynomialCompatibilityTest() { // specify a cubic function Interval r = Interval.FromEndpoints(-10.0, 10.0); Func <double, double> fv = delegate(double x) { return(0.0 - 1.0 * x + 2.0 * x * x - 3.0 * x * x * x); }; Func <double, double> fu = delegate(double x) { return(1.0 + 0.5 * Math.Cos(x)); }; // create a data set from it UncertainMeasurementSample set = CreateDataSet(r, fv, fu, 60); // fit it to a cubic polynomial UncertainMeasurementFitResult pFit = set.FitToPolynomial(3); // fit it to a cubic polynomial Func <double[], double, double> ff = delegate(double[] p, double x) { return(p[0] + p[1] * x + p[2] * x * x + p[3] * x * x * x); }; UncertainMeasurementFitResult fFit = set.FitToFunction(ff, new double[] { 0, 0, 0, 0 }); // dimension Assert.IsTrue(pFit.Parameters.Count == fFit.Parameters.Count); // chi squared Assert.IsTrue(TestUtilities.IsNearlyEqual(pFit.GoodnessOfFit.Statistic, fFit.GoodnessOfFit.Statistic, Math.Sqrt(TestUtilities.TargetPrecision))); // don't demand super-high precision agreement of parameters and covariance matrix // parameters Assert.IsTrue(TestUtilities.IsNearlyEqual(pFit.Parameters.ValuesVector, fFit.Parameters.ValuesVector, Math.Pow(TestUtilities.TargetPrecision, 0.3))); // covariance Assert.IsTrue(TestUtilities.IsNearlyEqual(pFit.Parameters.CovarianceMatrix, fFit.Parameters.CovarianceMatrix, Math.Pow(TestUtilities.TargetPrecision, 0.3))); }
public void FitDataToFunctionTest() { // create a data set from a nonlinear function /* * Interval r = Interval.FromEndpoints(-3.0, 5.0); * double[] c = new double[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; * Function<double, double> fv = delegate(double x) { * return (3.0 * Math.Cos(2.0 * Math.PI * x / 2.0 - 1.0)); * }; * Function<double, double> fu = delegate(double x) { * return (0.1 + 0.1 * Math.Abs(x)); * }; * DataSet set = CreateDataSet(r, fv, fu, 20, 2); */ UncertainMeasurementSample set = new UncertainMeasurementSample(); set.Add(new UncertainMeasurement <double>(1.0, 1.0, 0.1)); set.Add(new UncertainMeasurement <double>(2.0, 0.7, 0.1)); set.Add(new UncertainMeasurement <double>(3.0, 0.0, 0.1)); set.Add(new UncertainMeasurement <double>(4.0, -0.7, 0.1)); set.Add(new UncertainMeasurement <double>(5.0, -1.0, 0.1)); set.Add(new UncertainMeasurement <double>(6.0, -0.7, 0.1)); set.Add(new UncertainMeasurement <double>(7.0, 0.0, 0.1)); set.Add(new UncertainMeasurement <double>(8.0, 0.7, 0.1)); set.Add(new UncertainMeasurement <double>(9.0, 1.0, 0.1)); // fit it to a parameterized fit function /* * Function<double[], double, double> ff = delegate(double[] p, double x) { * return (p[0] * Math.Cos(2.0 * Math.PI / p[1] + p[2])); * }; */ Func <double[], double, double> ff = delegate(double[] p, double x) { //Console.WriteLine(" p[0]={0}, x={1}", p[0], x); return(p[1] * Math.Cos(x / p[0] + p[2])); //return (x / p[0]); }; FitResult fit = set.FitToFunction(ff, new double[] { 1.3, 1.1, 0.1 }); Console.WriteLine(fit.Parameter(0)); Console.WriteLine(fit.Parameter(1)); Console.WriteLine(fit.Parameter(2)); }
public void FitToFunctionPolynomialCompatibilityTest() { // specify a cubic function Interval r = Interval.FromEndpoints(-10.0, 10.0); Func <double, double> fv = delegate(double x) { return(0.0 - 1.0 * x + 2.0 * x * x - 3.0 * x * x * x); }; Func <double, double> fu = delegate(double x) { return(1.0 + 0.5 * Math.Cos(x)); }; // create a data set from it UncertainMeasurementSample set = CreateDataSet(r, fv, fu, 60); // fit it to a cubic polynomial FitResult pFit = set.FitToPolynomial(3); // fit it to a cubic polynomaial Func <double[], double, double> ff = delegate(double[] p, double x) { return(p[0] + p[1] * x + p[2] * x * x + p[3] * x * x * x); }; FitResult fFit = set.FitToFunction(ff, new double[] { 0, 0, 0, 0 }); // the fits should agree Console.WriteLine("{0} ?= {1}", pFit.GoodnessOfFit.Statistic, fFit.GoodnessOfFit.Statistic); for (int i = 0; i < pFit.Dimension; i++) { Console.WriteLine("{0} ?= {1}", pFit.Parameter(i), fFit.Parameter(i)); Assert.IsTrue(pFit.Parameter(i).ConfidenceInterval(0.01).ClosedContains(fFit.Parameter(i).Value)); } // dimension Assert.IsTrue(pFit.Dimension == fFit.Dimension); // chi squared Assert.IsTrue(TestUtilities.IsNearlyEqual(pFit.GoodnessOfFit.Statistic, fFit.GoodnessOfFit.Statistic, Math.Sqrt(TestUtilities.TargetPrecision))); // don't demand super-high precision agreement of parameters and covariance matrix // parameters Assert.IsTrue(TestUtilities.IsNearlyEqual(pFit.Parameters, fFit.Parameters, Math.Pow(TestUtilities.TargetPrecision, 0.3))); // covariance Assert.IsTrue(TestUtilities.IsNearlyEqual(pFit.CovarianceMatrix, fFit.CovarianceMatrix, Math.Pow(TestUtilities.TargetPrecision, 0.3))); }