最小二乘回归线和错误的C程序

时间:2018-11-24 11:51:37

标签: c least-squares

我想创建一个程序来计算某些给定数据的回归线以及错误,因此可以在大学作业中使用。这是下面的程序:

#include <stdio.h>
#include <math.h>
int main(void)
{
    int i,n,N;
    double x[n],y[n],a=0.0,b=0.0,c=0.0,d=0.0,D,P=0.0,p,Sx,A,B,dA,dB;
    printf("Give the number of data you want to input for x : ");
    scanf("\n%d", &N);
    printf("\nGive the values of x : ");
    for (i=1; i<=N; i++);
    {
        printf("\n Enter x[%d] = ", i);
        scanf("%lf", &x[i]);
        a+=x[i];
        b+=pow(x[i],2);
    }
    printf("\nGive the values of y : ");
    for (i=1; i<=N; i++);
    {
        printf("\n Enter y[%d] = ", i);
        scanf("%lf", &y[i]);
        c+=y[i];
    } 
    D=N*b-pow(a,2);
    A=(b*c-a*d)/D;
    B=(N*d-a*c)/D;
    for (i=1; i<=N; i++);
    {
        d+=x[i]*y[i];
        p=y[i]-A-B*x[i];
        P+=pow(p,2);
    }
    Sx=sqrt(P/N-2);
    dA=Sx*sqrt(b/D);
    dB=Sx*sqrt(N/D);
    printf("\n x \t \t \t y");
    for (i=1; i<=N; i++);
        printf("\nx[%d] = %lf\t%lf = y[%d]", x[i],y[i]);
    printf("\nA = %lf\t B = %lf", A,B);
    printf("\nThe errors of A & B are dA = %lf and dB = %lf", dA,dB);
    printf("\nThe equation of the regression line is y=%lfx+(%lf)", B,A);
    return 0;
} 

我有两个问题。

  1. 尽管给N赋值,程序仍运行,因此我只能给x一个值,给y一个值。错误的原因和位置?
  2. 在打印“ Enter x [%d]”时,它显示x [11],在打印“ x [%d] =%lf \ t%lf = y [%d]”时,最后显示x [0]。再次说明为什么以及在哪里出错?

谢谢您的帮助!

2 个答案:

答案 0 :(得分:0)

  1. 您正在尝试使用C创建动态数组。

为此,您需要对mallocfree使用动态内存分配。因此,您的代码应如下所示:

int N;
double *x;

printf("Give the number of data you want to input for x :\n");
scanf("%d", &N);

x = malloc(sizeof(double) * N);

然后,在程序结束时,您需要释放内存:

free(x);

如果您不想处理手动内存管理(或由于某种原因而不能),则可以使用静态最大数组大小,如下所示:

#define MAX_N_X  100

int main(void) {
    int N;
    double x[MAX_N_X];

    printf("Give the number of data you want to input for x :\n");
    scanf("%d", &N);

    if (N > MAX_N_X) {
        printf("Can't handle that many inputs! Maximum %d\n", MAX_N_X);
        return 0;
    }
}
  1. 您只是错过了printf的两个参数。

你写道:

printf("\nx[%d] = %lf\t%lf = y[%d]", x[i],y[i]);

但是应该是:

printf("\nx[%d] = %lf\t%lf = y[%d]", i, x[i], y[i], i);

答案 1 :(得分:0)

发布此程序几天后,我发现此程序存在主要问题,而解决方法是删除;来自for命令,以及其他一些小的更改。我以为我可能会添加此评论以让您知道,现在它就像是一种魅力。最简单的错误甚至会愚弄受过训练的眼睛。发现这一点后,我很震惊,没有人意识到这一错误。