Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - bisezione di sen(x)
Forum - C/C++ - bisezione di sen(x)

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
matteog (Normal User)
Pro


Messaggi: 149
Iscritto: 10/04/2009

Segnala al moderatore
Postato alle 11:04
Lunedì, 28/12/2009
salvè,devo svolgere un esercizio per le vacanze in cui dati in ingresso a e b, ovvero il valore massimo e minimo di un intervallo e n il numero di volte che devo ripetere l'azione su tale intervallo.Mediante il metodo di bisezione devo trovare i valori per cui la funzione sen(x) si annulla :

Ultima modifica effettuata da matteog il 28/12/2009 alle 23:25
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 13:39
Lunedì, 28/12/2009
non ho studiato approfonditamente il tuo codice ma ho notato subito un grossolano errore.

Il metodo di bisezione è una tecnica di approssimazione, in quanto tale non troverà mai il valore esatto della tua incognita (in questo caso l'angolo che azzera il seno). Aggiungi inoltre il fatto che i calcoli in floating point sono soggetti a numerosi arrotondamenti ed approssimazioni, quindi il classico "sen( x ) == 0" non funzionerà MAI!

devi invece predisporre un intervallo con un range di errore ammissibile ragionevole.

ad esempio potremmo considerare accettabile un valore compreso tra -0.001 e +0.001

in questo caso bisognerà confrontare sen( x ) con un range, quindi sarebbe, in termini matematici:

Codice sorgente - presumibilmente Plain Text

  1. -0.001 < sen(x) < +0.001



da cui

Codice sorgente - presumibilmente Plain Text

  1. |sen(x)| < 0.001



quindi il test da effettuare sarebbe:

Codice sorgente - presumibilmente C/C++

  1. if (abs(sen(x)) < 0.001){ ... }



Puoi anche parametrizzare il range usando una variabile al posto di 0.001.

Ovviamente, nel test di maggiore/minore dovrai usare al posto dello zero, lo stesso valore 0.001 (nel caso di "maggiore di") e -0.001 (nel caso di "minore di").

Ultima modifica effettuata da TheKaneB il 28/12/2009 alle 13:41
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:56
Lunedì, 28/12/2009
La ricerca per bisezione è impostata in modo errato.

Bisogna assicurarsi sempre che agli estremi vi siano risultati opposti.

Quì ho riportato il programma:

#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;


int main()
{
     double a,b,c,errore=0.00005;
     double sena,senb,senc;
     int n;
     cout<<"inserisci a:"<<endl;//inserimento degli intervalli:[a,b] e del numero di volte che devo eseguire la bisezione
     cin>>a;
     cout<<"inserisci b:"<<endl;
     cin>>b;
     cout<<"inserisci n:"<<endl;
     cin>>n;
     sena=sin(a);
     senb=sin(b);
     for(int i=0;i<n;i++)
     {
          c=(a+b)/2.0;
          senc=sin(c);
          if (i==n-1)   cout<<"Limite di "<<n<<" iterazioni superato!\na= "<<a<<" b= "<<b<<endl;
          if (sena*senb>0)
          {
            cout<<"\nNon esistono radici in questo intervallo!\n\n";
            i=n; // uscita dal ciclo.
          }
          if(fabs(senc)<errore)
          {
                cout<<"la radice cercata è="<<c<<endl;
                i=n; // uscita dal ciclo.
          }
          else
          {
                if(sena*senc<0)
                {
                     b=c;
                     senb=senc;
                }
                else
                {
                     a=c;
                     sena=senc;
                }
          }
     }

system("pause");

return 0;
}

Ultima modifica effettuata da il 28/12/2009 alle 14:59
PM Quote
Avatar
matteog (Normal User)
Pro


Messaggi: 149
Iscritto: 10/04/2009

Segnala al moderatore
Postato alle 16:08
Lunedì, 28/12/2009
vi ringrazio molto finalmente il programma funziona siete grandi!grazie mille

PM Quote
Avatar
matteog (Normal User)
Pro


Messaggi: 149
Iscritto: 10/04/2009

Segnala al moderatore
Postato alle 16:13
Lunedì, 28/12/2009
mi sono accprto dui una cosa però:
se io inserisco
due valori grandi tipo -10 e 20 con n=100 perchè non stampa tt i puno in cui sen x và a 0 in quel periodo?

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:17
Lunedì, 28/12/2009
Ricordati che:

1° Il metodo della bisezione, funziona solo nel caso vi sia una sola radice nell'         intervallo dato.

2° La funzione sin(x) restituisce il seno dell' angolo x espresso in redianti.


Per la conversione:
   radianti=gradi sessagesimali*0.0174533
   gradi sessagesimali=radianti*57.2958

Buone feste!

Ultima modifica effettuata da il 28/12/2009 alle 17:19
PM Quote
Avatar
matteog (Normal User)
Pro


Messaggi: 149
Iscritto: 10/04/2009

Segnala al moderatore
Postato alle 17:20
Lunedì, 28/12/2009
daccordo un ultima cosa per far si che nel caso in cui vengano inseriti -4 -2 e n=100 come posso fare per far si che mi restituisca un valore più preciso rispetto al pgreco perchè qui lo arrotonda subito a 3,1416 e si ferma me lo sapete dire?

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:36
Lunedì, 28/12/2009
Riduci il valore della variabile errore, aumenta il numero di cicli.

Eventualmente aumenta le cifre da visualizzare, con setprecision(n).

Per utilizzare questa funzione devi incluudere la libreria <iomanip>

Es.:

int main()
{
....
  double c=4.9874;
  cout<<setprecision(3)<<c;
...
}

Visualizzerà 4.99

PM Quote
Avatar
matteog (Normal User)
Pro


Messaggi: 149
Iscritto: 10/04/2009

Segnala al moderatore
Postato alle 19:12
Lunedì, 28/12/2009
ok tanks

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo