Программа C для линии регрессии наименьших квадратов и ошибок - PullRequest
0 голосов
/ 24 ноября 2018

Я хотел создать программу для расчета линии регрессии некоторых данных вместе с ошибками, чтобы я мог использовать ее в своих университетских заданиях.Это следующая программа:

#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 иодно значение для у.Почему и где ошибка?
  2. При печати «Enter x [% d]» отображается x [11] и в конце при печати «x [% d] =% lf \ t% lf= y [% d] ", отображается x [0].Опять же, почему и где ошибка?

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Я обнаружил, что главная проблема с этой программой через несколько дней после публикации, и исправлением будет удаление;из команды for, а также некоторые другие незначительные изменения.Я думал, что мог бы добавить этот комментарий, чтобы сообщить вам, и теперь он работает как шарм.Самые простые ошибки дурачат даже натренированные глаза.После того как я обнаружил это, я был шокирован, что никто не понял этой ошибки.

0 голосов
/ 24 ноября 2018
  1. Вы пытаетесь создать динамический массив в C.

Для этого вам нужно использовать динамическое выделение памяти с malloc и free.Итак, ваш код должен выглядеть примерно так:

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;
    }
}
Вы просто пропустили два параметра 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...