private void CalculatePressureTrend() { var pressureData = _database .GetReadingValueHistory(WeatherValueType.Pressure, Timestamp.AddHours(-3), Timestamp).Result.ToList(); var xData = pressureData.Select(p => (double)p.Timestamp.ToUnixTimeSeconds()).ToArray(); var yData = pressureData.Select(p => (double)p.Value / 100.0).ToArray(); var lineFunction = Fit.LineFunc(xData, yData); PressureDifferenceThreeHour = (decimal)(lineFunction(xData.Last()) - lineFunction(xData[0])); }
public void FitsToExactLineWhenPointsAreOnLine() { var x = new[] { 30.0, 40.0, 50.0, 12.0, -3.4, 100.5 }; var y = x.Select(z => 4.0 - 1.5 * z).ToArray(); var resp = Fit.Line(x, y); Assert.AreEqual(4.0, resp.Item1, 1e-12); Assert.AreEqual(-1.5, resp.Item2, 1e-12); var resf = Fit.LineFunc(x, y); foreach (var z in Enumerable.Range(-3, 10)) { Assert.AreEqual(4.0 - 1.5 * z, resf(z), 1e-12); } }
public void FitsToBestLine() { // Mathematica: Fit[{{1,4.986},{2,2.347},{3,2.061},{4,-2.995},{5,-2.352},{6,-5.782}}, {1, x}, x] // -> 7.01013 - 2.08551*x var x = Enumerable.Range(1, 6).Select(Convert.ToDouble).ToArray(); var y = new[] { 4.986, 2.347, 2.061, -2.995, -2.352, -5.782 }; var resp = Fit.Line(x, y); Assert.AreEqual(7.01013, resp.Item1, 1e-4); Assert.AreEqual(-2.08551, resp.Item2, 1e-4); var resf = Fit.LineFunc(x, y); foreach (var z in Enumerable.Range(-3, 10)) { Assert.AreEqual(7.01013 - 2.08551 * z, resf(z), 1e-4); } }
public void FitsToLineSameAsExcelTrendLine() { // X Y // 1 0.2 // 2 0.3 // 4 1.3 // 6 4.2 // -> y = -1.078 + 0.7932*x var x = new[] { 1.0, 2.0, 4.0, 6.0 }; var y = new[] { 0.2, 0.3, 1.3, 4.2 }; var resp = Fit.Line(x, y); Assert.AreEqual(-1.078, resp.Item1, 1e-3); Assert.AreEqual(0.7932, resp.Item2, 1e-3); var resf = Fit.LineFunc(x, y); foreach (var z in Enumerable.Range(-3, 10)) { Assert.AreEqual(-1.078 + 0.7932 * z, resf(z), 1e-2); } }
public virtual Func <double, double> LinearFittingFunc(double[] x, double[] y) { return(Fit.LineFunc(x, y)); }