求助:最小二乘法的函数
测得的曲线需要求拐点的值,不知道labwindows/cvi中有没有最小二乘法的函数,或者有高人曾经做过,恳请发个程序借鉴一下。非常感谢! 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逐步深入与开发实例》(宋宇峰 -机械工业出版社)一书,里面有详细的介绍和源码。 hao o
页:
[1]