Beispiel #1
0
    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
Beispiel #2
0
    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