#include #include #include #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; }