题:用最小二乖法做一個回归方程
1.写出回归方程 (10个点中有1个奇异点明显偏离曲线)y=kx+b. 求解出K和B 2.用C语言编程。
x=1, 2 , 3, 4, 5, 8, 10, 15, 20, 30
y=4, 4.6, 5.1, 5.4, 6.1, 8.4 ,8.6,11.0,13.4,18.6
以下了用VC做的.
哪位能帮我改成标准C 语言的???
#include "stdafx.h" float *Approx(float *x,float *y,int m,int n); float *ColPivot(float *a,int n); float power(int i,float v);
int main(int argc, char* argv[]) { int i; float *a; float x[16] ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; float y[16] ={4.00,6.40,8.00,8.80,9.22,9.50,9.70,9.86,10.00,10.20,10.32,10.42,10.50,10.55,10.58,10.60}; a = Approx(x,y,16,2); for(i=0;i<=2;i++) cout<<"a["<<i<<"] = "<<a[i]<<endl; printf("Hello World!\n"); return 0; }
float *Approx(float *x,float *y,int m,int n) { float *c,*a; int i,j,t; c=(float *)malloc((n+1)*(n+2)*sizeof(float)); for(i=0;i<=n;i++) { for(j=0;j<=n;j++) { *(c+i*(n+2)+j)=0.0; for(t=0;t<=m-1;t++) *(c+i*(n+2)+j) += power(i+j,x[t]); } *(c+i*(n+2)+n+1)=0.0; for(j=0;j<=m-1;j++) *(c+i*(n+2)+n+1) += y[j]*power(i,x[j]); } a=ColPivot((float*)c,n+1); free(c); return a; }
float *ColPivot(float *a,int n) { int i,j,t,k; float *x,*c,p; x=(float*)malloc(n*sizeof(float)); c=(float*)malloc(n*(n+1)*sizeof(float));
for(i=0;i<=n-1;i++) for(j=0;j<=n;j++) *(c+i*(n+1)+j)=(*(a+i*(n+1)+j)); for(i=0;i<=n-2;i++) { k=i; for(j=i+1;j<=n-1;j++) if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j; if(k!=i) for(j=i;j<=n;j++) { p=*(c+i*(n+1)+j); *(c+i*(n+1)+j)=*(c+k*(n+1)+j); *(c+k*(n+1)+j)=p; } for(j=i+1;j<n;j++) { p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i)); for(t=i;t<n;t++) *(c+j*(n+1)+t)=*(c+j*(n+1)+t)-p*(*(c+i*(n+1)+t)); *(c+j*(n+1)+n) -= *(c+i*(n+1)+n)*p; } } for(i=n-1;i>=0;i--) { for(j=n-1;j>=i+1;j--) *(c+i*(n+1)+n)-=x[j]*(*(c+i*(n+1)+j)); x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i)); } free(c); return x; }
float power(int i,float v) { float a=1.0; while(i--) a*=v; return a; }