def __do_newton(self, f: sym.Function, point: float): """ :param f: Funktion deren Nullpunkt gesucht wird :param point: Punkt zu der die Tangente gesucht wird :return: Nullpunkt von der Tangente """ # Tangente erstellen tangente: sym.Function = f.evalf(subs={self.__symbol: point}) + self.__ableitung.evalf( subs={self.__symbol: point}) * (self.__symbol - point) # Gleichung fuer die Bestimmung des Nullpunktes aufstellen gleichung = sym.Eq(tangente, 0) # Gleichung aufloesen result = sym.solve(gleichung) # Nullstelle gefunden if len(result) > 0: a = result[0] # [optionale] visualisierung des Zwischenergebnisses if self.__doVisual: text = 'Nr:' + str(self.__tries + 1) + " Xn:" + printfloat( a) + " Abw: " + printfloat(self.__evaluate(a)) self.__visualisiere(tangente, style='--', description=text) return a # Keine Nullstelle gefunden -> Verfahren ist gescheitert else: exeption = NewtonCalculateExeption(point) if self.__doVisual: plt.text(0, 0, exeption.value) plt.show() raise exeption
def solve(self, f: sym.Function, start: float): """ Sucht den nachsten Nullpunkt der uebergebenen Funktion vom gegebenen Starpunkt aus :param f: funktion :param start: startpunkt :return: duple (ergebnis, abweichung zu 0) """ if self.__doVisual: self.__visualisiere(f, style='r', description='f(' + str(self.__symbol) + ')=' + str(f)) self.__ableitung = f.diff(self.__symbol) self.__funktion = f self.__tries = 0 current_point = start current_div = abs(f.evalf(subs={self.__symbol: current_point})) # wiederholen bis genauigkeit erreicht oder das Maximum der Versuche erreicht ist while current_div > self.__precision and self.__tries < self.__max_tries: current_point = self.__do_newton(f, current_point) result = self.__evaluate(current_point) current_div = abs(result) self.__tries = self.__tries + 1 if self.__doVisual: self.__visual_result() return current_point, current_div