/// <summary> /// 线性拟合(根据point 返回灵敏度相应参数) /// </summary> /// <param name="parray"></param> private SenParas LinearRegression(List <Point> parray) { SenParas para = new SenParas(); if (parray.Count < 2) { System.Console.WriteLine("点个数不能少于2"); return(null); } //求 X,Y平均值 double averagex = 0; double averagey = 0; foreach (Point item in parray) { averagex += item.X; averagey += item.Y; } averagex /= parray.Count; averagey /= parray.Count; //经验回归系数的分子与分母 double numerator = 0; double denominator = 0; foreach (Point p in parray) { numerator += (p.X - averagex) * (p.Y - averagey); denominator += (p.X - averagex) * (p.X - averagex); } //回归系数b(Regression Coefficient) para.RCB = numerator / denominator; //回归系数a para.RCA = averagey - para.RCB * averagex; //剩余平方和与回归平方和 double residualSS = 0; //(Residual Sum of Squares) double regressionSS = 0; //(Regression Sum of Squares) foreach (Point p in parray) { residualSS += (p.Y - para.RCA - para.RCB * p.X) * (p.Y - para.RCA - para.RCB * p.X); regressionSS += (para.RCA + para.RCB * p.X - averagey) * (para.RCA + para.RCB * p.X - averagey); } //计算R^2的值 numerator = 0; denominator = 0; foreach (var item in parray) { denominator += Math.Pow((item.Y - averagey), 2.0); numerator += Math.Pow((item.Y - (item.X * para.RCB + para.RCA)), 2.0); } para.ResidualSS = residualSS; para.RegressionSS = regressionSS; para.RSquare = 1 - numerator / denominator; //拟合误差越接近1则表示越准确 return(para); }
/// <summary> /// 计算灵敏度 /// </summary> double GetSensitivity() { StringBuilder sb = new StringBuilder(); List <Point> listPoint = new List <Point>(); try { //测量数量 衰减初始值 步进 int testCount = 12; //灵敏度 double initialValue = IniAtt - 2; double interval = 0.4; Point point = new Point(); for (int i = 0; i < testCount; i++) { Hp8156A.SetAtt(initialValue.ToString()); point.X = initialValue; initialValue += interval; //sb.Append(point.X.ToString()); Thread.Sleep(1000); double result = Mp2100A.GetErrorRate(); //Error rate if (result >= 0) { double s = Math.Log10(result); //判定当结果不为0时 if (s > -9) { //取对数 point.Y = s; listPoint.Add(point); } } } //噪声过滤 while (IsCountChanged && listPoint.Count > 5) { listPoint = PointFilter(listPoint); } //计算灵敏度 SenPara = this.LinearRegression(listPoint); //灵敏度计算条件:Error rate@E-3 SenPara.Sensitive = (ErrorRateInSensitivity - SenPara.RCA) / SenPara.RCB; return(SenPara.Sensitive); } catch { return(0); } }