diff --git a/apps/regression/Makefile b/apps/regression/Makefile index 450d3a471..f31243396 100644 --- a/apps/regression/Makefile +++ b/apps/regression/Makefile @@ -13,6 +13,7 @@ app_src += $(addprefix apps/regression/,\ graph_options_controller.cpp \ graph_view.cpp \ initialisation_parameter_controller.cpp \ + linear_model_helper.cpp \ regression_context.cpp \ regression_controller.cpp \ store.cpp \ diff --git a/apps/regression/linear_model_helper.cpp b/apps/regression/linear_model_helper.cpp new file mode 100644 index 000000000..c0c975d2b --- /dev/null +++ b/apps/regression/linear_model_helper.cpp @@ -0,0 +1,17 @@ +#include "linear_model_helper.h" + +namespace Regression { + +namespace LinearModelHelper { + +double Slope(double covariance, double variance) { + return covariance / variance; +} + +double YIntercept(double meanOfY, double meanOfX, double slope) { + return meanOfY - slope * meanOfX; +} + +} + +} diff --git a/apps/regression/linear_model_helper.h b/apps/regression/linear_model_helper.h new file mode 100644 index 000000000..27ca1da55 --- /dev/null +++ b/apps/regression/linear_model_helper.h @@ -0,0 +1,15 @@ +#ifndef REGRESSION_LINEAR_MODEL_HELPER +#define REGRESSION_LINEAR_MODEL_HELPER + +namespace Regression { + +namespace LinearModelHelper { + +double Slope(double covariance, double variance); +double YIntercept(double meanOfY, double meanOfX, double slope); + +} + +} + +#endif diff --git a/apps/regression/model/exponential_model.cpp b/apps/regression/model/exponential_model.cpp index ee7ea3c60..608467a11 100644 --- a/apps/regression/model/exponential_model.cpp +++ b/apps/regression/model/exponential_model.cpp @@ -1,5 +1,6 @@ #include "exponential_model.h" #include "../store.h" +#include "../linear_model_helper.h" #include #include #include @@ -81,8 +82,9 @@ void ExponentialModel::fit(Store * store, int series, double * modelCoefficients const double meanOfXY = sumOfXY / numberOfPoints; const double variance = meanOfXX - meanOfX * meanOfX; const double covariance = meanOfXY - meanOfX * meanOfY; - modelCoefficients[1] = covariance / variance; - modelCoefficients[0] = sign * exp(meanOfY - modelCoefficients[1] * meanOfX); + modelCoefficients[1] = LinearModelHelper::Slope(covariance, variance); + modelCoefficients[0] = + sign * exp(LinearModelHelper::YIntercept(meanOfY, meanOfX, modelCoefficients[1])); } double ExponentialModel::partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const { diff --git a/apps/regression/store.cpp b/apps/regression/store.cpp index 683849169..7174cb8d3 100644 --- a/apps/regression/store.cpp +++ b/apps/regression/store.cpp @@ -1,4 +1,5 @@ #include "store.h" +#include "linear_model_helper.h" #include "apps/apps_container.h" #include #include @@ -238,11 +239,11 @@ double Store::covariance(int series) const { } double Store::slope(int series) const { - return covariance(series)/varianceOfColumn(series, 0); + return LinearModelHelper::Slope(covariance(series), varianceOfColumn(series, 0)); } double Store::yIntercept(int series) const { - return meanOfColumn(series, 1) - slope(series)*meanOfColumn(series, 0); + return LinearModelHelper::YIntercept(meanOfColumn(series, 1), meanOfColumn(series, 0), slope(series)); } double Store::yValueForXValue(int series, double x, Poincare::Context * globalContext) {