Seite 2 von 2

Re: Datentyp problem

Verfasst: Mittwoch 7. Dezember 2011, 11:30
von frabron
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.

Re: Datentyp problem

Verfasst: Mittwoch 7. Dezember 2011, 20:46
von Tom_H
BlackJack hat geschrieben:@Tom_H: `math.sqrt()` ist zwar schnell, führt aber leider zum falschen Ergebnis:
Na gut - dann eben zu Fuß (super-einfachst-Version mit Newton) ....
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
>> 1766319049 226153980

mfg, Tom

Re: Datentyp problem

Verfasst: Mittwoch 7. Dezember 2011, 20:59
von Hyperion
Rettet nicht viel, aber ein wenig ;-)

Code: Alles auswählen

for x in itertools.count(2):
    temp = x * x - 1
    # usw...
Außerdem regt es problembaer auf :twisted:

Re: Datentyp problem

Verfasst: Mittwoch 7. Dezember 2011, 21:10
von titus2000
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

Re: Datentyp problem

Verfasst: Mittwoch 7. Dezember 2011, 22:58
von Tom_H
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.
Genau das isser - wobei der hier zum Zweizeiler verkommt.
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

Re: Datentyp problem

Verfasst: Mittwoch 7. Dezember 2011, 23:19
von anogayales
Ich kenn das ganze als Heron-Verfahren: http://de.wikipedia.org/wiki/Heron-Verfahren
Ein Spezialfall vom Newton-Verfahren.

Grüße,
anogayales