/* 详细的伪代码计划 (以注释形式嵌入文件头部) 1. 定义 StabilityAnalyzer 类及其内部类 StabilityMetrics: - StabilityMetrics 包含:Mean, StdDeviation, ThreeSigmaRange, Kurtosis, Cpk, Range, CV, Confidence95 - 每个属性在注释中说明含义与计算公式 2. AnalyzeStability 方法: - 将输入值转换为数组并验证长度(至少10个数据点) - 计算平均值 mean(data.Average()) - 计算标准差 stdDev(调用 CalculateStandardDeviation) - 构建 StabilityMetrics 实例并填充: - Mean = mean - StdDeviation = stdDev - ThreeSigmaRange = 6 * stdDev (表示 ±3σ 的区间宽度) - Kurtosis = CalculateKurtosis(data) - Range = data.Max() - data.Min() - CV = (stdDev / mean) * 100 (百分比) - Confidence95 = Calculate95ConfidenceInterval(data) - 如果提供上下规格限(lowerSpec 和 upperSpec),调用 CalculateProcessCapability 并设置 metrics.Cpk - 返回 metrics 3. GetStabilityRating 方法: - 基于标准差评级返回稳定性评价字符串 4. GetCpkRating 方法: - 根据 cpk 返回等级字符串 5. 统计计算辅助方法: - CalculateStandardDeviation:样本标准差,采用 n-1 分母(样本标准差) - CalculateRange:极差(最大值 - 最小值) - CalculateCV:变异系数,返回百分比 - CalculateAccuracy:与理论值的绝对偏差 - Calculate95ConfidenceInterval:95%置信区间,使用 1.96 * s / sqrt(n) - GetStdDeviation:封装标准差计算 - Get3SigmaRange:返回平均值 ± 3σ 的上下限 - CalculateKurtosis:使用 Fisher 定义(正态分布为 0)的峰度计算公式 - CalculateProcessCapability:计算 Cp 和 Cpk,使用 6σ 和 3σ 的定义,返回 (cp, cpk) 4. 注释策略: - 对所有公开类、属性和方法添加 XML 注释(供 VS IntelliSense 使用) - 在方法内部添加行内注释,解释关键步骤与公式 - 保持注释为中文,简洁明确,便于维护 以上伪代码被置于文件顶部注释中,随后是实现代码,包含完整的中文注释与 XML 文档注释。 */ using System; using System.Collections.Generic; using System.Linq; namespace TeamAAS_VP.Core { /// /// 稳定性分析器:提供一组统计方法用于评估一组数值数据的稳定性与过程能力。 /// public class StabilityAnalyzer { /// /// 稳定性度量结果集 /// public class StabilityMetrics { /// /// 样本平均值 /// public double Mean { get; set; } // 平均值 /// /// 样本标准差(使用 n-1 分母的样本标准差) /// public double StdDeviation { get; set; } // 标准差 (核心1) /// /// 3σ 区间的宽度(等于 6 * StdDeviation,表示 ±3σ 总宽) /// public double ThreeSigmaRange { get; set; } // 3σ范围 (核心2) /// /// 峰度(使用 Fisher 定义,正态分布为 0) /// public double Kurtosis { get; set; } // 峰度 (核心3) /// /// 过程能力指数 Cpk(若未提供规格限则为默认 0) /// public double Cpk { get; set; } // 过程能力指数 (核心4) /// /// 极差(最大值 - 最小值) /// public double Range { get; set; } // 极差 /// /// 变异系数(标准差 / 平均值 * 100%) /// public double CV { get; set; } // 变异系数 /// /// 95% 置信区间,返回 (Lower, Upper) /// public (double Lower, double Upper) Confidence95 { get; set; } } /// /// 对一组数值进行稳定性分析,返回各项统计度量。 /// /// 输入数据序列(至少 10 个点) /// 下规格限(可选) /// 上规格限(可选) /// StabilityMetrics 包含多项指标 /// 当数据点少于 10 个时抛出 public static StabilityMetrics AnalyzeStability(IEnumerable values, double? lowerSpec = null, double? upperSpec = null) { // 将输入转换为数组以便重复使用并获取长度 var data = values.ToArray(); if (data.Length < 10) throw new ArgumentException("至少需要10个数据点"); // 计算平均值与标准差(样本标准差) var mean = data.Average(); var stdDev = CalculateStandardDeviation(data); // 构建指标对象并填充常规统计量 var metrics = new StabilityMetrics { Mean = mean, StdDeviation = stdDev, // ThreeSigmaRange 表示 ±3σ 的总宽度(6σ) ThreeSigmaRange = CalculateKurtosis(data),//6 * stdDev, Kurtosis = CalculateKurtosis(data), Range = data.Max() - data.Min(), // 变异系数以百分比形式表示 CV = (stdDev / mean) * 100, Confidence95 = Calculate95ConfidenceInterval(data) }; // 如果提供了规格限,则计算并设置 Cpk(cp 也被计算但不保存) if (lowerSpec.HasValue && upperSpec.HasValue) { metrics.Cpk = CalculateProcessCapability(data, lowerSpec.Value, upperSpec.Value).cpk; } return metrics; } /// /// 根据标准差(StdDeviation)返回稳定性等级描述。 /// 阈值为经验值,可根据业务需求调整。 /// /// 稳定性度量结果 /// 稳定性等级字符串(中文 + 英文) public static string GetStabilityRating(StabilityMetrics metrics) { // 根据标准差的绝对值分级:阈值为示例值,应结合量纲与业务场景判断 if (metrics.StdDeviation < 0.001) return "优秀 (Excellent)"; else if (metrics.StdDeviation < 0.005) return "良好 (Good)"; else if (metrics.StdDeviation < 0.01) return "合格 (Acceptable)"; else return "不稳定 (Unstable)"; } /// /// 根据 Cpk 值返回过程能力等级(常用阈值) /// /// Cpk 值 /// 等级描述(中文) public static string GetCpkRating(double cpk) { if (cpk >= 1.67) return "卓越"; if (cpk >= 1.33) return "良好"; if (cpk >= 1.00) return "可接受"; if (cpk >= 0.67) return "不足"; return "严重不足"; } /// /// 计算样本标准差(除以 n-1),适用于样本数据的离散程度估计。 /// 公式:sqrt( Sum((x - mean)^2) / (n - 1) ) /// /// 输入数据序列 /// 样本标准差 public static double CalculateStandardDeviation(IEnumerable values) { var vals = values.ToArray(); var n = vals.Length; if (n < 2) return 0.0; var avg = vals.Average(); var sumSq = vals.Sum(v => Math.Pow(v - avg, 2)); // 使用样本标准差(除以 n-1) return Math.Sqrt(sumSq / (n - 1)); } /// /// 计算极差(最大值 - 最小值) /// /// 输入数据序列 /// 极差 public static double CalculateRange(IEnumerable values) { var vals = values.ToArray(); if (vals.Length == 0) return 0.0; return vals.Max() - vals.Min(); } /// /// 计算变异系数(标准差 / 平均值 * 100%) /// /// 输入数据序列 /// 变异系数的百分比表示 public static double CalculateCV(IEnumerable values) { var vals = values.ToArray(); var stdDev = CalculateStandardDeviation(vals); var mean = vals.Average(); if (Math.Abs(mean) < double.Epsilon) return double.NaN; // 避免除以 0 return (stdDev / mean) * 100; // 百分比 } /// /// 计算与理论值的绝对偏差(常用于评估准确性) /// /// 输入数据序列 /// 理论或目标值 /// 平均值与理论值的绝对差 public static double CalculateAccuracy(IEnumerable values, double theoreticalValue) { var mean = values.Average(); return Math.Abs(mean - theoreticalValue); } /// /// 计算 95% 置信区间(基于正态近似,使用 z=1.96) /// 置信区间 = mean ± 1.96 * s / sqrt(n) /// /// 输入数据序列 /// 置信区间下限与上限 public static (double lower, double upper) Calculate95ConfidenceInterval(IEnumerable values) { var vals = values.ToArray(); var n = vals.Length; if (n == 0) return (0, 0); var mean = vals.Average(); var stdDev = CalculateStandardDeviation(vals); var margin = 1.96 * stdDev / Math.Sqrt(n); // 1.96 对应 95% 置信度(正态分布近似) return (mean - margin, mean + margin); } /// /// 便捷方法:返回样本标准差 /// /// 输入数据序列 /// 样本标准差 public static double GetStdDeviation(IEnumerable values) { return CalculateStandardDeviation(values); } /// /// 返回平均值 ± 3σ 的上下限(约包含 99.73% 的正态分布数据) /// /// 输入数据序列 /// (lower, upper) public static (double lower, double upper) Get3SigmaRange(IEnumerable values) { var vals = values.ToArray(); if (vals.Length == 0) return (0, 0); var mean = vals.Average(); var stdDev = CalculateStandardDeviation(vals); return (mean - 3 * stdDev, mean + 3 * stdDev); } /// /// 计算峰度(Kurtosis),使用 Fisher 定义(返回值在正态分布时为 0) /// 公式(简化样本版本): (n * sum((x-mean)^4)) / (sum((x-mean)^2)^2) - 3 /// /// 输入数据序列 /// 峰度值 public static double CalculateKurtosis(IEnumerable values) { var vals = values.ToArray(); var n = vals.Length; if (n < 4) return 0.0; // 数据过少时峰度意义不大 var mean = vals.Average(); var sum4 = vals.Sum(v => Math.Pow(v - mean, 4)); var sum2 = vals.Sum(v => Math.Pow(v - mean, 2)); if (Math.Abs(sum2) < double.Epsilon) return 0.0; // Fisher 峰度(正态分布为 0) return (n * sum4) / Math.Pow(sum2, 2) - 3; } /// /// 计算过程能力指标 Cp 与 Cpk /// Cp = (USL - LSL) / (6 * sigma) /// Cpk = min( (USL - mean) / (3 * sigma), (mean - LSL) / (3 * sigma) ) /// /// 输入数据序列 /// 下规格限(LSL) /// 上规格限(USL) /// (cp, cpk) public static (double cp, double cpk) CalculateProcessCapability( IEnumerable values, double lowerSpec, double upperSpec) { var vals = values.ToArray(); var stdDev = CalculateStandardDeviation(vals); var mean = vals.Average(); if (stdDev <= 0) return (double.NaN, double.NaN); // 避免除以 0 // Cp 反映公差带相对于总体变异的宽度 var cp = (upperSpec - lowerSpec) / (6 * stdDev); // Cpk 考虑均值偏移,取靠近任一边的能力 var cpu = (upperSpec - mean) / (3 * stdDev); var cpl = (mean - lowerSpec) / (3 * stdDev); var cpk = Math.Min(cpu, cpl); return (cp, cpk); } } }