Datentyp problem
Yup, ich wollte das Problem auch nicht auf Python reduzieren. Ich bin mir bewusst, dass das in anderen Sprachen auch so ähnlich ist. Bei meiner fast täglichen Arbeit mit Koordinaten komme ich auch prima mit den floats aus. Dennoch ist das eine Problematik, die imo für viele erst einmal nicht offensichtlich ist. Als ich meine Klasse für das Rechnen mit Gewichten geschrieben habe, musste ich letztendlich auch auf das Decimal Modul zurückgreifen. Das Umrechnen in die SI Basiseinheit hat da auch zu Rundungsfehlern mit den "normalen" Floats geführt, so dass Vergleiche nicht so einfach möglich waren.
Na gut - dann eben zu Fuß (super-einfachst-Version mit Newton) ....BlackJack hat geschrieben:@Tom_H: `math.sqrt()` ist zwar schnell, führt aber leider zum falschen Ergebnis:
Das war wahrscheinlich auch der eigentliche Inhalt der Aufgabe - die Schüler sollten mal "etwas zum Kauen" bekommen.
Code: Alles auswählen
x = 1
while True:
x += 1
temp = x * x - 1
if (temp % 61) == 0:
temp = temp / 61
yap1 = temp / 2.0
while True:
yap2 = (yap1 + temp / yap1) / 2.0
if (yap1 - yap2) < 0.8:
break
yap1 = yap2
y = int(yap2)
if y * y == temp:
print x, y
break
mfg, Tom
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Rettet nicht viel, aber ein wenig
Außerdem regt es problembaer auf 

Code: Alles auswählen
for x in itertools.count(2):
temp = x * x - 1
# usw...

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Moin moin,
Ich trau mich kaum zu fragen, wenn das schon so super einfach ist, doch erschließt sich mir der Sinn von yap1 und yap 2 nicht. Ist das das Newtonverfahren. Ich kenne das nur aus der Analysis. Wäre klasse,w enn du mir den Code erklären könntest, ich werkel schon länger an dem decimal-Modul rum, doch ist das aber ner gewissen Nachkommastelle nicht mehr genau.
Lg Alex
Ich trau mich kaum zu fragen, wenn das schon so super einfach ist, doch erschließt sich mir der Sinn von yap1 und yap 2 nicht. Ist das das Newtonverfahren. Ich kenne das nur aus der Analysis. Wäre klasse,w enn du mir den Code erklären könntest, ich werkel schon länger an dem decimal-Modul rum, doch ist das aber ner gewissen Nachkommastelle nicht mehr genau.
Lg Alex
Genau das isser - wobei der hier zum Zweizeiler verkommt.titus2000 hat geschrieben:Ich trau mich kaum zu fragen, wenn das schon so super einfach ist, doch erschließt sich mir der Sinn von yap1 und yap 2 nicht. Ist das das Newtonverfahren.
gesucht: y = sqrt(t) das ist gleichbedeutend mit: y² = t oder: y² - t = 0
Man muß also die Nullstellen von y² - t suchen.
Ver-Newtoned gibt das: yn+1 = (yn + t / yn) / 2
Für n=1: yapprox_2 = (yapprox_1 + t / yapprox_1) / 2
Jetzt machst Du noch aus yapprox_2 die Kurzform yap2 und "recyclest" in der Schleife die Indizes: ~1 ist immer der alte und ~2 ist immer der neue Wert
...damit sollte es lesbar sein.
Beim Abbruchkriterium "(yap1 - yap2) < 0.8" hätte ich auch 1.0 hinschreiben können. 0.8 schien mir im Sinne von Rechenfehlern sicherer. So eine einfache Parabel konvergiert auch so schön schnell und Narrensicher, daß das wurscht ist.
Wichtig ist noch, daß der Startwert rechts von der Nullstelle liegt. Damit werden die Näherungswerte stetig fallend und man kann auf Vorzeichenspiele und Fallunterscheidungen verzichten.
mfg, Tom
-
- User
- Beiträge: 456
- Registriert: Mittwoch 15. April 2009, 14:11
Ich kenn das ganze als Heron-Verfahren: http://de.wikipedia.org/wiki/Heron-Verfahren
Ein Spezialfall vom Newton-Verfahren.
Grüße,
anogayales
Ein Spezialfall vom Newton-Verfahren.
Grüße,
anogayales