Sei sulla pagina 1di 4

#include <stdio.

h>
#include <stdlib.h>
#include <math.h>
#define LMAX 1000
double media_pesata(double *array, double *s, int la);
void print_array(double *array, int N);
double chi_quadro(double *y, double *x, double *s, int la, double m, double c);
int main(){
double x[LMAX], s[LMAX], y[LMAX], xy[LMAX], x2[LMAX];
int i = 0, la = 0, k;
double x_m, y_m, xy_m, x2_m;
double m, sigma_m, c, sigma_c, cov_mc;
FILE *datis;
FILE *datix;
FILE *datiy;
double somme = 0;
//qui si caricano i file necessari: x,y,s e si controlla se sono reperib
ili
if( (datix = fopen("x.txt", "r+")) == NULL){
printf("Errore nell-apertura del file 'x.dat'. Rilanciare il pro
gramma dopo aver reperito il file.\n");
exit(EXIT_FAILURE);
}
if( (datis = fopen("s.txt", "r+")) == NULL){
printf("Errore nell-apertura del file 's.dat'. Rilanciare il pro
gramma dopo aver reperito il file.\n");
exit(EXIT_FAILURE);
}
if( (datiy = fopen("y.txt", "r+")) == NULL){
printf("Errore nell-apertura del file 'y.dat'. Rilanciare il pro
gramma dopo aver reperito il file.\n");
exit(EXIT_FAILURE);
}
//qui si riempiono gli array e si conta il numero di misure
while( (fscanf(datix, "%lf", &x[i])) != EOF && i < LMAX){
i++;
}
la = i;
i = 0;
while( (fscanf(datiy, "%lf", &y[i])) != EOF && i < LMAX){
i++;
}
i = 0;
while( (fscanf(datis, "%lf", &s[i])) != EOF && i < LMAX){
i++;
}
//----------------------------------------------------------------------

----// costruisco il vettore xy e x2


for(i = 0; i < la; i++){
xy[i] = x[i]*y[i];
x2[i] = pow(x[i],2);
}
//--------------------------------------------------------------------------//costruisco le somme degli inversi delle incertezze al quadrato: Somme(
1/(s^2)) per la formula delle varianze
for(i = 0; i < la; i++){
somme += 1./(pow(s[i],2));
}
//-----------------------------------------------x_m = media_pesata(x, s, la);
y_m = media_pesata(y, s, la);
xy_m = media_pesata(xy, s ,la);
x2_m = media_pesata(x2, s ,la);

m = (xy_m-x_m*y_m)/(x2_m-pow(x_m,2));
sigma_m = sqrt(1/((x2_m-pow(x_m,2))*somme));
c = (x2_m*y_m-xy_m*x_m)/(x2_m-pow(x_m,2));
sigma_c = sqrt( (x2_m)/((x2_m-pow(x_m,2))*somme) );
cov_mc = -(x_m)/((x2_m-pow(x_m,2))*somme);
printf("****************************************************************
********************\n**********************************************************
**************************\n\n\nm = \t\t%e\nsigma_m = \t%e\nc = \t\t%e\nsigma_c
= \t%e\ncov(m,c) = \t%e\n\n\nChi^2 = %lf contro %d\n\n\n\n\n", m, sigma_m, c, si
gma_c, cov_mc, chi_quadro(y,x,s,la,m,c), la-2);
// residui
printf("---------------------------------------------------------------------------\nVuoi usare il metodo dei residui?\n(premi 0 = no, 1 = si)\n");
scanf("%d", &k);
if( k == 1){
for(i = 0; i< la; i++){
s[i] = 0;
for(k = 0; k < la; k++){
s[i] += pow( y[k]-m*x[k]-c,2 )/(la -2);
}
s[i] = sqrt(s[i]);
}

//..............................................................................

......................
for(i = 0; i < la; i++){
somme += 1./(pow(s[i],2));
}
//-----------------------------------------------x_m = media_pesata(x, s, la);
y_m = media_pesata(y, s, la);
xy_m = media_pesata(xy, s ,la);
x2_m = media_pesata(x2, s ,la);

m = (xy_m-x_m*y_m)/(x2_m-pow(x_m,2));
sigma_m = sqrt(1/((x2_m-pow(x_m,2))*somme));
c = (x2_m*y_m-xy_m*x_m)/(x2_m-pow(x_m,2));
sigma_c = sqrt( (x2_m)/((x2_m-pow(x_m,2))*somme) );
cov_mc = -(x_m)/((x2_m-pow(x_m,2))*somme);
//......................................................................
..............................
printf("\n\n\nnuova s = \t%e\nm = \t\t%e\nsigma_m = \t%e\nc = \t
\t%e\nsigma_c = \t%e\ncov(m,c) = \t%e\n\n\nChi^2 = %lf contro %d\n\n\n\n\n", s[0
], m, sigma_m, c, sigma_c, cov_mc, chi_quadro(y,x,s,la,m,c), la-2);
}else
return 0;
}
// FUNZIONI ********************************************************************
*********************************
// funzione 'media pesata'
double media_pesata(double *array, double *err, int la){
int k;
double num = 0, den = 0;
for(k = 0; k < la; k++){
num += (array[k])/(pow(err[k], 2)); // numeratore
den += 1./(pow(err[k],2));
// denominatore
}
return (num/den);
}
double chi_quadro(double *y, double *x, double *s, int la, double m, double c){
int i;
double chi_q = 0;
for(i = 0; i < la; i++){
chi_q += pow(y[i]-m*x[i]-c,2)/pow(s[i],2);
}
return chi_q;
}
// funzione 'stampa array' (per controlli)

void print_array(double *array, int N){


int cont_1;
for(cont_1 = 0; cont_1 < N; cont_1++)
printf("Componente %d:\t%lf\n", cont_1,*(array + cont_1));
}