起先采用分段斜率与平均值比较的方法发现不太科学
现在采用最小二乘法实现

如下为 Pascal脚本实现代码
线性度测试procedure ZX2Multi(dx, dy: array of Double; Count: Integer; var a, b: Double);
线性度测试
// 最小二乘法直线拟和 y=ax+b;
线性度测试
var
线性度测试  i: Integer;
线性度测试  x, y, xy, x2: Double;
线性度测试begin
线性度测试  x :
= 0;
线性度测试  y :
= 0;
线性度测试  xy :
= 0;
线性度测试  x2 :
= 0;
线性度测试  
for i := 0 to Count - 1 do
线性度测试  begin
线性度测试    x :
= x + dx[i];
线性度测试    y :
= y + dy[i];
线性度测试    xy :
= xy + dx[i] * dy[i];
线性度测试    x2 :
= x2 + dx[i] * dx[i];
线性度测试  end;
线性度测试  a :
= (Count * xy - x * y) / (Count * x2 - x * x);
线性度测试  b :
= 1.0 / Count * y - a / Count * x;
线性度测试  
//GSTLogFmt('ZX2Multi Result: a: %3.3f,'#9'b: %3.3f', [a, b]);
线性度测试
end;
线性度测试
线性度测试function RateCalculate(TestValue, ResultValue: array of Double; Count: Integer; URate, RateErr, LineErr: Double): Boolean;
线性度测试
//分段斜率与拟和结果比较
线性度测试
var
线性度测试  i: Integer;
线性度测试  RA, ARate, RARate, a, b: Double;
线性度测试  Rate, RRate: array[
0..100] of Double;
线性度测试begin
线性度测试  Result :
= True;
线性度测试  ZX2Multi(ResultValue, TestValue, Count, a, b);
线性度测试  Rate[
0] := (TestValue[Count - 1- TestValue[0]) / (ResultValue[Count - 1- ResultValue[0]);
线性度测试  RA :
= 0;
线性度测试  
for i := 1 to Count - 1 do
线性度测试  begin
线性度测试    Rate[i] :
= (TestValue[i] - TestValue[i - 1]) / (ResultValue[i] - ResultValue[i - 1]);
线性度测试    RA :
= RA + Rate[i];
线性度测试  end;
线性度测试  
//ARate := RA / (Count - 1.0);
线性度测试
  ARate := a;
线性度测试  RARate :
= (ARate - URate) / URate * 100;
线性度测试  
if (Abs(RARate) > RateErr) then
线性度测试  begin
线性度测试    Result :
= False;
线性度测试  end;
线性度测试  GSTLogFmt(
'平均变比:%3.3f,理论变比:%3.3f,平均变比误差:%3.3f%%,(平均误差指标%3.3f%%),线性误差指标(%3.3f%%)', [ARate, URate, RARate, RateErr, LineErr]);
线性度测试  
for i := 0 to Count - 1 do
线性度测试  begin
线性度测试    RRate[i] :
= (Rate[i] - ARate) / ARate * 100;
线性度测试    
if (Abs(RRate[i]) > LineErr) then
线性度测试    begin
线性度测试      Result :
= False;
线性度测试    end;
线性度测试    GSTLogFmt(
'测量值:%3.3f,'#9'AD采样结果:%3.3f,'#9'实测变比:%3.3f,'#9'变比误差:%3.3f%%', [TestValue[i], ResultValue[i], Rate[i], RRate[i]]);
线性度测试  end;
线性度测试end;
线性度测试
线性度测试var
线性度测试  TestValue, ResultValue: array[
0..6] of Double;
线性度测试  i: Integer;
线性度测试begin
线性度测试  
for i := 0 to 6 do
线性度测试  begin
线性度测试    TestValue[i] :
= i * 10;
线性度测试    ResultValue[i] :
= i * 200 + Random(1000/ 1000.0;
线性度测试  end;
线性度测试  
if not RateCalculate(TestValue, ResultValue, 60.05010.01.0) then
线性度测试  begin
线性度测试    GSTLogFail(
'该路模拟量变比超差!');
线性度测试  end;
线性度测试end.

 

昨天改为从零点开始取斜率

 

 1线性度测试procedure ZX2Multi(dx, dy: array of Double; Count: Integer; var a, b: Double);
 2线性度测试// 最小二乘法直线拟和 y=ax+b;
 3线性度测试var
 4线性度测试  i: Integer;
 5线性度测试  x, y, xy, x2: Double;
 6线性度测试begin
 7线性度测试  x := 0;
 8线性度测试  y := 0;
 9线性度测试  xy := 0;
10线性度测试  x2 := 0;
11线性度测试  for i := 0 to Count - 1 do
12线性度测试  begin
13线性度测试    x := x + dx[i];
14线性度测试    y := y + dy[i];
15线性度测试    xy := xy + dx[i] * dy[i];
16线性度测试    x2 := x2 + dx[i] * dx[i];
17线性度测试  end;
18线性度测试  a := (Count * xy - x * y) / (Count * x2 - x * x);
19线性度测试  b := 1.0 / Count * y - a / Count * x;
20线性度测试  //GSTLogFmt('ZX2Multi Result: a: %3.3f,'#9'b: %3.3f', [a, b]);
21线性度测试end;
22线性度测试
23线性度测试function RateCalculate(TestValue, ResultValue: array of Double; Count: Integer; URate, RateErr, LineErr: Double): Boolean;
24线性度测试//各点斜率与拟和结果比较
25线性度测试var
26线性度测试  i: Integer;
27线性度测试  RARate, a, b: Double;
28线性度测试  Rate, RRate: array[0..100] of Double;
29线性度测试begin
30线性度测试  Result := True;
31线性度测试  ZX2Multi(ResultValue, TestValue, Count, a, b);
32线性度测试  Rate[0] := (TestValue[Count - 1- TestValue[0]) / (ResultValue[Count - 1- ResultValue[0]);
33线性度测试  for i := 1 to Count - 1 do
34线性度测试  begin
35线性度测试    Rate[i] := (TestValue[i] - TestValue[0]) / (ResultValue[i] - ResultValue[0]);
36线性度测试  end;
37线性度测试  RARate := (a - URate) / URate * 100;
38线性度测试  if (Abs(RARate) > RateErr) then
39线性度测试  begin
40线性度测试    Result := False;
41线性度测试  end;
42线性度测试  GSTLogFmt('拟和变比:%3.3f,理论变比:%3.3f,平均变比误差:%3.3f%%,(平均误差指标%3.3f%%),线性误差指标(%3.3f%%)', [a, URate, RARate, RateErr, LineErr]);
43线性度测试  for i := 1 to Count - 1 do
44线性度测试  begin
45线性度测试    RRate[i] := (Rate[i] - a) / a * 100;
46线性度测试    if (Abs(RRate[i]) > LineErr) then
47线性度测试    begin
48线性度测试      Result := False;
49线性度测试    end;
50线性度测试    GSTLogFmt('测量值:%3.3f,'#9'AD采样结果:%3.3f,'#9'实测变比:%3.3f,'#9'变比误差:%3.3f%%', [TestValue[i], ResultValue[i], Rate[i], RRate[i]]);
51线性度测试  end;
52线性度测试end;
53线性度测试
54线性度测试var
55线性度测试  TestValue, ResultValue: array[0..6] of Double;
56线性度测试  i: Integer;
57线性度测试begin
58线性度测试  TestValue[0] := 0;
59线性度测试  ResultValue[0] := 0;
60线性度测试  for i := 1 to 6 do
61线性度测试  begin
62线性度测试    TestValue[i] := i * 10;
63线性度测试    ResultValue[i] := i * 200 + Random(1000/ 1000.0;
64线性度测试  end;
65线性度测试  if not RateCalculate(TestValue, ResultValue, 60.05010.01.0) then
66线性度测试  begin
67线性度测试    GSTLogFail('该路模拟量变比超差!');
68线性度测试  end;
69线性度测试end.

相关文章:

  • 2021-07-14
  • 2021-09-07
  • 2021-07-02
  • 2022-12-23
  • 2022-12-23
  • 2021-11-15
  • 2021-11-19
  • 2021-11-04
猜你喜欢
  • 2022-12-23
  • 2022-01-29
  • 2021-06-23
  • 2021-08-17
  • 2021-07-26
  • 2021-04-29
相关资源
相似解决方案