Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h> //mi serve per fabs, che e' il valore assoluto di un numero reale
- void main(void)
- {float x0,x,errore,incognita_al_quadrato;
- unsigned int i=0,iterazioni_max;/*dichiaro quante iterazioni siano ammissibili per evitare che vada avanti in eterno*/
- unsigned short int mostrare_numeri;//dichiaro se poi mostero' tutti i numeri; per questa variabile mi basta lo short int, per quella precedente non necessariamente
- char risposta;//mi servira' poi per lo switch per chiedere all'utente se vuole vedere tutti i numeri
- printf("\nInserisci il numero del quale vuoi la radice quadrata\n");
- scanf("%f",&incognita_al_quadrato);
- printf("\nInserisci una stima della radice\n");
- scanf("%f",&x0);
- while (!x0)//devo assicurarmi che nessun valore della successione sia zero perche' altrimenti non posso calcolare il successivo senza dividere per zero
- {printf("\nPer favore inserisci un valore iniziale non nullo... Altrimenti l'algoritmo non funziona!\n");/*Cosi' evito la divisione per zero*/
- scanf("%f",&x0);
- }
- x=x0; //x0 e' il primo valore della mia successione; devo assegnare qualcosa a x prima di usarlo se no รจ casuale
- printf("\nInserisci l'errore accettabile\n");
- scanf("%f",&errore);
- printf("\nInserisci il numero massimo di iterazioni accettabili\n");//devo evitare che il programma duri in eterno senza che l'utente ne sia consapevole
- scanf("%d",&iterazioni_max); //non serve a molto perche' la convergenza e' velocissima, ma non si sa mai
- printf("\nVuoi visualizzare i numeri della successione calcolati passo passo? (s/n)\n");
- scanf(" %c",&risposta);
- switch(risposta)
- {case 's':
- case 'S': mostrare_numeri=1;
- break;
- case 'n':
- case 'N': mostrare_numeri=0;
- break;
- default : while ((risposta!='s') && (risposta!='S') && (risposta!='n') && (risposta!='N'))
- {printf("\nInput sbagliato, per favore riprova.\n");
- scanf(" %c",&risposta);
- }
- if ((risposta=='s')||(risposta=='S'))
- {mostrare_numeri=1;
- }
- else
- {mostrare_numeri=0;
- }
- break;
- }
- //printf("%d",mostrare_numeri);
- if (mostrare_numeri==1)/*l'espressione fabs(...) al rigo sotto e' l'errore relativo fra x_n+1 e x_n*/
- {while ((i<iterazioni_max) && (fabs((-x/2+incognita_al_quadrato/(2*x))/x)>=errore) && (x!=0))/*i deve essere minore di ite_max perche' poi gli aggiungo 1; cosi' non sforo*/
- {x=0.5*x+(0.5*incognita_al_quadrato)/(x); /*prima controllo se non ho sforato iterazioni_max, poi se ho raggiunto la precisione voluta*/
- i=i+1; /*l'ultimo controllo verifica che x non sia zero, se no spuntano divergenze non volute*/
- printf("\n%.15f\n",x);
- }
- }
- else
- {while ((i<iterazioni_max) && (fabs((-x/2+incognita_al_quadrato/(2*x))/x)>=errore) && (x!=0))/*i deve essere minore di ite_max perche' poi gli aggiungo 1; cosi' non sforo*/
- {x=0.5*x+(0.5*incognita_al_quadrato)/(x); /*prima controllo se non ho sforato iterazioni_max, poi se ho raggiunto la precisione voluta*/
- i=i+1; /*l'ultimo controllo verifica che x non sia zero, se no spuntano divergenze non volute*/
- }
- }
- if (i<iterazioni_max) /*se il while si e' fermato con i<ite_max vuol dire che e' stata raggiunta la precisione voluta con almeno una iterazione di margine*/
- {printf("\nPartendo da %f ed eseguendo %d iterazioni ho trovato che %.15f approssima la radice quadrata di %f con errore inferiore a %.15f\n",x0,i,fabs(x),incognita_al_quadrato,errore);
- }
- else /*in questo caso ho raggiunto quella precisione esattamente con iterazioni_max oppure non l'ho raggiunta; aggiungo un if*/
- {if (fabs((-x/2+incognita_al_quadrato/(2*x))/x)<=errore) /*l'ho raggiunta per un pelo*/
- {printf("\nPartendo da %f ed eseguendo proprio %d iterazioni ho trovato che %.15f approssima la radice quadrata di %f con errore inferiore a %.15f\n",x0,i,fabs(x),incognita_al_quadrato,errore);
- }
- else /*non l'ho raggiunta*/
- {printf("\nIn %d iterazioni partendo da %f non sono riuscito ad approssimare la radice quadrata di %f con errore minore di %.15f; la mia miglior stima e' %.15f.\n",i,x0,incognita_al_quadrato,errore,fabs(x));
- //printf("\nIn %d iterazioni partendo da %f non sono riuscito ad approssimare la radice quadrata di %f con errore minore di %f; la mia miglior stima e' %f, che approssima sqrt(%f) con errore inferiore a %f\n",i,x0,incognita_al_quadrato,errore,fabs(x),incognita_al_quadrato,fabs((-x/2+incognita_al_quadrato/(2*x))/x));
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement