Newton-Verfahren liefert nur 1 Wert

S

Speflisch

Gast
Hallo,
ich versuche, das Newton-Verfahren mit Java zu realisieren. Hierbei sollen nur Polynome angegeben werden, also sowas zum Beispiel:
x^5 - 4*x^4 + 7*x^3 + 3*x^2 + 0*x^1 + 5

Folgender Quellcode:
Java:
public class Graph
{
    double[] derivedKoeff;
    double[] koeff;
    int grad;
    double curNullstelle;
    
    public Graph(int grad, double[] koeff)
    {
        this.koeff = koeff;
        
        derivedKoeff = new double[grad + 1];
        
        for(int i = 0; i <= grad; i++)
        {
            derivedKoeff[i] = koeff[i] * (grad - i);
        }
        
        this.grad = grad;
        curNullstelle = 0;
    }
    
    private void CalcNextNullstelle()
    {
        double wert = 0;
        for(int i = 0; i <= grad; i++)
        {
            wert += koeff[i] * Math.pow(curNullstelle, grad - i);
        }        
        
        double derivedWert = 0;
        for(int i = 0; i <= grad - 1; i++)
        {
            derivedWert += koeff[i] * Math.pow(curNullstelle, grad - (i + 1));
        }
        
        curNullstelle -= wert / derivedWert;
    }
    
    // 4x^3 + 5x^2 + 2x + 1
    //sollte double[] sein
    public double Nullstellen()
    {
        double temp;
        do
        {
            temp = curNullstelle;
            
            CalcNextNullstelle();
        }
        while(Math.abs(temp - curNullstelle) > 0.000001);

         //WAS NOCH NICHT FUNKTIONIERT: Mehrere Nullstellen ausgeben. es geht immer nur eine
        
        return curNullstelle;
    }
}

An den Konstruktor wird der Grad des Polynoms übergeben und die Koeffizienten. Alle, inklusive Nullen.
Mit CalcNextNullstelle() wird die Formel aufgerufen und das nächste x berechnet:

f(xi)
xi+1 = xi - ——————
f'(xi)

Mit Nullstellen() wird das ganze automatisiert und auf 0.00001 Stellen genau gerechnet.

Nun mein Anliegen. Mein Problem ist, dass ich immer nur eine Nullstelle damit errechnen kann. Also wenn ich zum Beispiel eine Quadratische Funktion habe, welche den Graphen an 2 Stellen schneidet bekomme ich trotzdem immer nur eine Nullstelle geliefert. Habe schon probiert curNullstelle zu variieren, sprich den Startwert, aber hat auch nichts gebracht.

Gruß!
 

Landei

Top Contributor
Eine Nullstelle reicht aus!

Angenommen wir haben das Polynom x^3+7 x^2+7 x-15, und kennen die Nullstelle x=1. Dann können wir das Polynom durch (x-1) dividieren und erhalten x^2+8 x+15. Wenn du davon wieder eine Nullstelle findest, sagen wir x= -3, kannst du wieder durch (x+3) teilen und erhältst (x+5), was der Nullstelle x=-5 entspricht. Mit 1, -3 und -5 kennst du nun auch die Nullstellen des ursprünglichen Polynoms.

Einzelheiten zur Polynomdivision kennt Wikipedia.
 
S

Speflisch

Gast
Danke für den Gedanken.
Ich stelle es mir allerdings sehr schwer vor, die Polynomdivision zu realisieren. Das Programm sollte einfach und verständlich gehalten werden. Eine andere Möglichkeit gibt es nicht?
 

Landei

Top Contributor
Du musst ja nicht die allgemeine Polynomdivision implementieren, sondern nur für Nenner der Form (x+n), was nicht so schwer sein sollte. Warum das Newton-Verfahren hier "nicht richtig" funktioniert, kann ich so nicht sagen. Entweder mal mit irgendeiner Software die Kurven zeichnen lassen und schauen, wie sich dein Programm verhält, oder statt dem Newton-Verfahren etwas anderes verwenden, z.B. das einfachere Sekantenverfahren, das garantiert, dass eine Nullstelle zwischen den beiden Ausgangspunkten gefunden wird.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Newton Algorithmus Java Allgemeine Java-Themen 1
H Heron Verfahren Tail-rekursiv lösen Allgemeine Java-Themen 7
D RSA Verfahren - Erweiterter Euklidischer Algorithmus Allgemeine Java-Themen 4
T Programm Vigenere Verfahren Allgemeine Java-Themen 14
8u3631984 Argument Captor liefert NULL zurück Allgemeine Java-Themen 2
DiekleineRatte77 Schlüsselworte ANSI Konverter liefert UTF-8 Allgemeine Java-Themen 7
Arif Math.cos liefert komische Werte Allgemeine Java-Themen 8
I HTML einer Website auslesen liefert nur head Allgemeine Java-Themen 6
A Datentypen Long.valueOf liefert kein "L" am Ende Allgemeine Java-Themen 3
T Variablenübergabe liefert immer null Allgemeine Java-Themen 13
C Object.equals() liefert falschen Wert? Allgemeine Java-Themen 14
Q GregorianCalendar Methode add liefert komische Werte Allgemeine Java-Themen 3
T Datentypen ArrayUtils.indexOf( ... ) liefert -1 obwohl Wert scheinbar enthalten ist Allgemeine Java-Themen 15
T SimpleDateFormat.parse() liefert falschen Tag Allgemeine Java-Themen 2
T java.uil.Random liefert negative Werte Allgemeine Java-Themen 2
I newInstance() liefert null zurück Allgemeine Java-Themen 4
Z new Date() liefert falsche Uhrzeit Allgemeine Java-Themen 12
J Liefert new URL(String) gecachte Webseiten? Allgemeine Java-Themen 15
S HashMap containsKey liefert immer false zurück Allgemeine Java-Themen 15
M Kugelschnittberechnung liefert falsche Werte Allgemeine Java-Themen 4
A md5 liefert unterschiedliche Testsummen? Allgemeine Java-Themen 4
S FOP liefert fehlerhafte PDF Allgemeine Java-Themen 13
S instanceof liefert true, aber cast funktioniert nicht! Allgemeine Java-Themen 6
MasterEvil File.createTempFile liefert nur kurzen Pfad mit Tilde Allgemeine Java-Themen 3
M BufferedReader.read(char[] cbuf) liefert falsche Werte? Allgemeine Java-Themen 4
N contains(.) liefert nicht erwartetes Ergebnis Allgemeine Java-Themen 3
H JNI: loadLibrary liefert UnsatisfiedLinkError Allgemeine Java-Themen 2
J Base64 Kodierung liefert korrupte Dateien Allgemeine Java-Themen 3
S ´Locale.getDefault() liefert en Allgemeine Java-Themen 10
C ImageIO die read-Methode liefert mir ein null- Wert zurück Allgemeine Java-Themen 10
S aFile.delete() liefert false - Gründe ? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben