Einige Anmerkungen:
Abbruchbedingung(en):
gkuhl hat schon etwas zum float-Problem gesagt. Darüber hinaus:
Die (ungefähre) Gleichheit der Funktionswerte ist zwar in sofern ein sinnvolles Abbruchkriterium, als die Regula Falsi sich in dem Fall tot läuft, aber den Wert von x1 dann als Lösung zurückzuliefern ist nicht korrekt. Nimm als Beispiel mal f(x) = 5.
Falls tatsächlich für die beiden ersten Abbruchbedingungen x1 zurück zu liefern wäre, dann würde man statt if .. elif einfach schreiben:
Code: Alles auswählen
if x1 == x2 or funktion(x1) == funktion(x2): return x1
Das Einbinden eines Zählers ist möglich, allerdings sollte auch hier nicht einfach x3 zurückgeliefert werden, weil man überhaupt keine Information darüber hat, wie genau das Ergebnis denn nun ist.
Sinnvoller wäre es, einen Wert für die Genauigkeit an die Funktion zu übergeben (etwa 10^-6). Sollte diese Grenze nach, sagen wir, 30 Iterationen noch nicht erreicht sein, dann wird es vermutlich nichts mehr und statt eines Zahlenwertes sollte m.E. None oder False zurückgeliefert werden.
Rekursion:
Rekursion ist in Python nicht besonders performant. Die Regula Falsi lässt sich gut auch ohne Rekursion implementieren:
Code: Alles auswählen
x2, x1 = x2 - (x2 - x1) / float(funktion(x2) - funktion(x1)) * funktion(x2), x2