PDA

View Full Version : [C++] esercizio metodo di bisezione.


sici_90
09-03-2015, 19:56
salve a tutti,
devo scrivere un progemaa che calcoli gli zeri di un polinomio con ilmetodo di bisezione.
questo è quello che ho fatto io:
#include <iostream>
#include<cmath>

using namespace std;

int main()
{float a, b, c, d, estrinf, estrsup, app, funzione1, funzione2, med, x, y;
cout<< "inserisci il coefficiente del termine di terzo grado"<<endl;
cin>>a;
cout<< "inserisci il coefficiente del temrine di secondo grado"<<endl;
cin>>b;
cout<< "inserisci il coefficiente del temrine di primo grado"<<endl;
cin>>c;
cout<< "inserisci il termine noto"<<endl;
cin>>d;
cout<< "inserisci l'estremo inferiore"<<endl;
cin>>estrinf;
cout<< "inserisci l'estremo superiore"<<endl;
cin>>estrsup;
cout<< "inserisci l'approssimazione"<<endl;
cin>>app;
if(estrinf>estrsup){
cout<< "gli estremi inseriti non sono corretti"<<endl;

}
else{
app=app;
med=(estrsup+estrinf)/2;
x=med;
y=estrinf;
funzione1=a*pow(x,3)+b*pow(x,2)+c*x+d;
funzione2=a*pow(y,3)+b*pow(y,2)+c*y+d;
while(funzione1<app||funzione1<-app){

if(funzione1*funzione2>0){
x=estrinf;
estrsup=estrsup;
}
else{
estrinf=estrinf;
x=estrsup;
}
}
cout<< "lo zero della funzione è : "<<x<<endl;}

return 0;}

il programma "funziona" nel senso che non dà errori.
se gli estremi non sono accettabili il programma si ferma. e fi qui tutto bn.
però se gli estremi sono accettabili mi dà come risultato sempre la media tra essi ... come se non leggesse il ciclo while.

potreste darmi una mano?
grazie!

sottovento
12-03-2015, 08:07
In effetti non mi sembra che calcoli il metodo della bisezione.
Prima di tutto: ovviamente devi rispettare delle condizioni iniziali relative alla monotonicita' della funzione nell'intervallo considerato. Penso siamo d'accordo su questo, giusto?

Alcune cose:

while(funzione1<app||funzione1<-app){


In questo pezzo di codice avresti voluto controllare se il valore di funzione1 e' zero (a meno dell'approssimazione). Corretto? In realta' le cose non vanno proprio cosi'.
In linguaggio naturale: se il valore assoluto di funzione1 e' minore di app, allora ho trovato il valore che mi serve.

Oltretutto a te serve la condizione opposta: se il valore assoluto di funzione1 e' maggiore di app, allora resta nel ciclo e fai qualche altro tentativo.


if(funzione1*funzione2>0){
x=estrinf;
estrsup=estrsup;
}
else{
estrinf=estrinf;
x=estrsup;
}

Questo pezzo di codice funziona solo se la funzione e' monotona non decrescente