cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1075|回复: 2

求助:最小二乘法的函数

[复制链接]
发表于 2008-12-27 18:59:16 | 显示全部楼层 |阅读模式
测得的曲线需要求拐点的值,不知道labwindows/cvi中有没有最小二乘法的函数,或者有高人曾经做过,恳请发个程序借鉴一下。非常感谢!
发表于 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[20],t[20],b[20];   
          for   (i=0;   i<=m-1;   i++)   a[i]=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[i]/(1.0*n);   
          b[0]=1.0;   d1=1.0*n;   p=0.0;   c=0.0;   
          for   (i=0;   i<=n-1;   i++)   
              {   p=p+(x[i]-z);   c=c+y[i];}   
          c=c/d1;   p=p/d1;   
          a[0]=c*b[0];   
          if   (m>1)   
              {   t[1]=1.0;   t[0]=-p;   
                  d2=0.0;   c=0.0;   g=0.0;   
                  for   (i=0;   i<=n-1;   i++)   
                      {   q=x[i]-z-p;   d2=d2+q*q;   
                          c=c+y[i]*q;   
                          g=g+(x[i]-z)*q*q;   
                      }   
                  c=c/d2;   p=g/d2;   q=d2/d1;   
                  d1=d2;   
                  a[1]=c*t[1];   a[0]=c*t[0]+a[0];   
              }   
          for   (j=2;   j<=m-1;   j++)   
              {   s[j]=t[j-1];   
                  s[j-1]=-p*t[j-1]+t[j-2];   
                  if   (j>=3)   
                      for   (k=j-2;   k>=1;   k--)   
                          s[k]=-p*t[k]+t[k-1]-q*b[k];   
                  s[0]=-p*t[0]-q*b[0];   
                  d2=0.0;   c=0.0;   g=0.0;   
                  for   (i=0;   i<=n-1;   i++)   
                      {   q=s[j];   
                          for   (k=j-1;   k>=0;   k--)   
                              q=q*(x[i]-z)+s[k];   
                          d2=d2+q*q;   c=c+y[i]*q;   
                          g=g+(x[i]-z)*q*q;   
                      }   
                  c=c/d2;   p=g/d2;   q=d2/d1;   
                  d1=d2;   
                  a[j]=c*s[j];   t[j]=s[j];   
                  for   (k=j-1;   k>=0;   k--)   
                      {   a[k]=c*s[k]+a[k];   
                          b[k]=t[k];   t[k]=s[k];   
                      }   
              }   
          dt[0]=0.0;   dt[1]=0.0;   dt[2]=0.0;   
          for   (i=0;   i<=n-1;   i++)   
              {   q=a[m-1];   
                  for   (k=m-2;   k>=0;   k--)   
                      q=a[k]+q*(x[i]-z);   
                  p=q-y[i];   
                  if   (fabs(p)>dt[2])   dt[2]=fabs(p);   
                  dt[0]=dt[0]+p*p;   
                  dt[1]=dt[1]+fabs(p);   
              }   
          return;   
      }

另外你也可以参考《Lab Window/CVI逐步深入与开发实例》(宋宇峰 -机械工业出版社)一书,里面有详细的介绍和源码。
发表于 2009-4-1 21:59:02 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-20 12:40 , Processed in 1.545169 second(s), 7 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表