Beispiel #1
0
        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);
        }
Beispiel #2
0
 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);
        }