Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » rekursive funktion stoppen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.06.2013, 11:45 Uhr
chiral



Hallo zusammen!

Ich soll ein Programm schreiben, das mithilfe der Bisektionsmethode die Nullstelle einer streng monoton steigenden Funktion wie folgt berechnet:
1. Setzel=a und r=b.
2. Teste, ob [l, r] eine Nullstelle entha ̈lt. Wenn nicht: Abbruch.
3. Teste, ob r − l < ε ist. Wenn ja, dann ist das Lo ̈sungsintervall gefunden.
4. Sonst teile [l, r] in der Mitte und setze das Verfahren mit beiden Teilintervallen rekursiv bei (2) fort.
Das soll mit folgender signatur geschehen:
void bisection(std::vector <double >& interval , double eps);

Mein Versuch sieht nun so aus:


C++:
void Tbisection(std::vector <double >& interval, double eps) {
    double l;
    double r;
    l = interval[0];
    r = interval[1];
    cout << "l = " << l << endl;
    cout << "r = " << r << endl;
    //cout << "f(l) = " << f(l) << endl;
    //cout << "f(r) = " << f(r) << endl;
        if (f(l) < 0 && f(r) > 0) {
            if (r - l < eps) {
                interval[0] = l;
                interval[1] = r;
                cout << "Die Nullstelle liegt im Interval: [" << interval[0] << "," << interval[1] << "]" << endl;
                return;
            }
            else {
                double a = (r - l)/2;
                vector<double> inta(2);
                inta[0] = l + a;
                inta[1] = r;
                Tbisection(inta, eps);
                vector<double> intb(2);
                intb[0] = l;
                intb[1] = r - a;
                Tbisection(intb, eps);
            }
        }
        else {
            cout << "Das Interval enthält keine Nullstellen.";
        }
}



Mein Problem ist nun, dass die Funktion das Interval zwar findet, jedoch die Berechnung nicht stoppt sondern die Rekursion weiterführt.
Vielleicht kann mir jemand weiterhelfen..

Dieser Post wurde am 13.06.2013 um 14:14 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.06.2013, 18:37 Uhr
ao

(Operator)


Hi, also bei mir funktioniert das. Hier mein (vollständiger) Code. Ich habe in der Logik deiner Funktion nichts verändert, nur die Ausgaben umformatiert, und eine Funktion f und eine main dazugelegt:


C++:
#include <vector>
#include <iostream>

double f (double x)
{
    return x;
}

void Tbisection(std::vector <double >& interval, double eps) {
    double l;
    double r;
    l = interval[0];
    r = interval[1];
    std::cout << "interval = [ " << l << " | " << r << " ] " ;
        if (f(l) < 0 && f(r) > 0) {
            if (r - l < eps) {
                interval[0] = l;
                interval[1] = r;
                std::cout << "<<<=== Treffer" << std::endl;
                return;
            }
            else {
                std::cout << "++++++ Halbieren" << std::endl;
                double a = (r - l)/2;
                std::vector<double> inta(2);
                inta[0] = l + a;
                inta[1] = r;
                Tbisection(inta, eps);
                std::vector<double> intb(2);
                intb[0] = l;
                intb[1] = r - a;
                Tbisection(intb, eps);
            }
        }
        else {
            std::cout << "------ Keine Nullstelle." << std::endl;
        }
}

int main(int argc, char* argv[])
{
    std::vector<double> interval (2);
    interval[0] = -2;
    interval[1] = 1;
    Tbisection (interval, 0.1);
    return 0;
}




Dass er nach dem Treffer nicht sofort abbricht, liegt daran, dass jeder Halbierungsschritt die Bisektion zweimal aufruft, und das muss bei den offenen Schachtelungen zuerst abgearbeitet werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: