Non so quale sia il problema, il programma non va avanti

di il
1 risposte

Non so quale sia il problema, il programma non va avanti

Sono una studentessa di un liceo, stiamo facendo le basi del linguaggio C.
La richiesta dell'esercizio è quella di creare un programma in C che risolva un'equazione col metodo della bisezione.
Ho impostato il programma in questo modo, ma funziona solo quando gli pare.
Ad esempio, io pongo il grado a 2 e metto coefficienti 1 e 2, avendo quindi l'equazione x^2+2x=0. Nel momento in cui metto intervallo (-1;-5) mi trova la soluzione -2, se al contrario metto intervallo (-5;-1) (che ha comunque più senso visto che -5<-1) non funziona. Si blocca proprio il programma prima di arrivare alla fine del codice. Idem se metto valori intervallo tipo (-1,2)..

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

int main()
{
    int x=0;
    int i=0;
    float vett[100];
    int n=1;
    float a=0;
    float b=0;
    float fa=0; /*funzione in a*/
    float fb=0; /*funzione in b*/
    float m=0;
    float fm=0; /*funzione in m*/
    float fm_1=0;
    float prod;

    printf("Inserire Il grado della funzione ");
    scanf("%d",&x);

    for(i=x; i>0; i--)
    {
        printf("Inserisci il coefficiente n %d: ",n);
        n+=1;
        scanf("%f",&vett[i]);
    }

    printf("\nInserisci l'estremo sinistro a dell'intervallo: ");
    scanf("%f",&a);

    printf("Inserisci l'estremo destro b dell'intervallo: ");
    scanf("%f",&b);

     for(i=x; i>0; i--)
     {
         fa+=vett[i]*pow(a,i);
         fb+=vett[i]*pow(b,i);
     }

     printf("\nLa funzione in a vale %f",fa);
     printf("\nLa funzione in b vale %f",fb);

     prod=fa*fb;

     if((fa*fb)<0)
     {
         do {
            fa=0;
            fb=0;
            fm_1=0;

            for(i=x; i>0; i--)
            {
                fa+=vett[i]*pow(a,i);
                fb+=vett[i]*pow(b,i);
            }

            m=(a+b)/2;

            for(i=x; i>0; i--)
            {
               fm_1+=vett[i]*pow(m,i);
            }

            if((fm*fa)>0)
                a=m;
            else
                b=m;

            fm=fm_1;
            }
        while(fm!=0);

      printf("\nLa soluzione nell'intervallo e' x=%f\n",m);

    }
     else
     {
       printf("\nNon ci sono soluzioni nell'intervallo inserito\n");
     }

    return 0;
}

1 Risposte

  • Re: Non so quale sia il problema, il programma non va avanti

    
    while(fm!=0);
    
    Il processo potrebbe durare all'infinito, quindi devi scegliere una tolleranza
    
    while(fm < -0.001 || fm > 0.001);
    
    La tolleranza serve anche a tener conto del fatto che i float e i double non sono a precisione infinita, quindi potrebbe non tornarti zero spaccato nei calcoli
Devi accedere o registrarti per scrivere nel forum
1 risposte