PDA

Visualizza la versione completa : calcolo del logaritmo approssimandolo con Taylor


Fra90
15-01-2010, 12:50
Ciao, io dovrei creare un programma C che mi calcoli il ln(1+x) inserendo x da tastiera e approssimando la funzione mediante il polinomio di Taylor. Ho fatto questo codice ma non mi approssima il valore in modo corretto. In particolare secondo me c'è un errore nel calcolo degli addendi del polinomio x^3/3, x^4/4....
Il codice che ho scritto è questo, grazie mille in anticipo

/*Scrivere un programma C++ che realizza un'approssimazione polinomiale (facendo uso del polinomio di Taylor con x0=0) della funzione
log(1+x) che sia accurata entro la tolleranza acquisita da tastiera per ogni x appartenente all'intervallo(0;1/2).
Considerare per il criterio di arresto il modulo dell'errore relativo.*/


#include<stdio.h>
#include<stdlib.h>
#include<math.h>

double leggix();
double leggieps();
double ln(double x, double eps);
void stampa(double, double);

main()
{
double x, eps, app;

x=leggix();

eps=leggieps();

app=ln(x, eps);

stampa(x, app);

system("PAUSE");
return 0;
}

double leggix()
{
double x;

do
{
printf("\n CALCOLO DELLA FUNZIONE ln(1+x)\n\n");

printf("\n Quanto vale il parametro x= ");
scanf("%lf", &x);
}
while((x<0)&&(x>1/2));

return x;
}


double leggieps()
{
double eps;

printf("\n\n Inserire la tolleranza richiesta eps=");
scanf("%lf", &eps);

return eps;
}


double ln(double t, double eps)
{
double delta=0, ln=t, pot=t; int sign=1, cont=1;



do
{
sign=-sign;

cont++;

pot=pot*t;

delta=sign*pot/cont;

ln+=delta;
}
while(fabs(delta/ln)>eps);

return ln;
}


void stampa(double x, double app)
{
printf("\n Il risultato finale e' ln(1+%lf)=%lf \n\n", x, app);

printf("\n La libreria matematica dice ln(1+%lf)=%lf\n\n",x, log(1+x));

return;
}

YuYevon
15-01-2010, 13:13
Innanzitutto qui c'è un errore logico:



do {
printf("\n CALCOLO DELLA FUNZIONE ln(1+x)\n\n");

printf("\n Quanto vale il parametro x= ");
scanf("%lf", &x);
}
while ((x < 0) && (x > 1 / 2));


la condizione del while è errata, così com'è risulterà sempre falsa perché nessun numero potrebbe essere < 0 e > 1/2. Devi sostituire && con II



while((x < 0.) || (x > 0.5));


ti ho anche eliminato 1/2: la divisione 1/2 è tra interi, e dà come risultato l'intero 0, non 0.5.

Fatto questo, con parametri x compresi tra 0 e 0.5 ottengo risultati corretti:



CALCOLO DELLA FUNZIONE ln(1+x)


Quanto vale il parametro x= 0.3


Inserire la tolleranza richiesta eps=0.001

Il risultato finale e' ln(1+0.300000)=0.262340


La libreria matematica dice ln(1+0.300000)=0.262364



CALCOLO DELLA FUNZIONE ln(1+x)


Quanto vale il parametro x= 0.4


Inserire la tolleranza richiesta eps=0.000001

Il risultato finale e' ln(1+0.400000)=0.336472


La libreria matematica dice ln(1+0.400000)=0.336472


C'è forse qualcosa che non ho compreso?

Fra90
15-01-2010, 14:45
E' vero, che stupida a non aver visto quell'errore prima, mi ci sono rotta un sacco la testa. Andando a correggere quella cosa, mi da il risultato corretto!!!!!!
Hai compreso perfettamente la traccia dell'es e hai risolto il mio problema, quindi grazie mille!!!!!!

:ciauz: :ciauz:

LeleFT
15-01-2010, 16:52
PS: quando si posta del codice, si devono usare i tag CODE, come ha correttamente fatto YuYevon.

Vedi Regolamento interno, punto 6, per maggiori indicazioni in merito.


Ciao. :ciauz:

Loading