急求一元线性回归的C语言程序!!!

至少能输入30组x,y的值,能够计算x,y的平均数,x平方、y平方的平均数,xy乘积的平均数,y=a+bx中,a、b的值,相关系数r和标准偏差s(y)
结果至少保留5位有效数字

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

void analysis(double * x, double * y, int n) {
    double d1, d2, d3,a,b;
    double sumx,sumy,sumxx,sumyy,sumxy,mx,my,mxx,myy,mxy;
    int i;

    // 变量的初始化
    d1 = d2 = d3 =sumx=sumy=sumxx=sumyy=sumxy=0.0;

    // 计算x、y的平均值
    for (i = 0; i < n; i++) {
        sumx += x[i];
        sumy += y[i];
    }
    mx = sumx / n;
    my = sumy / n;
    printf("mx=%f my=%f\n",mx,my);
    // 计算x、y平和x*y的平均值
    for (i = 0; i < n; i++) {
        sumxx += x[i]*x[i];
        sumyy += y[i]*y[i];
        sumxy += x[i]*y[i];
    }
    mxx = sumxx / n;
    myy = sumyy / n;
    mxy = sumxy / n;
    printf("mxx=%f myy=%f mxy=%f\n",mxx,myy,mxy);
    //
    a=(n*sumxy-sumx*sumy)/(n*sumxx-sumx*sumx);
    b=(sumxx*sumy-sumx*sumxy)/(n*sumxx-sumx*sumx);
    printf("a=%f b=%f\n",a,b);
    // 计算相关系数的数据组成部分
    for (i = 0; i < n; i++) {
        d1 += (x[i] - mx) * (y[i] - my);
        d2 += (x[i] - mx) * (x[i] - mx);
        d3 += (y[i] - my) * (y[i] - my);
    }
    
    double r = d1 / sqrt(d2 * d3);
    //
    printf("相关系数r=%f\n",r);
    //
    double *yy=(double*)malloc(sizeof(double)*n);
    double sumerrorsquare=0,error;
    for(i=0;i<n;i++) {
        yy[i]=a*x[i]+b;
        sumerrorsquare+=(yy[i]-y[i])*(yy[i]-y[i]);
    }
    error=sqrt(sumerrorsquare/(n-1));
    printf("标准偏差s(y)=%f\n",error);
}

int  main(){
    double x[4]={1.0,3.0,3.0,9.0};
    double y[4]={11.0,12.0,13.0,14.0};
    analysis(x,y,4);
    return 0;
}

温馨提示:答案为网友推荐,仅供参考
相似回答