Summenzeichen und Wurzel in Python

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
billie7
User
Beiträge: 2
Registriert: Donnerstag 14. November 2019, 11:51

Hallo liebe Forum-Gemeinschaft,

ich bin zurzeit noch Anfänger, was das Programmieren mit Python angeht, ich habe schon ein paar Grundlagen, aber scheitere leider an der folgenden Aufgabe:

Es wurden zwei Listen (x und y) mit Gauss-Krueger Koordinaten für vier Punkte angegeben, und nun soll die folgende Formel zur Berechnung der Gesamtlänge der Linien zwischen diesen Punkten programmiert werden:

L = nΣi=1√((xi - xi-1)^2 + (yi - yi-1)^2)

Kann mir jemand sagen, wie man das in Python schreibt?

Danke und viele Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 13102
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@billie7: Es gibt eine `sum()`-Funktion und eine Funktion um im `math`-Modul eine Funktion um die Wurzel zu ziehen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Wurzelziehen ist das selbe wie mit 0.5 zu potenzieren. In numpy nennt sich das Ganze `norm`.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich würde es auch über die Potenz lösen. Finde ich lesbarer.
Benutzeravatar
__blackjack__
User
Beiträge: 13102
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also ich finde `sqrt()` ”lesbarer”. Wenn man nicht weiss was das macht, kann man das leichter nachlesen als wissen zu müssen das potenzieren mit ½ das gleiche ist wie die Quadratwurzel zu ziehen.

Code: Alles auswählen

#!/usr/bin/env python3
from math import sqrt
from more_itertools import windowed


def main():
    ...
        
    #       n       _________________________________________
    #      ---     |                  2                    2
    #      \    _  |  /             \      /             \
    # L =   >    \ | |  x  - x       |  + |  y  - y       |
    #      /      \|  \  n    n - 1 /      \  n    n - 1 /
    #      ---
    #     i = 1

    L = sum(
        sqrt((x_2 - x_1) ** 2 + (y_2 - y_1) ** 2)
        for (x_1, y_1), (x_2, y_2) in windowed(zip(xs, ys), 2)
    )


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

__blackjack__ hat geschrieben: Freitag 15. November 2019, 12:23 Also ich finde `sqrt()` ”lesbarer”.
Kommt denke ich auf den Kontext an. Wenn man wie hier nur die Quadratwurzel braucht, ist sqrt gut lesbar. Wenn man aber zusätzlich auch andere Wurzeln braucht (zum Beispiel, weil man das geometrische Mittel selbst implementieren möchte), gehts in Python glaube ich auch nur mit Potenzen. Oder man möchte leicht fortgeschritterne Sachen wie Ableitungen oder Stammfunktionen verwenden. Nimmt man Potenzen, geht das alles mit demselben Mechanismus in transparenter Weise.
billie7
User
Beiträge: 2
Registriert: Donnerstag 14. November 2019, 11:51

__blackjack__ hat geschrieben: Freitag 15. November 2019, 12:23 Also ich finde `sqrt()` ”lesbarer”. Wenn man nicht weiss was das macht, kann man das leichter nachlesen als wissen zu müssen das potenzieren mit ½ das gleiche ist wie die Quadratwurzel zu ziehen.

Code: Alles auswählen

#!/usr/bin/env python3
from math import sqrt
from more_itertools import windowed


def main():
    ...
        
    #       n       _________________________________________
    #      ---     |                  2                    2
    #      \    _  |  /             \      /             \
    # L =   >    \ | |  x  - x       |  + |  y  - y       |
    #      /      \|  \  n    n - 1 /      \  n    n - 1 /
    #      ---
    #     i = 1

    L = sum(
        sqrt((x_2 - x_1) ** 2 + (y_2 - y_1) ** 2)
        for (x_1, y_1), (x_2, y_2) in windowed(zip(xs, ys), 2)
    )


if __name__ == "__main__":
    main()
Vielen Dank für die ausführliche Antwort! Das hilft mir sehr weiter :)
Antworten