KoshakSB
@KoshakSB
студент ггту сухого

Почему неправильно считает Коэффициенты регрессии?

main.cpp
#include <stdio.h>
#include "bibliot.h" // Ïîäêëþ÷àåì âàøó áèáëèîòåêó

#define MAX_ROWS 100
#define MAX_COLS 3

void print_separator(int col_width) {
    for (int i = 0; i < col_width; i++) {
        printf("-");
    }
}

int main(int argc, char** argv) {
    setlocale(LC_ALL, "Russian");

    FILE *f;
    char data[MAX_ROWS][MAX_COLS][100];
    int rows = 0;
    float orders[MAX_ROWS]; // Ìàññèâ äëÿ êîëè÷åñòâà çàêàçîâ, òåïåðü òèï float
    float income[MAX_ROWS]; // Ìàññèâ äëÿ ÷èñòîãî äîõîäà, òåïåðü òèï float

    f = fopen("predpriyatiya.txt", "rt");
    if (f == NULL) {
        printf("Íå óäàëîñü îòêðûòü ôàéë.\n");
        return 1;
    }

    // ×òåíèå äàííûõ èç ôàéëà
    while (rows < MAX_ROWS && fscanf(f, "%[^;];%[^;];%[^\n]", data[rows][0], data[rows][1], data[rows][2]) == 3) {
        // Ñ÷èòûâàåì äàííûå â ìàññèâû
        orders[rows] = atof(data[rows][1]); // Ïðåîáðàçóåì ñòðîêó âî float è ñîõðàíÿåì â ìàññèâ êîëè÷åñòâà çàêàçîâ
        income[rows] = atof(data[rows][2]); // Ïðåîáðàçóåì ñòðîêó âî float è ñîõðàíÿåì â ìàññèâ ÷èñòîãî äîõîäà
        rows++;
    }

    fclose(f);
    // Find maximum lengths for each column
    int max_lengths[MAX_COLS] = {0};
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < MAX_COLS; j++) {
            int length = strlen(data[i][j]);
            if (length > max_lengths[j]) {
                max_lengths[j] = length;
            }
        }
    }

    // Print data rows with aligned columns
    for (int i = 0; i < rows; i++) {
        printf("%-*s  %-*s  %-*s\n", max_lengths[0], data[i][0], max_lengths[1], data[i][1], max_lengths[2] + 10, data[i][2]);
    }
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
    // Âû÷èñëÿåì ñòàòèñòèêó äëÿ ìàññèâà êîëè÷åñòâà çàêàçîâ
    float Sx, Srx, Somx;
    statistic(rows, orders, income, &Sx, &Srx, &Somx);

    // Âû÷èñëÿåì ñòàòèñòèêó äëÿ ìàññèâà ÷èñòîãî äîõîäà
    float Sy, Sry, Somy;
    statistic(rows, income, orders, &Sy, &Sry, &Somy);

    // Âûâîäèì ðåçóëüòàòû ñòàòèñòèêè äëÿ ìàññèâà çàêàçîâ
    printf("Ðåçóëüòàòû âû÷èñëåíèé â ìàññèâå çàêàçîâ\n");
    printf("Ñðåäíåå çíà÷åíèå: %-15.2f\n", Srx);
    printf("Ñðåäíåêâàäðàòè÷íîå îòêëîíåíèå: %.3f\n\n", Somx);

    // Âûâîäèì ðåçóëüòàòû ñòàòèñòèêè äëÿ ìàññèâà ÷èñòîãî äîõîäà
    printf("Ðåçóëüòàòû âû÷èñëåíèé â ìàññèâå ÷èñòîãî äîõîäà\n");
    printf("Ñðåäíåå çíà÷åíèå: %-15.2f\n", Sry);
    printf("Ñðåäíåêâàäðàòè÷íîå îòêëîíåíèå: %.3f\n\n", Somy);

    // Âû÷èñëÿåì êîýôôèöèåíò ïàðíîé êîððåëÿöèè
    float r = top(rows, orders, Srx, income, Sry) / ((rows - 1) * Somx * Somy);

    // Âûâîäèì êîýôôèöèåíò ïàðíîé êîððåëÿöèè
    printf("Êîýôôèöèåíò ïàðíîé êîððåëÿöèè: %.3f\n\n", r);
     if (fabs(r) <= 0.5) {
        system("color FC"); // Èçìåíåíèå öâåòà òåêñòà â êîíñîëè (F - áåëûé òåêñò, C - êðàñíûé ôîí)
        printf("Ñâÿçü ìåæäó x è y ñëàáàÿ!\n"); // Âûâîä ñîîáùåíèÿ î ñëàáîé ñâÿçè ìåæäó x è y
    } else {
        float a0, a1; // Êîýôôèöèåíòû ðåãðåññèè
        float regr1[MAX_ROWS], regr2[MAX_ROWS]; // Ìàññèâû äëÿ çíà÷åíèé ðåãðåññèè
        regr(rows, Sy, fi1, orders, &a0, &a1, income); // Âû÷èñëåíèå êîýôôèöèåíòîâ a0 è a1 äëÿ ïåðâîé ðåãðåññèè
        for (int i = 0; i < rows; i++)
            regr1[i] = a0 + a1 * fi1(orders[i]); // Âû÷èñëåíèå çíà÷åíèé ïåðâîé ðåãðåññèè
        printf("Êîýôôèöèåíòû à0 è à1 äëÿ ïåðâîé ðåãðåññèè:\n a0=%.3f\n a1=%.3f\n\n", a0, a1);

        regr(rows, Sy, fi2, orders, &a0, &a1, income); // Âû÷èñëåíèå êîýôôèöèåíòîâ a0 è a1 äëÿ âòîðîé ðåãðåññèè
        for (int i = 0; i < rows; i++)
            regr2[i] = a0 + a1 * fi2(orders[i]); // Âû÷èñëåíèå çíà÷åíèé âòîðîé ðåãðåññèè
        printf("Êîýôôèöèåíòû à0 è à1 äëÿ âòîðîé ðåãðåññèè:\n a0=%.3f\n a1=%.3f\n\n", a0, a1);
    }

    return 0;
}

