Numerisch stabile Polynom(modulo)division



  • Hallo,
    ich habe eine Polynomdivision nach dem bekannten Schema implementiert um mithilfe Sturmscher Ketten und einem numerisches Verfahren (http://en.wikipedia.org/wiki/Brent's_method) die Nullstellen eines Polynoms beliebigen Grades zu finden. Im Grunde interessiere ich mich nur für den Rest der Polynomdivision. Leider werden schon bei einem Polynom 10. - 15. Grades Rechenfehler deutlich, die zu "verschwundenen" Nullstellen führen. Dass es viele Rechenfehler gibt ist auch verständlich wenn man sich die Subtraktionen in meinem naiven Code ansieht (coefficients[n] ist der Koeffizient zu x^n, scalar ist ein double):

    for(int i = get_order(); i >= other.get_order(); i--)
    {
      scalar x = coefficients[i] / other.coefficients.back();
      for(int j = other.get_order(); j >= 0 ;j--)
      {
        coefficients[i + j- other.get_order()] -= other.coefficients[j] * x;
      }
    }
    coefficients.pop_back();
    

    In coefficients sollte am Ende der Rest der Polynomdivision stehen. Die Frage lautet: Wie ist die Polynomdivision zu implementieren, damit der Rechenfehler nicht zu groß wird? Für die Sturmsche Kette muss zu allem Überfluss das Verfahren wiederholt auf das vorangegangene Ergebnis angewandt werden. Ich bin vor den Jenkins-Traub-Algorithmus zurückgeschreckt, weil ich ein Verfahren brauche, das immer konvergiert und in allen Implementationen die ich bisher gesehen habe irgendwo das Newton-Verfahren benutzt wird (dass nicht immer konvergiert).
    Grüße,
    geloescht


Anmelden zum Antworten