线性度测试

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

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

 

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

 

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

转载于:https://www.cnblogs.com/Bolik/archive/2006/03/29/361953.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值