From 9490957edfc694a0378ee52af47e921b8ac44e7a Mon Sep 17 00:00:00 2001 From: qin <a@163.com> Date: 星期二, 04 六月 2024 09:12:11 +0800 Subject: [PATCH] 冲突 --- Hydraulic/Hydro.CommonBase/Helper/CurveFitHelper.cs | 170 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 138 insertions(+), 32 deletions(-) diff --git a/Hydraulic/Hydro.CommonBase/Helper/CurveFitHelper.cs b/Hydraulic/Hydro.CommonBase/Helper/CurveFitHelper.cs index b2e0f49..eedff37 100644 --- a/Hydraulic/Hydro.CommonBase/Helper/CurveFitHelper.cs +++ b/Hydraulic/Hydro.CommonBase/Helper/CurveFitHelper.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Windows.Forms.DataVisualization.Charting; namespace Hydro.CommonBase { @@ -71,7 +72,7 @@ var list = data.FindAll(p => x - (xMax - xMin) / count / 2 <= p.X && p.X < x + (xMax - xMin) / count/2).Select(p => (double)p.Y).ToList(); if (list.Count >= 3) { - var Bounds = ConfidenceRangeHelper.GetConfidenceRange(list, 95); + var Bounds = GetConfidenceRange(list, 95); var x_avg = x; if (Bounds[0] == double.NaN || Bounds[1] == double.NaN) continue; down_list.Add(new PointF((float)x_avg, (float)Bounds[0])); @@ -115,33 +116,29 @@ //var curve1 = h1.GetFitCurve(count); return new List<List<PointF>> { down_list, up_list, avg_list }; } - } - - public static class ConfidenceRangeHelper - { - public static double[] GetConfidenceRange(List<double> data, double confidenceLevel = 90,bool mode=true)//true鏄腑浣嶆暟锛岀疆淇″尯闂存槸false + public static double[] GetConfidenceRange(List<double> data, double confidenceLevel = 90, bool mode = true)//true鏄腑浣嶆暟锛岀疆淇″尯闂存槸false { //濡傛灉model==true,杩欒绠椾腑浣嶆暟,姣斾緥涓篶onfidenceLevel if (mode) { - + data.Sort(); double lowerBound = 0; double upperBound = 0; //鍙栫櫨鍒嗕綅confidenceLevel/100鍜�1-confidenceLevel/100.0鐨勬暟 - int upperIndex = (int)Math.Round( data.Count*confidenceLevel/100.0); - int lowerIndex = (int)Math.Round(data.Count * (1-confidenceLevel / 100.0)); + int upperIndex = (int)Math.Round(data.Count * confidenceLevel / 100.0); + int lowerIndex = (int)Math.Round(data.Count * (1 - confidenceLevel / 100.0)); if (upperIndex == data.Count) { upperIndex = data.Count - 1; } - if (lowerIndex <0) + if (lowerIndex < 0) { lowerIndex = 0; } return new double[] { data[lowerIndex], data[upperIndex] }; - + } @@ -162,35 +159,35 @@ } } - // 浣跨敤寰幆璁$畻鏍锋湰鍧囧�� - double sum = 0; - foreach (double value in data) - { - sum += value; - } - double mean = sum / data.Count; + // 浣跨敤寰幆璁$畻鏍锋湰鍧囧�� + double sum = 0; + foreach (double value in data) + { + sum += value; + } + double mean = sum / data.Count; - // 浣跨敤寰幆璁$畻鏍囧噯宸� - double sumOfSquares = 0; - foreach (double value in data) - { - sumOfSquares += Math.Pow(value - mean, 2); - } - double stdDev = Math.Sqrt(sumOfSquares / (data.Count - 1)); + // 浣跨敤寰幆璁$畻鏍囧噯宸� + double sumOfSquares = 0; + foreach (double value in data) + { + sumOfSquares += Math.Pow(value - mean, 2); + } + double stdDev = Math.Sqrt(sumOfSquares / (data.Count - 1)); - double zValue = 0; - double alpha = 1 - confidenceLevel / 100.0; + double zValue = 0; + double alpha = 1 - confidenceLevel / 100.0; - double zValueOneTail = GetZValueOneTail(alpha / 2); - double marginOfError = zValueOneTail * stdDev; - double lowerBound = mean - marginOfError; - double upperBound = mean + marginOfError; + double zValueOneTail = GetZValueOneTail(alpha / 2); + double marginOfError = zValueOneTail * stdDev; + double lowerBound = mean - marginOfError; + double upperBound = mean + marginOfError; return new double[] { lowerBound, upperBound }; } - + } static double[,] zTable = { {0.0000, 0.0039, 0.0078, 0.0117, 0.0156, 0.0195, 0.0234, 0.0274, 0.0314, 0.0353}, @@ -243,6 +240,115 @@ return zValue; } + //鏁版嵁棰戠巼鍒嗗竷鍥剧殑鑻辨枃鎬庝箞璇�, + /// <summary> + /// 鑾峰彇鏁版嵁棰戠巼鐨勫垎甯冨浘 + /// </summary> + /// <param name="data"></param> + /// <param name="numIntervals"></param> + /// <param name="filterNum">浠ユ渶灏忓�间綔涓鸿繃婊ょ殑绯绘暟</param> + /// <returns></returns> + public static List<DataPoint> GetFrequencyDistribution(List<double> data, out List<double>[] datapoints, int numIntervals = 10,double filterNum=5 ) + { + + List<DataPoint> resultPoints = new List<DataPoint>(); + datapoints= new List<double>[numIntervals]; + for(int i=0;i<numIntervals;i++) + { + datapoints[i]= new List<double>(); + } + // 璁剧疆缃俊姘村钩 + + + // 璁剧疆鍖洪棿鏁伴噺 + + + ////鍦╠ata涓繃婊ゅ拰鏈�澶х殑5%鐨勬暟鎹� + //data = data.Where(d => d <= data.Min() * filterNum).ToList(); + + + + // 璁$畻鏁版嵁鐨勬渶灏忓�煎拰鏈�澶у�� + double minValue = data.Min(); + double maxValue = data.Max(); + + // 璁$畻鍖洪棿瀹藉害 + double intervalWidth = (maxValue - minValue) / numIntervals; + + // 鍒濆鍖栭鐜囧垎甯冩暟缁� + int[] freqDist = new int[numIntervals]; + + // 璁$畻鍚勪釜鍖洪棿鐨勯鐜� + foreach (double x in data) + { + int index = (int)((x - minValue) / intervalWidth); + if (index < 0) // 鏁版嵁灏忎簬鏈�灏忓�� + { + freqDist[0]++; + datapoints[0].Add(x); + } + else if (index >= numIntervals) // 鏁版嵁澶т簬鏈�澶у�� + { + freqDist[numIntervals - 1]++; + datapoints[numIntervals - 1].Add(x); + } + else // 鏁版嵁鍦ㄥ尯闂村唴 + { + freqDist[index]++; + datapoints[index].Add(x); + } + } + double[] freqDistPersent =new double[numIntervals]; + double sum = freqDist.Sum(); + //璁$畻freqDist鐨勯鐜囩櫨鍒嗘瘮 + for (int i = 0; i < numIntervals; i++) + { + freqDistPersent[i] = (freqDist[i] / (double)sum ); + } + + //// 璁$畻鏍锋湰鍧囧�煎拰鏍囧噯宸� + //double mean = data.Average(); + //double stdDev = Math.Sqrt(data.Select(x => (x - mean) * (x - mean)).Sum() / (data.Length - 1)); + + //double zValue = 0; + //double alpha = 1 - confidenceLevel / 100.0; + + //double zValueOneTail = GetZValueOneTail(alpha / 2); + + ////zValue = mean + zValueOneTail * stdDev / Math.Sqrt(data.Length); + //// 璁$畻缃俊鍖洪棿鐨勮寖鍥� + ////double z = GetZValue(confidenceLevel); //chart1.DataManipulator.Statistics.InverseNormalDistribution(1 - confidenceLevel / 200.0); // 鏍规嵁缃俊姘村钩鏌ユ壘鏍囧噯姝f�佸垎甯冪殑涓寸晫鍊� + //double marginOfError = zValueOneTail * stdDev;/// Math.Sqrt(data.Length); + //double lowerBound = mean - marginOfError; + //double upperBound = mean + marginOfError; + for (int i = 0; i < numIntervals; i++) + { + double xValue = minValue + i * intervalWidth + intervalWidth / 2; + double yValue = freqDistPersent[i]; + if (isValid(xValue) && isValid(yValue)) + resultPoints.Add(new DataPoint(xValue, yValue)); + } + + + return resultPoints; + + + + } + + static bool isValid(double value) + { + if (value == (int)value && value < 0) return false; + return !Double.IsNaN(value) && !Double.IsInfinity(value); + } + + } + + //public static class ConfidenceRangeHelper + //{ + + + //} } -- Gitblit v1.9.3