Heron Verfahren in Python: Problem bei Abbruchbedingung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Simon19992
User
Beiträge: 9
Registriert: Mittwoch 5. Dezember 2012, 19:09

Hi, zu aller erst: JA, das ist eine Hausaufgabe, ABER NEIN, ich bin nicht nur hier um mir eine Lösung geben zu lassen. Ich habe die Aufgabe bearbeitet und habe irgendwo noch einen ziemlichen Fehler, ich vermute er liegt entweder in der Abbruchbedingung oder bei allgemeinen Teil (ich bin ein Python-Neuling).
In der Aufgabe soll ich ein Programm für das Heronverfahren, für das Annähern an die Wurzel einer Zahl schreiben. Um nicht tausend durchläufe machen zu müssen hab ich mir überlegt, dass das Quadrat des angenäherten Ergebnisses minus der Ursprünglichen Zahl kleiner als 0.0001 sein soll(zB wir wollen die Wurzel aus 9. Wir erhalten durch mehrere Durchläufe 3.0000xxx. Hier soll die Schleife dann abbrechen und das Ergebnis ausspucken.

Also ich schreibe einfach mal was ich hab:

Code: Alles auswählen

a = input
%Das ist die Zahl deren Wurzel man moechte.(zB a=9)
s=(a+1)/2
%Das ist der Startwert
for s in range(s,10000000):
    x=0.5*(s+(a/s))
    if (x**2 - a) < 0.0001: break 
    else:
        x = 0.5*(x+(a+x))
        print "Wurzel aus",a,"fuer Startwert",s,"=",x
Ich bin Programmierneuling und bei Seiten wie GuteFrage.net werden solche Fragen sofort gelöscht. Mein Tutor konnte mir auch nicht helfen, da er ja auch verständlicher Weise nicht die Lösung verraten möchte. Ich bitte also um Verständnis dafür, dass ich eine Frage stelle, die etwas mit meiner Hausaufgabe zu tun hat ;)
Zuletzt geändert von Anonymous am Mittwoch 5. Dezember 2012, 19:38, insgesamt 1-mal geändert.
Grund: Syntax-Hervorhebung aktiviert
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Nutzt für deinen Quellcode die
-Formatierungsbausteine, so kann dein Quellcode leicht übernommen und getestet werden.
lunar

@Simon19992 Bitte korrigiere die Syntax Deines Programms. In der gegenwärtigen Form ist es nicht ausführbar.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Simon19992:
Die Zeile mit der Abbruchbedingung ist so ziemlich die einzige, die tut was Du beschrieben hast. Schau Dir nochmal die Iterationsvorschrift des Verfahrens an und versuch das schrittweise nachzuvollziehen, dann fallen Dir auch die "Variablendreher" und unsinnigen Ausdrücke auf.

Hier mal in nicht hübsch und als Lösung nicht zu gebrauchen:

Code: Alles auswählen

>>> f=lambda x,i: x if not i else (f(x,i-1)+x/f(x,i-1))*0.5
>>> f(9,5)
3.000000001396984
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Simon19992:
Das Heron-Verfahren ist hier ganz gut erklärt:
http://www.physik-im-unterricht.de/M9-H ... fahren.pdf

Bei Deinem Code wird Dir dann auffallen, dass im zweiten Iterationsschritt (also im zweiten Durchlauf der for-Schleife) s den Wert von x annehmen muß.

Deine for-Schleife wird so nicht funktionieren und ist bei iterativen Verfahren zudem der falsche Ansatz. Besser ist es, wenn Du hier while einsetzt und bei erreichen der gewünschten Genauigkeit die Schleife verlässt und somit die Iteration abbrichst.

Code: Alles auswählen

# Kommenarzeilen beginnen übrigens so.
Versuche nicht direkt das ganze Programm zu schreiben, sondern fange im Terminal erst einmal mit a = input() an und taste Dich dann vor.
Benutzeravatar
Mondkraft
User
Beiträge: 5
Registriert: Sonntag 7. Februar 2016, 18:09

Hallo Python Forum.

Ich wollte keinen neuen Theard eröffnen, weil ich auch eine Frage zu dem Satz von Heron habe.
Die Aufgabe lautet anhand von 3 Punktkoordinaten die Fläche eines Dreiecks zu berechnen.
Ich weiß aber nicht, wie ich auf Werte von p1, bis p3 so zugreifen kann, dass sich wenn ich neue Werte eingebe, diese automatisch unten berechnet werden.

Code: Alles auswählen

import math

p1 = (0,0)
p2 = (2,3)
p3 = (6,3)

a = math.sqrt((2-0)**2+(3-0)**2)
b = math.sqrt((6-2)**2+(3-3)**2)
c = math.sqrt((0-6)**2+(0-3)**2)
s = (a+b+c)/2

flaeche = math.sqrt(s*(s-a)*(s-b)*(s-c))
print(round(flaeche,2))
Antworten