From 018bfb9c78088d9cd7b9371edcd2102abd594b4d Mon Sep 17 00:00:00 2001
From: ningshuxia <ningshuxia0927@outlook.com>
Date: 星期一, 21 四月 2025 15:21:59 +0800
Subject: [PATCH] 水力计算曲线 报错修复

---
 WinFrmUI/PBS.WinFrmUI.Hydro/05-system-curve/02-chart/SystemCurveChartCtrl.cs |   75 ++++++++++++++++++++++++++++++++++---
 1 files changed, 69 insertions(+), 6 deletions(-)

diff --git a/WinFrmUI/PBS.WinFrmUI.Hydro/05-system-curve/02-chart/SystemCurveChartCtrl.cs b/WinFrmUI/PBS.WinFrmUI.Hydro/05-system-curve/02-chart/SystemCurveChartCtrl.cs
index b26e552..bc2593e 100644
--- a/WinFrmUI/PBS.WinFrmUI.Hydro/05-system-curve/02-chart/SystemCurveChartCtrl.cs
+++ b/WinFrmUI/PBS.WinFrmUI.Hydro/05-system-curve/02-chart/SystemCurveChartCtrl.cs
@@ -10,6 +10,8 @@
         {
             InitializeComponent();
             this.layoutControl1.SetupLayoutControl();
+            this.gridView1.SetNormalView();
+            this.sidePanel1.Visible = false;
             InitialChart();
         }
 
@@ -154,20 +156,39 @@
             foreach (var item in waterPointGroup)
             {
                 var x = item.Key;
-                var yList = item.Select(x => x.EndPressure).OrderBy(x => x).ToList();
+                var list = item.Select(t => new Yw.Geometry.Point2d(x, t.EndPressure)).ToList();
 
-                var yUpper = CalculatePercentile(yList, 0.95);
-                var yLower = CalculatePercentile(yList, 0.05);
-                var yNumList = yList.Where(x => x >= yLower && x <= yUpper);
-                if (yNumList == null || !yNumList.Any())
+                //var yList = item.Select(x => x.EndPressure).OrderBy(x => x).ToList();
+
+                //var yUpper = CalculatePercentile(yList, 0.95);
+                //var yLower = CalculatePercentile(yList, 0.05);
+                //var yNumList = yList.Where(x => x >= yLower && x <= yUpper);
+                //if (yNumList == null || !yNumList.Any())
+                //{
+                //    continue;
+                //}
+                //var yAverage = yNumList.Where(x => x >= yLower && x <= yUpper).Average();
+
+                //upperPressurePtList.Add(new Yw.Geometry.Point2d(x, yUpper));
+                //lowerPressurePtList.Add(new Yw.Geometry.Point2d(x, yLower));
+                //averagePressurePtList.Add(new Yw.Geometry.Point2d(x, yAverage));
+
+                var fList = DynamicThresholdProcessor.FilterWithDynamicSigma(list);
+               // var fList = FilterByStdDev(list);
+                if (fList == null || !fList.Any())
                 {
                     continue;
                 }
-                var yAverage = yNumList.Where(x => x >= yLower && x <= yUpper).Average();
+
+                var yUpper = fList.Max(x => x.Y);
+                var yLower = fList.Min(x => x.Y);
+                var yAverage = fList.Average(x => x.Y);
 
                 upperPressurePtList.Add(new Yw.Geometry.Point2d(x, yUpper));
                 lowerPressurePtList.Add(new Yw.Geometry.Point2d(x, yLower));
                 averagePressurePtList.Add(new Yw.Geometry.Point2d(x, yAverage));
+            
+
             }
 
             if (averagePressurePtList.Count > 4)
@@ -224,6 +245,48 @@
             return sortedData[lower] * (1 - fraction) + sortedData[upper] * fraction;
         }
 
+
+        public List<Yw.Geometry.Point2d> FilterByStdDev(List<Yw.Geometry.Point2d> group)
+        {
+
+            var filteredData = new List<Yw.Geometry.Point2d>();
+
+
+            // 灏忔牱鏈暟鎹笉澶勭悊锛堥槇鍊艰涓�10锛�
+            if (group.Count() < 3)
+            {
+                filteredData.AddRange(group);
+                return default;
+            }
+
+            // 璁$畻缁熻閲�
+            var pressures = group.Select(p => p.Y).ToList();
+            double mean = pressures.Average();
+            double stdDev = CalculateSampleStdDev(pressures); // 鏍锋湰鏍囧噯宸�
+
+            // 璁剧疆3蟽杈圭晫[1,3,4](@ref)
+            double lowerBound = mean - 3 * stdDev;
+            double upperBound = mean + 3 * stdDev;
+
+            // 杩囨护寮傚父鍊�
+            filteredData.AddRange(
+                group.Where(p => p.Y >= lowerBound && p.Y <= upperBound)
+            );
+
+
+            return filteredData;
+        }
+
+        // 鏍锋湰鏍囧噯宸绠楋紙n-1锛塠7,8](@ref)
+        private double CalculateSampleStdDev(List<double> values)
+        {
+            if (values.Count < 2) return 0;
+
+            double mean = values.Average();
+            double sumSquares = values.Sum(v => Math.Pow(v - mean, 2));
+            return Math.Sqrt(sumSquares / (values.Count - 1));
+        }
+
         #region Set Axis
 
 

--
Gitblit v1.9.3