public double GetValue(double x) { if (x < MinValue || x >= MaxValue) { throw new ArgumentException("Function not defined for x = " + x); } if (XVals.NotNullOrEmpty()) { for (int i = 0; i < XVals.Length; i++) { if (XVals[i] >= x) { return(YVals[i]); } } } throw new ArgumentException("Function not defined for x = " + x); }
public void Clear() { Y2Vals.Clear(); YVals.Clear(); XVals.Clear(); }
//Creates DataPoint objects from the trendline/regression model public ObservableCollection <Common.DataPoint> CreateRegressionModelDataPoints(Int32 polyOrder) { //Recalculate model coefficients to ensure correct regression model CalcModelCoeffs(polyOrder); if (polyOrder + 1 != modelCoeffs.Count) { return(null); } //Determine qty. of returned data points -> Target: 100 data points var maxXVal = XVals.Max(); var minXVal = XVals.Min(); Int32 dataPointQty = 100; var stepSize = (maxXVal - minXVal) / dataPointQty; //Create collection to return ObservableCollection <DataPoint> calcDataPoints = new ObservableCollection <DataPoint>(); switch (modelCoeffs.Count) { //Case of a constant dependent variable case 1: if (XVals.Count >= 1) { for (int i = 0; i <= dataPointQty; i++) { var point = new DataPoint { XValue = minXVal + stepSize * i, YValue = YVals.FirstOrDefault() }; calcDataPoints.Add(point); } return(calcDataPoints); } return(null); //Linear regression model case 2: if (XVals.Count >= 2) { for (int i = 0; i <= dataPointQty; i++) { var point = new DataPoint(); point.XValue = minXVal + stepSize * i; point.YValue = modelCoeffs[0] + modelCoeffs[1] * point.XValue; calcDataPoints.Add(point); } return(calcDataPoints); } return(null); //Quadratic Regression Model case 3: if (XVals.Count >= 3) { for (int i = 0; i <= dataPointQty; i++) { var point = new DataPoint(); point.XValue = minXVal + stepSize * i; point.YValue = modelCoeffs[0] + modelCoeffs[1] * point.XValue + modelCoeffs[2] * Math.Pow(point.XValue, 2); calcDataPoints.Add(point); } return(calcDataPoints); } return(null); //3rd Order Polynomial case 4: if (XVals.Count >= 4) { for (int i = 0; i <= dataPointQty; i++) { var point = new DataPoint(); point.XValue = minXVal + stepSize * i; point.YValue = modelCoeffs[0] + modelCoeffs[1] * point.XValue + modelCoeffs[2] * Math.Pow(point.XValue, 2) + modelCoeffs[3] * Math.Pow(point.XValue, 3); calcDataPoints.Add(point); } return(calcDataPoints); } return(null); //4th Order Polynomial case 5: if (XVals.Count >= 5) { for (int i = 0; i <= dataPointQty; i++) { var point = new DataPoint(); point.XValue = minXVal + stepSize * i; point.YValue = modelCoeffs[0] + modelCoeffs[1] * point.XValue + modelCoeffs[2] * Math.Pow(point.XValue, 2) + modelCoeffs[3] * Math.Pow(point.XValue, 3) + modelCoeffs[4] * Math.Pow(point.XValue, 4); calcDataPoints.Add(point); } return(calcDataPoints); } return(null); //5th Order Polynomial case 6: if (XVals.Count >= 6) { for (int i = 0; i <= dataPointQty; i++) { var point = new DataPoint(); point.XValue = minXVal + stepSize * i; point.YValue = modelCoeffs[0] + modelCoeffs[1] * point.XValue + modelCoeffs[2] * Math.Pow(point.XValue, 2) + modelCoeffs[3] * Math.Pow(point.XValue, 3) + modelCoeffs[4] * Math.Pow(point.XValue, 4) + modelCoeffs[5] * Math.Pow(point.XValue, 5); calcDataPoints.Add(point); } return(calcDataPoints); } return(null); } return(null); }