PDA

Visualizza la versione completa : [C++] programma per calcolo zeri con la bisezioni, problemi con il ciclo do while


twinkast
04-04-2011, 23:23
salve a tutti, devo scrivere un programma in c++ che calcoli gli zeri di una funzione con il metodo di bisezione utilizzando il ciclo do while, e, sebbene il procedimento da me usato mi sembri corretto, quando mando il programma, in particolare durante il ciclo, mi si arena....

questo è il programma:

#include <iostream>
#include <math.h>
using namespace std;
int main(){
//dichiarazione variabili
double vs; double zero; double a1 ; double a2 ; double am; double da; double a; double b; double c; double d; double x1; double x2; double xm; double f; int s;
//dichiarazione tipo di programma in cout
cout <<"questo programma trova gli zeri di una funzione del tipo a*e^bx + cx + d = 0 con il metodo di bisezione, una volta noti gli estremi dell'intervallo dove essa assume valori opposti" <<endl;
cout <<"inserire i coefficenti a, b, c e d, nell'ordine" <<endl;
cout <<"a=" ; cin >> a ; cout <<"b=" ; cin >> b ; cout <<"c=" ; cin >> c ; cout <<"d=" ; cin >> d ;
cout <<"inserire gli estremi dell'intervallo dove la funzione assume segni opposti, con continuita'" <<endl;
cin >> a1; cin >> a2;
//controllo estremi if (a1>a2) {f=a1; a1=a2; a2=f;}
//calcolo valore funzione agli estremi zero=0;
f=b*a1;
x1=a*exp(f)+c*a1+d;
if (x1==0){ cout <<"la funzione ha il suo zero in " <<a1 <<endl; system ("pause"); return 0;}
f=b*a2;
x2=a*exp(f)+c*a2+d;
if (x2==0){ cout <<"la funzione ha il suo zero in " <<a2 <<endl; system ("pause"); return 0;}
//chiediamo la precisione richiesta cout
<<"inserire il numero di cifre dopo la virgola che si desidera ottenere per il risultato" <<endl;
cin >>s ;
vs=pow(10,-s);
cout <<vs <<endl;
da=a2-a1;
if (da<zero) {da=-da;} cout <<da <<endl;
//se sono discordi, allora...
if (x1<zero) {if (x2>zero) {do {cout <<"ciclo" <<endl;
am=(a1+a2)/2;
f=b*am;
xm=a*exp(f)+c*am+d;
if (xm=0){ cout <<"la funzione ha il suo zero in " <<am <<endl; system ("pause"); return 0;}
if (xm<zero){a1=am;}
if (xm>zero){a2=am;}
f=b*a1;
x1=a*exp(f)+c*a1+d;
f=b*a2;
x2=a*exp(f)+c*a2+d;
da=a2-a1;
if (da<zero) {da=-da;}
cout <<am;
}while (da>vs);
cout <<"la funzione ha zero circa tra "; cout <<a1; cout <<" e "; cout <<a2; cout <<endl;
}}
if (x1>0&&x2<0) {cout <<"sono di qua" <<endl; }

system ("pause"); return 0; }

tralasciando che è incompleto e che ho messo un paio di cout "inutili", come controllo, durante il ciclo scopro che non mi sostituisce a1 o a2, gli etremi dell'intervallo, con il valore centrale, e quindi procede con il ciclo all'infinito......

potreste darmi una mano?

credo che il problema sia qui:

if (xm<zero){a1=am;}
if (xm>zero){a2=am;}

(ah, ho dovuto aggiungere la variabile zero, con valore 0, perchè se facevo qualcosa <, o > , di 0 non me lo prendeva....qualcuno saprebbe spiegarmi perchè? è forse perchè le variabili in questione sono del tipo double?)

qualcuno ha qualche suggerimento per far "sputare" fuori il risultato con la precisione richiesta?

grazie

Loading