bibliot.h
#include <stdlib.h>
#include <locale.h>
#ifndef _bibliot_H_
#define _bibliot_H_s_
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <string.h>
#include <math.h>


/* Âû÷èñëåíèå ñðåäíåãî çíà÷åíèÿ è ñðåäíåêâàäðàòè÷åñêîãî îòêëîíåíèÿ */
void statistic(int n, float orders[], float income[], float *S, float *Sr, float *Som) {
    int i;
    float D = 0; // Ïåðåìåííàÿ äëÿ õðàíåíèÿ ñóììû êâàäðàòîâ îòêëîíåíèé
    *S = 0; // Îáíóëåíèå ñóììû ýëåìåíòîâ ìàññèâà
    for (i = 0; i < n; i++)
        *S = *S + orders[i]; // Ñóììèðîâàíèå âñåõ ýëåìåíòîâ ìàññèâà
    *Sr = *S / n; // Âû÷èñëåíèå ñðåäíåãî çíà÷åíèÿ
    for (i = 0; i < n; i++)
        D += (orders[i] - *Sr) * (orders[i] - *Sr); // Âû÷èñëåíèå ñóììû êâàäðàòîâ îòêëîíåíèé îò ñðåäíåãî çíà÷åíèÿ
    *Som = sqrt(D / (n - 1)); // Âû÷èñëåíèå ñðåäíåêâàäðàòè÷åñêîãî îòêëîíåíèÿ
}

/* Âû÷èñëåíèå êîýôôèöèåíòà êîððåëÿöèè */
float top(int n, float orders[], float Sra, float income[], float Srb) {
    int i;
    float S = 0; // Ïåðåìåííàÿ äëÿ õðàíåíèÿ ñóììû ïðîèçâåäåíèé îòêëîíåíèé
    for (i = 0; i < n; i++)
        S += (orders[i] - Sra) * (income[i] - Srb); // Âû÷èñëåíèå ñóììû ïðîèçâåäåíèé îòêëîíåíèé
    return S; // Âîçâðàùåíèå ñóììû ïðîèçâåäåíèé
}

/* Âû÷èñëåíèå ðåçóëüòàòîâ ïî ðåãðåññèîííûì çàâèñèìîñòÿì */
void regr(int n, float Sy, float (*fi)(float), float orders[], float *a0, float *a1, float income[]) {
    int i;
    float S1 = 0, S2 = 0, S3 = 0; // Ïåðåìåííûå äëÿ õðàíåíèÿ ñóìì
    for (i = 0; i < n; i++) {
        S1 += fi(orders[i]) * fi(orders[i]); // Âû÷èñëåíèå ñóììû êâàäðàòîâ çíà÷åíèé ôóíêöèè fi
        S2 += fi(orders[i]); // Âû÷èñëåíèå ñóììû çíà÷åíèé ôóíêöèè fi
        S3 += income[i] * fi(orders[i]); // Âû÷èñëåíèå ñóììû ïðîèçâåäåíèé çíà÷åíèé income è ôóíêöèè fi
    }
    
    float d = n * S1 - S2 * S2; // Âû÷èñëåíèå îïðåäåëèòåëÿ
    *a0 = (Sy * S1 - S2 * S3) / d; // Âû÷èñëåíèå êîýôôèöèåíòà ðåãðåññèè a0
    *a1 = (n * S3 - S2 * Sy) / d; // Âû÷èñëåíèå êîýôôèöèåíòà ðåãðåññèè a1
}


float fi1(float x) {
   return sqrt(x) * (log(x)) * (log(x)); // Âû÷èñëåíèå çíà÷åíèÿ ôóíêöèè fi1
}


float fi2(float x) {
    return exp(1 / x); // Âû÷èñëåíèå çíà÷åíèÿ ôóíêöèè fi2
}

/* Âû÷èñëåíèå äèñïåðñèè */
float disp(int n, float orders[], float income[]) {
    int i;
    float S = 0; // Ïåðåìåííàÿ äëÿ õðàíåíèÿ ñóììû êâàäðàòîâ îòêëîíåíèé
    for (i = 0; i < n; i++)
        S += (orders[i] - income[i]) * (orders[i] - income[i]); // Âû÷èñëåíèå ñóììû êâàäðàòîâ îòêëîíåíèé
    return S / (n - 1); // Âîçâðàùåíèå äèñïåðñèè
}

#endif // Çàâåðøåíèå óñëîâíîé êîìïèëÿöèè


6632672121294589795931.png
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
KoshakSB
@KoshakSB Автор вопроса
студент ггту сухого
помогла простая замена float на double.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы