求C或C 语言编写的用最小二乘法进行曲线拟合
你的近似解析表达式为y=at bt^2 ct^2是不是想写成为y=at bt^2 ct^3但是实际拟合出来的表达式为y=a[3] a[2]t a[1]t^2 a[0]t^3会有个常数项的。 简单的讲,所谓拟合是指已知某函数的若干离散函数值{f1,f2,…,fn},通过调整该函数中若干待定系数f(λ1, λ2,…,λ3), 使得该函数与已知点集的差别(最小二乘意义)最小。 如果待定函数是线性,就叫线性拟合或者线性回归(主要在统计中),否则叫作非线性拟合或者非线性回归。表达式也可以是分段函数,这种情况下叫作样条拟合。 曲线拟合: #include #include #include ...全部
你的近似解析表达式为y=at bt^2 ct^2是不是想写成为y=at bt^2 ct^3但是实际拟合出来的表达式为y=a[3] a[2]t a[1]t^2 a[0]t^3会有个常数项的。 简单的讲,所谓拟合是指已知某函数的若干离散函数值{f1,f2,…,fn},通过调整该函数中若干待定系数f(λ1, λ2,…,λ3), 使得该函数与已知点集的差别(最小二乘意义)最小。
如果待定函数是线性,就叫线性拟合或者线性回归(主要在统计中),否则叫作非线性拟合或者非线性回归。表达式也可以是分段函数,这种情况下叫作样条拟合。
曲线拟合: #include #include #include #include Smooth(double *x,double *y,double *a,int n,int m,double *dt1,double *dt2,double *dt3);void main() { int i ,n ,m ; double *x,*y,*a,dt1,dt2,dt3,b; n = 12;// 12个样点 m = 4; //3次多项式拟合b = 0; //x的初值为0/*分别为x,y,a分配存贮空间*/ x = (double *)calloc(n,sizeof(double)); if(x == NULL) { printf("内存分配失败
"); exit (0); } y = (double *)calloc(n,sizeof(double)); if(y == NULL) { printf("内存分配失败
"); exit (0); } a = (double *)calloc(n,sizeof(double)); if(a == NULL) { printf("内存分配失败
"); exit (0); } for(i=1;i1) { t[1]=1; t[0]=-p; d2=0; c=0; g=0; for(i=1;i=4) for(k=j-2;k>=2;k--) s[k-1]=-p*t[k-1] t[k-2]-q*b[k-1]; s[0]=-p*t[0]-q*b[0]; d2=0; c=0; g=0; for(i=1;i=1;k--) q=q*(x[i-1]-z) s[k-1]; d2=d2 q*q; c=y[i-1]*q c; g=(x[i-1]-z)*q*q g; } c=c/d2; p=g/d2; q=d2/d1; d1=d2; a[j-1]=c*s[j-1]; t[j-1]=s[j-1]; for(k=j-1;k>=1;k--) { a[k-1]=c*s[k-1] a[k-1]; b[k-1]=t[k-1]; t[k-1]=s[k-1]; } } *dt1=0; *dt2=0; *dt3=0; for(i=1;i=1;k--) q=q*(x[i-1]-z) a[k-1]; dt=q-y[i-1]; if(fabs(dt)>*dt3) *dt3=fabs(dt); *dt1=*dt1 dt*dt; *dt2=*dt2 fabs(dt); } /*释放存储空间*/ free(s); free(t); free(b); return(1); }。收起