Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383

    [c]metodo di calcolo per le radici

    E' da un bel po che devo scrivere un programma che mi calcoli la radice cubica di un qualsiasi float inserito dall'utente a tempo di esecuzione.

    Allora sono partito dall'idea di usare il metodo dicotomico,in questo modo:

    x e' la radice cubica del numero y ( x = y^(1/3) )
    Elevo entrambi i membri al cubo: x^3 = y
    e quindi arrivo all'equazione x^3 -y = 0
    con y come parametro e parto da qui.

    Definisco una costante ERR:

    #define ERR 0.00001

    e dichiaro:

    float a,b,m,y;
    float fa,fb,fm;

    Una bozza di codice potrebbe essere questa:
    codice:
    printf("Inserire y: ");
    scanf("%f",&y);
    /* validita a e b */
    do {
           printf("Inserire a: ");
           scanf("%f",&a);
           printf("Inserire b: ");
           scanf("%f",&b);
           fa=a*a*a-y; /* calcolo di f per x=a */
           fb=b*b*b-y; /* calcolo di f per x=b */
    } while (fa*fb>0);
    /* calcolo zero f */
    do {
           m=(a+b)/2;
           fm=m*m*m-y; /* calcolo di f per x=m */
           if (fm!=0) {
               fa=a*a*a-y; /* calcolo di f per x=a */
               fb=b*b*b-y; /* calcolo di f per x=b */
               if (fa*fb<0) b=m; else a=m;
           }
    } while (fabs(fm)>ERR);
    nel modello da cui ho tratto spunto e che serviva a trovare lo zero di una funzione, nel blocco che fa riferimento
    a if (fm!=0) come ultima istruzione c'era un secondo fm=m*m*m-y; /* calcolo di f per x=m */
    che ho eliminato perche' secondo me non aveva senso.

    Avevo fatto anche un disegno a mano libera, per capire come doveva essere impostato il programma.
    Il mio dubbio riguarda principalmente la parte sulla validita' di a e b:
    cioe' l'utente come fa a capire come mettere gli a e b giusti in modo da ottenere gli fa e fb discordi, per poi cosi cominciare con il metodo dicotomico?
    C'e' un modo carino per risolvere questa cosa anche dal punto del dialogo del programma con l'utente?
    Vi ringrazio se vorrete rispondere.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Io per quel controllo scrissi una brevissima funzione che eseguiva il prodotto f(a)*f(b) e se questo era > 0 restituiva un valore nullo al main, nel quale c'era un ciclo iterativo di immissione simile a quello che fai tu... insomma al massimo puoi implementare questa funzione per una questione di eleganza, o forse meglio ancora una macro visto che dichiarare una funzione solo per un'istruzione forse è un po' esagerato.

    Di meglio credo non si possa fare.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383
    Di quel codice credo di aver capito poco.
    Si usa una libreria e delle istruzioni che non conosco.

    Non ho capito il ruolo di x0 ed y(l'espressione che contiene) in particolare.
    Percio' non ho capito come funziona il programma.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Parli della

    double sqr3(const double x)

    ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383
    double sqr3(const double x)
    {
    double x0, y;
    double fx0, D1fx0;

    si non ho capito cosa c'entri x0 con l'y di :
    x e' la radice cubica del numero y ( x = y^(1/3) )
    Elevo entrambi i membri al cubo: x^3 = y
    e quindi arrivo all'equazione x^3 -y = 0
    con y come parametro e parto da qui.

    ma soprattutto questa mi e' oscura:
    y = x0 - (fx0 / D1fx0);

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Hai letto la spiegazione dell'algoritmo ?

    "... l'algoritmo inizia scegliendo un x0 nel dominio della funzione, dove la derivata sia diversa da zero, nel caso della radice cubica di x puoi scegliere x0=x ..."
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Ma usare pow?
    codice:
    #include <math.h>
    /* ... */
    double radiceCubica = pow(numero,1/3);
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383
    infatti per la funzione nel mio caso intendo f =x^3 -y

    x0 non e' y vero,non c'entra niente?
    in questo caso quale sarebbe f?

    @mitaly, il programma deve fare in modo di calcolare la radice cubica di un numero.Se dovessi usare questa funzione pow(che dovrei scrivere) il main si ridurrebbe a

    printf("%f",pow(...));

  10. #10
    Originariamente inviato da cristianc
    @mitaly, il programma deve fare in modo di calcolare la radice cubica di un numero.Se dovessi usare questa funzione pow(che dovrei scrivere) il main si ridurrebbe a

    printf("%f",pow(...));
    Appunto, cosa c'è di meglio? (scherzo, ho capito)
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.