2016-09-09 3 views
0

Ich bin auf ein Problem aus einem Lehrbuch fest. Es fragt:Quadratwurzel n durch Berechnung der nächsten Xi-Term

Ihre eigene Quadratwurzel Approximationsfunktion Schreiben Sie die Gleichung Xk+1 = 1/2 * (Xk + n/(Xk), wo X0 = 1.

Diese Gleichung besagt, dass das sqrt'n 'durch wiederholtes Berechnen des nächsten Xi-Terms gefunden werden kann. Je größer die Anzahl der verwendeten Begriffe, desto besser die Antwort. Erlauben Sie Ihrer Funktion, zwei Eingabeparameter zu haben, die Nummer, von der die Quadratwurzel und die Anzahl der Ausdrücke berechnet werden sollen.

Ich benutze Python3.5.2 für diese.

attached a picture of the problem

Dank!

+1

Pro [SO allgemeine Richtlinien für Hausaufgabenhilfe] (http://meta.stackexchange.com/a/10812) wird vorgeschlagen, dass Sie einen guten Glauben versuchen, das Problem selbst zuerst zu lösen **, und posten Sie das in deiner Frage. – ahoffner

Antwort

0

Ein neues Schuljahr, eine alte babylonische Methode.

Also, ich werde das nicht für Sie lösen, aber ich kann Sie beginnen.

Wir können eine kleine Funktion schreiben, die jede x_{k+1} berechnet:

def sqrt_step(n, xk): 
    return 1/2.0 * (xk + float(n)/xk) 

Lasst uns n = 100 gesetzt.

sqrt_step(100, 1) # returns 50.5 

Nun wollen wir diese Zahl in die Funktion noch ein paar Mal füttern:

sqrt_step(100, 50.5) # 26.2 

sqrt_step(100, 26.2) # 15.0 

sqrt_step(100, 15.0) # 10.8 

... konvergiert dies bis 10 als k bis ins Unendliche geht.

Nun, wenn nur eine Art und Weise war eine Operation immer und immer wieder k mal auszuführen ... Ich bin von einem Drei-Buchstaben-Wort zu denken, die mit ‚f‘ beginnt und Reime mit ‚Erz‘ ...


EDIT

Sie eine ehrliche Mühe gemacht haben, das Problem zu lösen - was ich zu gehe nehmen eine Praxis Übung Hausaufgaben ist und nicht eine Zuordnung.

Sie können dies einfach lösen, indem Sie die Funktion sqrt_step in einer neuen Funktion verwenden.

def square_root(n, k): 
    xk = 1 
    for i in range(k): 
     xk = sqrt_step(n, xk) # or just: xk = 1/2.0 * (xk + float(n)/xk) 
    return xk 

Tests:

square_root(64, 100) # 8.0 
square_root(144, 100) # 12.0 

Wie Sie weiter fortgeschritten sind, werden Sie über funktionale Programmiertechniken erlernen, die es Ihnen ermöglichen, zu vermeiden, Variablen zu überschreiben und for Schleifen ausdrücklich schriftlich Dies kann wie folgt durchgeführt werden. Für jetzt jedoch ist dies der einfachste Ansatz.

+0

Vielen Dank InNoam für die Antwort auf meinen Beitrag und hilft mir, loszulegen. Ich habe immer noch Schwierigkeiten, mir vorzustellen, wie ich diesen Vorgang k mal wiederholen kann. Ich werde dir zeigen, was ich bisher versucht habe. def sqrt_step (n, xk): return 1/2.0 * (xk + Schwimmer (n)/xk) # wie Sie erwähnte ich durch Wiederholung dieses k-mal versucht: def sqrt_step (n, xk): für xk im Bereich (xk, 1, -1): zurück 1/2.0 * (xk + float (n)/xk) Meine Argumentation war, xk zu wiederholen, bis es 1 erreichte, indem jedes Mal um 1 verringert wurde. – Babeeshka

+0

In der Mathematik nennen wir diese Art von Methode "explizit", weil 'x_ {k + 1}' nur von uns abhängt, wenn wir 'x_ {k}' kennen. Im Englischen bedeutet dies, dass es am wichtigsten ist, den * Wert * zu kennen, der im vorherigen Schritt erhalten wurde. Versuchen Sie also, den Wert von 'xk = 1' zu setzen und die Funktion' sqrt_step() 'auszuführen, und ersetzen Sie dann *' xk' durch diese Funktion (obwohl dies gegen ein Programmierprinzip verstößt, dem einige als "Unveränderlichkeit" bekannt sind) ist der einfachste Weg, um loszulegen). Sie benötigen die 'for' -Schleife, um dem Computer * einfach zu sagen, wie oft * der Wert von' xk' überschrieben werden soll. Der tatsächliche Index bei irgendeinem gegebenen Schritt ist nicht besonders relevant. – lnNoam

+0

Ich denke ich habe es geschafft! Sie sind so hilfsbereit und das Beste. Ich bin mir nicht sicher, wie ich meinen Kommentar hier formatieren soll, aber ich denke, ich habe ihn zu kompliziert gemacht und was funktioniert hat, war nur zu setzen: für i in Reichweite (1,10): zwischen den anderen Zeilen. – Babeeshka

Verwandte Themen