Delphi实现直线和圆的最小二承法拟合

 

在工程计算中,经常会遇到数据的拟合处理,拟合处理用的最多的是最小二承法。我曾经做过一个数据处理的软件,其中用到了直线和圆的最小二承法拟合算法,是用delphi实现的,现将源代码贴出来。

 

直线拟合

  1. {
  2. 直线的方程为形式:y=k*x+b ,x=c;
  3. X,y为需要处理的数据
  4. }
  5. function  FitLine(x,y: array of double;len: integervar k,b,c: double):boolean;
  6. var
  7.   i:            integer;
  8.   sx,sy,s2x,sxy:double;
  9. begin
  10.   result:=true;
  11.   if len<2 then    //少于两点无法拟合
  12.   begin
  13.     result:=false;
  14.     exit;
  15.   end;
  16.   sx:=0;
  17.   sy:=0;
  18.   s2x:=0;
  19.   sxy:=0;
  20.   for i:=0 to len-1 do
  21.   begin
  22.     sx:=sx+x[i];
  23.     sy:=sy+y[i];
  24.     s2x:=s2x+x[i]*x[i];
  25.     sxy:=sxy+y[i]*x[i];
  26.   end;
  27.   if sx*sx-len*s2x=0 then
  28.     c:=x[0]
  29.   else
  30.   begin
  31.     c:=infinity;
  32.     k:=(sy*sx-sxy*len)/(sx*sx-len*s2x);
  33.     b:=(sy-k*sx)/len;
  34.   end;
  35. end;

二、圆的拟合

  1. {
  2.  圆的方程为:(x-xr)* (x-xr) +(y-yr)* (y-yr)=rad*rad 
  3. }
  4. function FitCircle(x,y:array of double; len:integer; var xr,yr,rad: double):boolean;
  5.   function D2(x,y:array of double; len:integer):double;
  6.   var
  7.     i:integer;
  8.     sa,sb,sab:double;
  9.   begin
  10.     sa:=0;
  11.     sb:=0;
  12.     sab:=0;
  13.     for i:=0 to len-1 do
  14.     begin
  15.       sa:=sa+x[i];
  16.       sb:=sb+y[i];
  17.       sab:=sab+x[i]*y[i];
  18.     end;
  19.     result:=sab-(sa*sb)/len;
  20.   end;
  21.   function D3(x,y:array of double; len:integer):double;
  22.   var
  23.     i:integer;
  24.     sa,sb2,sab2:single;
  25.   begin
  26.     sa:=0;
  27.     sb2:=0;
  28.     sab2:=0;
  29.     for i:=0 to len-1 do
  30.     begin
  31.       sa:=sa+X[i];
  32.       sb2:=sb2+y[i]*y[i];
  33.       sab2:=sab2+X[i]*y[i]*y[i];
  34.     end;
  35.     result:=sab2-(sa*sb2)/len;
  36.   end;
  37. var
  38.   i,n:integer;
  39.   t1,t2,t3,t4:single;
  40.   sum:single;
  41. begin
  42.   result:=true;
  43.   if len<3 then
  44.   begin
  45.     result:=false;//少于三点,拟合没有意义退出
  46.     exit;
  47.   end;
  48.   t1:=(D3(x,x,len)+D3(x,y,len))*D2(y,y,len);
  49.   t2:=(D3(y,x,len)+D3(y,y,len))*D2(x,y,len);
  50.   t3:=2*(D2(x,x,len)*D2(y,y,len)-D2(x,y,len)*D2(x,y,len));
  51.   if t3=0 then
  52.   begin
  53.     result:=false;
  54.     exit;
  55.   end
  56.   else
  57.     xr:=(t1-t2)/t3;
  58.   t1:=(D3(y,y,len)+D3(y,x,len))*D2(x,x,len);
  59.   t2:=(D3(x,y,len)+D3(x,x,len))*D2(x,y,len);
  60.   t3:=2*(D2(x,x,len)*D2(y,y,len)-D2(x,y,len)*D2(x,y,len));
  61.   if t3=0 then
  62.   begin
  63.     result:=false;
  64.     exit;
  65.   end
  66.   else
  67.     yr:=(t1-t2)/t3;
  68.   sum:=0;
  69.   for i:=0 to len-1 do
  70.     sum:=sum+sqr(x[i]-xr)+sqr(y[i]-yr);
  71.   rad:=sqrt(sum/len);
  72. end;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
[软件名称] CurveFit [功能] 1.进行y=a0+a1*x+a2*x^2+...+am*x^m多项式; 2.进行y=Ax^B形式的指数; 3.图形显示曲线(值),残差曲线(值),调整图形显示属性(点的形状、大小,图形背景颜色),并可保存图形; 4.在评价标准:相关指数小于0.5的情况下,给出建议删除的点的序号。 5.计算结果保存为“数据源+--形式结果.txt”的文件 [数学原理] 最小二 [数据源文件格式] 文本源(*.txt) Excel源(*.xls) (打开Excel表格时,会出现暂时的延迟) [数据源格式] x y x1 y1 x2 y2 x3 y3 x4 y4 . . . . . . xn yn [例子] 见文件:正确格式TXT.txt,正确格式TXT--多项式结果,正确格式TXT-指数结果;正确格式EXCEL.xls,正确格式EXCEL--多项式结果,正确格式EXCEL-指数结果; [快速上手] 按照规定格式准备数据源; 打开程序; 选择数据源; 自动进行多项式; 在图中点右键可进行多项操作; 图形显示曲线(值),残差曲线(值),调整图形显示属性(点的形状、大小,图形背景颜色),并可保存图形; 自动保存计算结果 [高级使用] 按照规定格式准备数据源; 打开程序; 选择数据源; 自动进行多项式; 修改精度 修改多项式的最高次幂(若为多项式) 选择形式 在图中点右键可进行多项操作; 图形显示曲线(值),残差曲线(值),调整图形显示属性(点的形状、大小,图形背景颜色),并可保存图形; 自动保存计算结果 [注意] 必须按照规定格式输入数据,否则出错。 数据点个数应大于等于3,否则不无意义。 最高幂次方在0-10之间的正整数,即:m=[1,9],默认,m=1; 精度值:一般取小数点以后6位就可满足要求,不可盲目追究精度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值