Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    4

    calcolo del logaritmo approssimandolo con Taylor

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

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Innanzitutto qui c'è un errore logico:

    codice:
       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

    codice:
    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?
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    4
    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!!!!!!


  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,317

    Moderazione

    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.