Itarationsformel

Status
Nicht offen für weitere Antworten.
R

Reaper

Gast
Hallo will gerade Programm zur Berechnung der Kubikwurzel mithilfe der Näherungsformel von Newton:

yi = (2*y(i-1) + (x/y(i-1)²))/3;
(yi ist der Näherungswert der Kubikwurzel nach dem i-ten Schritt, Man beginnt mit y0 = x/3. Die Iteration soll so lange fortgesetzr werden bis sich yi und yi-1 um weniger als 1.0E-5 unterscheiden)
schreiben, komm aber irgendwie nie zu einem Ergebniss.

Nun anbei mein Programm:



class newton{


static double root3(double x){
double y = x/3;

while(Math.abs(y1 - y < 1.0E-5){ //solange y1 - y < 1.0E-5 gilt rechne zuerst y1 aus und weise dann y = y1 zu
//sodass y1 immer den neuesten Itarationsschritt enthält


y1 = (2*y + (x/y*y))/3;

y = y1;
}
return y1;

}



public static void main(String[] arg){
IO.write("Geben Sie einen Startwert fuer die Naeherungsformel ein: ");
double x = IO.readDouble();


IO.write(root3(x));
}
}


Irgendein grober Fehler muss in meiner Überlegung liegen denn ihr mir hoffentlich sagen könnt
 

Wildcard

Top Contributor
Von einigen Syntaxfehlern die in deinem Orginalprog hoffentlich nicht sind,
machst du wirklich einen groben Denkfehler:
Du setzt am ende deiner Schleife
y = y1
und vergleichst anschließend ob y - y1 <1.0E-5 :?:

auch deine Abbruchbedinung stimmt so nicht:

Du brauchst
Code:
while(Math.abs(y-y1) > 1.0E-5)

da du ja weiterrechnen musst solange die gewünschte Genauigkeit noch nicht erreicht ist.
 
R

Reaper

Gast
wenn ich jetzt das > Zeichen mache zeigt mir das Programm trotzdem falsche Werte, nämlich die gleichen, an. Ab dem alleine kanns also nicht ganz liegen
 

Wildcard

Top Contributor
Wie gesagt:

du setzt erst
y=y1 und vergleichst dann deren differenz.
Die ist aber logischerweise immer 0.
Kann also gar nicht gehen.
Versuchs mal selbst zu lösen (macht mehr spaß) und wenn's nicht klappt dann helf ich dir :D
 
R

Reaper

Gast
Mich ärgert dass wirklich aber ich komm einfach auf keine vernünftige Lösung. Ich glaube man muss irgendwie dass
y1 = y in eine extra while Schleife abspalten weiß dann aber leider keine Bedingung dafür, wann while Schleife wieder aufhört.
 

Wildcard

Top Contributor
Die Formel kann so nicht hinhauen.
Wenn man nur den trivialen fall für 10 betrachtet:
für y0 = 10/3
und y1 = (2*y0 + (10/(y0*y0)))/3;
betrachtet, dann ist y1 schon größer als y0 obwohl die 3. Wurzel aus 10 kleiner als x/3 ist.
Kann ja wohl nicht ganz hinhauen, oder?
 

Wildcard

Top Contributor
Laut dem "allmächtigen" Forster dient das Newtonsche Iterationsverfahren zur Lösung
der Gleichng f(x) = 0 durch
x(n+1) = x(n) - f(x)/f'(x) mit (n e N)
Welches Buch war das?
Hab jetzt keine Zeit mehr, werd mich aber mal schlau machen und mich wieder melden.

???:L
 

Wildcard

Top Contributor
Habs rausgefunden!
Die Formel ist ein eine abgewandelte Form des Newtonschen Iterationsverfahren,
und nennt sich Heronalgorihtmus.

so gehts:


Code:
class newton{ 

   

    private static double root3(double x)
    {    
       
        double x1=1;
        double x0;
        
        do
        {
            x0=x1;
            x1=(1.0/3.0)*(2*x0+(x/(x0*x0)));

        } while (Math.abs(x0-x1) > 1.0E-5*Math.abs(x1));
            
            
        return x0;
                   
    }
        



    public static void main(String[] arg)
    { 
        double x = 20;
        
    System.out.println(root3(x)); 
    } 
}
 
R

Reaper

Gast
Super war echt nett von dir das du dich nochmal gemeldet hast und mir endlich die Lösung posteste. Jetzt muss ich misch endlich nicht mehr herumquälen
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben