Ave a tutti,e buon anno,anche se con qualche giorno di ritardo. Il problema che ho in questo codice è che,ammesso che viene stampato correttamente il numero di iterazioni eseguite del metodo di bisezione,ma la soluzione approssimata di f(x)=0,cioè
logx+x=0,che dovrebbe approssimare il numero x=0.558307,nel main viene stampata come 0.000000 . Ora non riesco a spiegarmi se il problema sia il passaggio del parametro tra la funzione e il main,o proprio il calcolo dell'approssimazione tramite bisezione. Grazie a chi potrà e vorrà aiutarmi.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define TOLL 1.e-5 /*tolleranza,uguale a 10^-5,che rappresenta il max errore che si può commettere nell'approssimazione dello zero tramite
il metodo di bisezione*/
void letturaecontrollo_numerireali_ab(double&,double&);
double bisezione(double&,double&,int&,double&,double);
int main(){
printf("Programma C++ che legge due reali a e b,con a<b,estremi di un intervallo in cui si e' separato lo zero semplice di f(x)=logx+x,e stampa il numero di iterazioni del \nmetodo di bisezione per garantire una approssimazione dello zero con errore minore di 10^-5,e il valore approssimato dello zero fornito dal metodo.\n");
double a,b;
letturaecontrollo_numerireali_ab(a,b);
//Tramite gnuplot si vede,dal grafico della funzione,che lo zero semplice di f(x)=logx+x è circa x=0.558307
int k;//numero iterazioni da eseguire,calcolate a priori
double x;//radice (approssimata)della funzione f(x)=log(x)+x
bisezione(a,b,k,x,TOLL);
printf("Il numero di iterazioni del metodo di bisezione necessarie a garantire una approssimazione della radice con errore minore di 10^-5 e'%d\n",k);
printf("Il valore approssimato della radice di f(x)=log(x)+x,fornito dal metodo di bisezione,e' %lf\n",x);
return 0;
}
//Funzione che legge i due numeri reali a e b,e controlla che valga la relazione a<b:
void letturaecontrollo_numerireali_ab(double& a,double& b)
{
printf("Lo zero semplice della funzione f(x)=logx+x(calcolato con gnuplot)e' uguale ad x=0.558307\n");
do{printf("Inserire un numero reale a,tale che a<b e che a<=x<=b:\n"); scanf("%lf",&a);
printf("Inserire un numero reale b,tale che a<b e che a<=x<=b:\n"); scanf("%lf",&b);}
while(a>b||a==b);
return;
}
//Funzione che implementa il metodo di bisezione per approssimare lo zero di f(x),fermandosi con un criterio di arresto a priori:
double bisezione(double& a,double& b,int& iterazioni,double& x,double tau)
{
iterazioni=floor(log((b-a)/tau)/M_LN2);
for(int i=0;i<iterazioni;i++){
x=(1/2)*(a+b);
if((log(a)+a)*(log(x)+x)<0)
{x=b;}
else if((log(x)+x)*(log(b)+b)<0)
{a=x;}
}
return x;
}