2022_valutata_1.c (download)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define POINTS 50
#define A 0.1
#define B -0.5
#define NOISE 0.2
void generate_points(double x[], double y[]);
void least_squares(double x[], double y[], double *m, double *q);
int main() {
    srand48(time(NULL));
    double x[POINTS], y[POINTS];
    double m, q;
    int i;
    
    generate_points(x, y);
    
    FILE *output = fopen("points.dat", "w");
    for(i = 0; i < POINTS; i++) {
        fprintf(output, "%.3lf %.3lf\n", x[i], y[i]);
    }
    fclose(output);
    
    least_squares(x, y, &m, &q);
    
    output = fopen("fit.dat", "w");
    for(i = 0; i < POINTS; i++) {
        fprintf(output, "%.3lf %.3lf\n", x[i], m * x[i] + q);
    }
    fclose(output);
    
    return 0;
}
void generate_points(double x[], double y[]) {
    int i;
    for(i = 0; i < POINTS; i++) {
        x[i] = (double) i;
        y[i] = A * x[i] + B + (drand48() - 0.5) * NOISE;
    }
}
void least_squares(double x[], double y[], double *m, double *q) {
    double x_sum = 0, y_sum = 0, xy_sum = 0, x2_sum = 0;
    int i;
    
    for(i = 0; i < POINTS; i++) {
        x_sum += x[i];
        y_sum += y[i];
        xy_sum += x[i] * y[i];
        x2_sum += x[i] * x[i];
    }
    
    *m = (POINTS * xy_sum - x_sum * y_sum) / (POINTS * x2_sum - x_sum * x_sum);
    *q = (y_sum - *m * x_sum) / POINTS;
}