Integration über Arrays

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
JeanC
User
Beiträge: 11
Registriert: Dienstag 29. Dezember 2015, 18:46

Hallo zusammen

Ich über mich gerade in der Integration mit Python. Wie ich mit Funktionen integriere ist mir bewusst, jedoch weiss ich nicht, wie ich integrieren soll, wenn mir nicht die Funktion, sondern nur die Werte und Funktionswerte in Arrays gegeben sind.

Code: Alles auswählen

import scipy

x = [0, 1, 2, 3, 4, 5]
y = [0, 1, 4, 9, 16, 25]

res, err = scipy.integrate.quad(??, x[0], x[-1])
Hat jemand eien Idee?

Gruss,

Jean
Sirius3
User
Beiträge: 18217
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann kannst Du gar nicht integrieren, sondern nur die Trapez-Summe bilden.
JeanC
User
Beiträge: 11
Registriert: Dienstag 29. Dezember 2015, 18:46

So etwas hatte ich schon vermutet, da ja der Verlauf zwischen den Punkten nicht eindeutig ist, wenn ich nicht wüsste, dass sich die Funktion x**2 dahinter verbirgt. Hab es jetzt so gelöst:

Code: Alles auswählen

x = [0, 1, 2, 3, 4, 5, 6]
y = [0, 1, 4, 9, 16, 25, 36]


def trapez_summe(x, y):
    teilflächen = []
    elemente = len(x)
    for idx, i in enumerate(x):
        if idx < (elemente - 1):
            fläche = (x[i+1] - x[i])*(y[i] + y[i+1])/2.0
            teilflächen.append(fläche)
    return sum(teilflächen)


print(trapez_summe(x, y))
Da ich aus der Ruby-Welt komme, würde ich mich über Tipps freuen, ob es so in der Python-Welt gemacht wird.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sieht an sich gut aus, ich persoenlich wuerde in diesem Fall allerdings die Summe einfach direkt bilden. Also "gesamtsumme = 0" und "gesamtsumme += fläche".
Sirius3
User
Beiträge: 18217
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist ja eher Zufall, dass man die Werte in `x` auch als Index benutzen kann. Das ist also ein Programmierfehler, `i` so zu verwenden. Man sollte sowieso nicht mit Indices hantieren. Auch die if-Abfrage ist unschön.
Statt dessen gibt es zip:

Code: Alles auswählen

def trapez_summe(x, y):
    flaeche = 0
    for xa, xb, ya, yb in zip(x[1:], x, y[1:], y):
        flaeche += (xa - xb) * (ya + yb) / 2
    return flaeche
bzw.

Code: Alles auswählen

def trapez_summe(x, y):
    return sum(
        (xa - xb) * (ya + yb) / 2
        for xa, xb, ya, yb in zip(x[1:], x, y[1:], y)
    )
JeanC
User
Beiträge: 11
Registriert: Dienstag 29. Dezember 2015, 18:46

Herzlichen Dank für eure kompetente Hilfe!
Antworten