private static Point[] CalculateProbabilityFunctionValues(double[] FValues, double[] breakPoints, double intervalLength) { var probabilityFunctionValues = new Point[breakPoints.Length - 1]; for (var i = 0; i < breakPoints.Length - 1; i++) { var funcValue = (FValues[i + 1] - FValues[i]) / intervalLength; probabilityFunctionValues[i] = new Point(breakPoints[i], funcValue); } return(probabilityFunctionValues); }
public static (Point[], Point[]) CalculateExpectedAndActualPDFValues(Distribution distribution, double[] variableValues) { //var numberOfIntervals = (int)Math.Ceiling(1 + 3.322 * Math.Log10(variableValues.Count())); var numberOfIntervals = 10; var numberOfPoints = numberOfIntervals; var min = variableValues.Min(); var max = variableValues.Max(); var intervalLength = (max - min) / numberOfIntervals; min = min + intervalLength; max = max - intervalLength; //var count1 = variableValues.Where(v => v < min + intervalLength).ToList(); var breakPoints = new double[numberOfPoints]; for (var i = 0; i < numberOfPoints; i++) { breakPoints[i] = min + i * intervalLength; } // считаем кол-во попаданий в интервалы var counts = new int[numberOfPoints]; var FValues = new double[numberOfPoints]; for (var i = 0; i < breakPoints.Length; i++) { var currentValue = breakPoints[i]; var count = variableValues.Where(v => v <= currentValue).Count(); counts[i] = count; FValues[i] = (double)count / variableValues.Length; } var pdfValuesActual = new Point[numberOfPoints - 1]; for (int i = 0; i < pdfValuesActual.Length; i++) { var variableValue = breakPoints[i]; pdfValuesActual[i] = new Point(variableValue, distribution.GetPdfValueAtPoint(variableValue)); } var pdfValuesExpected = CalculateProbabilityFunctionValues(FValues, breakPoints, intervalLength); return(pdfValuesExpected, pdfValuesActual); }