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