[Frage] Stack-Overflow in Algorithmus
-
Hallo,
ich habe mich gestern mal hingesetzt, um einen Algorithmus zur Nullstellensuche via Intervallschachtelung zu implementieren. Der läuft auch bei den meisten Testfunktionen ohne Schwierigkeiten, mag aber die Funktion f(x) = cos(x) offenbar nicht so gerne.
Im Folgenden erstmal mein Source-Code (ich bin blutiger Anfänger, daher bin ich generell für Verbesserungsvorschläge dankbar)
#include <stdio.h> #include <math.h> #include <iostream> using namespace std; double funktionsberechnung(double x) // Funktion, die den Funktionswert einer beliebigen Funktion f(x) zurückgibt. { double y = 0; // Deklaration der Funktionswert-Variablen y = cos(x); // y = log(x); // y = (1/x)*cos(x); return y; } double intervallschachtelung(double x_u, double x_o) { double intervall = 1.e-6; double nullstelle = (x_u + x_o)/2; // Mittelwertbildung der Intervallgrenzen. if(fabs(funktionsberechnung(nullstelle)) < intervall) return nullstelle; if(funktionsberechnung(nullstelle) < 0) nullstelle = intervallschachtelung(nullstelle, x_o); else nullstelle = intervallschachtelung(x_u, nullstelle); return nullstelle; } int main() { double pi = 4*atan((double)1.0); // Pi definieren double x_u = 1; // Untere Intervallgrenze double x_o = pi; // Obere Intervallgrenze cout << "Nullstelle bei: " << intervallschachtelung(x_u, x_o) << "\n"; return 0; }Ich möchte die Nullstelle von f(x) = cos(x) im Intervall x=1...pi bestimmen, das Programm produziert dabei aber einen Stack-Overflow. Wo liegt mein Fehler? Mit den anderen beiden, auskommentierten mathematischen Funktionen, funktioniert es einwandfrei in vorgegebenen Intervallen.
Viele Grüße
-
Hast du mal versucht, deinen Algorithmus schrittweise von Hand nachzuvollziehen?
-
Der Kosinus sinkt in diesem Bereich. Die Prüfung
if(funktionsberechnung(nullstelle) < 0)ist also genau falsch herum.
-
if(fabs(funktionsberechnung(nullstelle)) < intervall) return nullstelle;Normalerweise wird es an der Intervallbreite festgemacht.
if(funktionsberechnung(nullstelle) < 0) nullstelle = intervallschachtelung(nullstelle, x_o); else nullstelle = intervallschachtelung(x_u, nullstelle);Normalerweise wird der Funktionswert vom linken bzw. rechten Intervallrand mit der Mitte verglichen.
-
Hi,
ich habe das Problem lösen können und wollte mich nur noch schnell bei den Hilfestellern bedanken!
Grüße
-
Und wie ist die Lösung des Problems?
Komme trotz Kommentaren nicht weiter
-
Erstell einen Thread mit einer klaren Frage und relevantem Code, anstatt einen Uraltthread auszugraben, der niemanden mehr interessiert, bloß weil er irgendetwas mit Stack-Overflow zu tun hat.