[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


  • Mod

    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.


Anmelden zum Antworten