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
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
KoshakSB
@KoshakSB Автор вопроса
студент ггту сухого
помогла простая замена float на double.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы