Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    15

    [C] Ricerca zeri con bisezione.. loop infinito

    Sono sempre io
    Ho un piccolo problemino... ho scritto una funzione per la ricerca degli zeri di una funzione data per mezzo del metodo di bisezione; facendo il tutto con un ciclo while che continuasse finché l'intervallo dx=b-x fosse stato maggiore o uguale di una precisione da me fissata, non ho avuto problemi.
    Ma in teoria l'algoritmo non dovrebbe funzionare anche se come unica condizione nel ciclo while indico che la funzione calcolata nel punto x sia diversa da zero? Cioè continua a ciclare finché f(x)!=0, e si ferma solo quando f(x)=0, cioè quando x è la radice cercata.
    Il codice è questo:
    codice:
    /* SUBROUTINE BISEZIONE */
    float *bisezione(float *bisez, float a, float b, float dx, float radice, float precisione)
    {
      /* PER FAR RITORNARE ALLA FUNZIONE DUE VALORI FLOAT ALLOCO DINAMICAMENTE UN ARRAY DI DUE FLOAT */
      bisez=(float*) malloc(2*sizeof(float));
      radice=(a+b)/2;
      while (((fabs(funzione(radice)))!=0))
      {
        printf("\nf(radice)= %1.1f; x= %1.1f; funzione(a)=%1.1f; funzione(x)=%1.1f;",fabs(funzione(radice)),radice,funzione(a),funzione(radice));
        if ((funzione(a)*funzione(radice))<=0)
        {
          printf("\nfunzione(a)*funzione(x)<=0\n");
          /*a=a;*/
          b=radice;
        } else {
          printf("\nfunzione(x)*funzione(b)>0\n");
          a=radice;
          /*b=b;*/
        }
        dx=b-a;
        radice=(a+b)/2;	/*dopo n interazioni si considera questa come radice*/
      } 
      bisez[0]=dx;
      bisez[1]=radice;
    return bisez;
    }
    E la funzione di cui trovare gli zeri in questo caso è:
    codice:
    /* FUNZIONE DA STUDIARE */
    float funzione(float x)
    {
    return (-1-pow(x,2)+4*sqrt(x));
    }
    Dov'è che sbaglio? :-(
    Continua a ciclare all'infinito scrivendo sempre:
    codice:
    funzione(x)*funzione(b)>0
    
    f(radice)= 0.0; x= 0.1; funzione(a)=-0.0; funzione(x)=-0.0;
    funzione(x)*funzione(b)>0
    
    f(radice)= 0.0; x= 0.1; funzione(a)=-0.0; funzione(x)=-0.0;
    funzione(x)*funzione(b)>0
    
    f(radice)= 0.0; x= 0.1; funzione(a)=-0.0; funzione(x)=-0.0;
    funzione(x)*funzione(b)>0
    ...

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    15
    Ok mi sono risposta da sola
    Grazie lo stesso :P

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466

    Moderazione

    Originariamente inviato da Gnugnu
    Ok mi sono risposta da sola
    Grazie lo stesso :P
    In genere, lo spirito del forum suggerisce di riportare la soluzione trovata, in modo che possa essere utile a chiunque dovesse trovarsi ad affrontare il medesimo problema.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.