Beata0101 发表于 2008-12-27 18:59:16

求助:最小二乘法的函数

测得的曲线需要求拐点的值,不知道labwindows/cvi中有没有最小二乘法的函数,或者有高人曾经做过,恳请发个程序借鉴一下。非常感谢!

netcreature 发表于 2008-12-29 09:12:57

CVI中没有最小二乘法的函数。这里有一个C源码,仅供参考:
#include   "math.h"   
//x[]是x坐标数组,y[]是y坐标数组,n是数据点个数,a[]你和结果,即多项式的系数数组;   
//m为拟合阶数。   
void   iapcir(double   x[],double   y[],int   n,double   a[],int   m,double   dt[])   
      {   int   i,j,k;   
          double   z,p,c,g,q,d1,d2,s,t,b;   
          for   (i=0;   i<=m-1;   i++)   a=0.0;   
          if   (m>n)   m=n;   
          if   (m>20)   m=20;   
          z=0.0;   
          for   (i=0;   i<=n-1;   i++)   z=z+x/(1.0*n);   
          b=1.0;   d1=1.0*n;   p=0.0;   c=0.0;   
          for   (i=0;   i<=n-1;   i++)   
            {   p=p+(x-z);   c=c+y;}   
          c=c/d1;   p=p/d1;   
          a=c*b;   
          if   (m>1)   
            {   t=1.0;   t=-p;   
                  d2=0.0;   c=0.0;   g=0.0;   
                  for   (i=0;   i<=n-1;   i++)   
                      {   q=x-z-p;   d2=d2+q*q;   
                        c=c+y*q;   
                        g=g+(x-z)*q*q;   
                      }   
                  c=c/d2;   p=g/d2;   q=d2/d1;   
                  d1=d2;   
                  a=c*t;   a=c*t+a;   
            }   
          for   (j=2;   j<=m-1;   j++)   
            {   s=t;   
                  s=-p*t+t;   
                  if   (j>=3)   
                      for   (k=j-2;   k>=1;   k--)   
                        s=-p*t+t-q*b;   
                  s=-p*t-q*b;   
                  d2=0.0;   c=0.0;   g=0.0;   
                  for   (i=0;   i<=n-1;   i++)   
                      {   q=s;   
                        for   (k=j-1;   k>=0;   k--)   
                              q=q*(x-z)+s;   
                        d2=d2+q*q;   c=c+y*q;   
                        g=g+(x-z)*q*q;   
                      }   
                  c=c/d2;   p=g/d2;   q=d2/d1;   
                  d1=d2;   
                  a=c*s;   t=s;   
                  for   (k=j-1;   k>=0;   k--)   
                      {   a=c*s+a;   
                        b=t;   t=s;   
                      }   
            }   
          dt=0.0;   dt=0.0;   dt=0.0;   
          for   (i=0;   i<=n-1;   i++)   
            {   q=a;   
                  for   (k=m-2;   k>=0;   k--)   
                      q=a+q*(x-z);   
                  p=q-y;   
                  if   (fabs(p)>dt)   dt=fabs(p);   
                  dt=dt+p*p;   
                  dt=dt+fabs(p);   
            }   
          return;   
      }

另外你也可以参考《Lab Window/CVI逐步深入与开发实例》(宋宇峰 -机械工业出版社)一书,里面有详细的介绍和源码。

panheping 发表于 2009-4-1 21:59:02

hao o
页: [1]
查看完整版本: 求助:最小二乘法的函数