Fläche (und. Integral) zwischen Kurve und Basislinie

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
zweihorn
User
Beiträge: 27
Registriert: Donnerstag 11. Mai 2017, 17:09

Hallo!

Ich versuche mit Python folgendes zu bewerkstelligen, siehe angehängtes Bild:

Die blaue Kurve ist eine Messung mit adaptiver Samplingrate und Dezimalzahlen mit sechs Stellen. Ich möchte nun die rote Gerade (Basislinie) einzeichnen und gleichzeitig das Integral zwischen der Basislinie und der Messkurve berechnen und einfärben.

Meine (geplante) Lösung sieht bisher so aus, dass ich zunächst die Messkurve mit einem Spline interpoliere um eine konstante Samplingrate zu erhalten. Die beiden Punkte (Anfang und Ende) der Basislinie sind mehr oder weniger willkürlich gesetzt, werden aber durch np.where() aus der Messkurve extrahiert (Durch die Interpolation habe ich nicht nur eine konstante Samplingrate, sondern auch x-Werte nach denen man konkret suchen kann, also ohne undefinierte Dezimalstellen). Diese beiden Punkte interpoliere ich linear, so dass die Sample-Anzahl der Geraden und des Kurvenstücks zusammen passt. Dann kann ich sowohl das Integral berechnen als auch mit fill_between die Fläche einzeichnen.

Das kommt mir allerdings ziemlich umständlich vor und ich kann mir irgendwie nicht vorstellen, dass es für solch einen Fall keine fertige Funktion gibt. Da ich nicht nur eine solche Gerade erzeugen will, sondern mehrere, bin ich auf der Suche nach einer Funkion, derer ich nur (x1,y1) sowie (x2,y2) als Argument geben muss und der Rest (Gerade erzeugen, Fläche füllen und Integral berechnen) geschieht automatisch. Anders ausgedrückt, eine Funktion wie fill nur nicht mit der x-Achse als Grenze, sondern einer interpolierten Geraden. Gibt's da was?

Bild

Danke für eure Hilfe!

LG
zweihorn

edit: klar, kann ich mir meine eigene Funktion schreiben, aber ich wollte nur sicher gehen, dass es sowas nicht schon gibt ;)
Benutzeravatar
noisefloor
User
Beiträge: 3829
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

direkt vorweg: ich habe keine Ahnung, ob es da was fertiges gibt.

Hat diese Art der Berechnung der Fläche einen Namen? Wenn ja, dann würde ich bei Google nach diesem Namen (in der englischen Schreibweise) mit vorangestelltem `python` suchen und schauen, was Google so ausspuckt. Ich denke, dass die "üblichen Verdächtigen" wie numpy, sympy und scipy das in einem Schritt OOTB nicht können. Aber vielleicht hat ja mal jemand ein darauf aufsetzend Modul programmiert, was genau das macht, was du suchst.

Gruß, noisefloor
Benutzeravatar
pixewakb
User
Beiträge: 1405
Registriert: Sonntag 24. April 2011, 19:43

Ich hatte mal mit einer ähnlichen Problemstellung zu tun. Vorab ich bin nicht vom Fach (weder Mathematiker noch Naturwissenschaftler) und somit musste ich mir was basteln. Bitte nicht lachen oder Kopf schütteln:

Ich habe so getan, als hätte ich keine Linien in einem Diagramm, sondern nur Messpunkte und habe zwischen diese Messpunkte und Punkten auf der x-Achse dann Rechtecke mit der Breite 1 eingetragen. Ich habe dann für alle Messpunkte die Flächen der Rechtecke addiert und habe so näherungsweise die Gesamtfläche unter einer Messdatenkurve berechnet. Da die Messdaten bei mir i. d. R. stark schwanken, kann ich dort keine vernünftige Annäherung mittels Kurve hinbekommen.

Für meine Bedürfnisse reichte das damals, weil ich Flächen im größeren Maßstab (Anzahl) miteinander vergleichen musste und so zu akzeptablen Ergebnissen gelangte, d. h. ich konnte die Messstellen sortieren.

Ich bin mir bewusst, dass das wahrscheinlich nicht die sinnvollste Lösung darstellt, von daher bin ich mal gespannt, wie das professionell gelöst wird.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich bezweifle das es da etwas gibt. Ich habe mal vor Jahrzehnten an einem Chromatographie-Programm gearbeitet. Das was du hier machst entspricht einer Peak-Detection. Und deren Definition war ein heuristisches Monster, das wir peinlich genau nachbilden mussten. Und auch dein Ding hier ist so etwas. Du alleine definierst, was deine Kriterien für Start und Ende der Basislinie sind.
zweihorn
User
Beiträge: 27
Registriert: Donnerstag 11. Mai 2017, 17:09

@ noisefloor

gegoogelt habe ich schon, leider ohne brauchbares Ergebnis.

@ pixewakb

das bringt nix, das wäre ja nur eine (primitive, sorry^^) Methode das Integral zu approximieren. Dafür gibt es ja einen ganzen Sack voll Funktionen.

@ __deets__

naja ein klassisches Peakdetect ist das ja nicht, aber ich weiß was du meinst. Da ich aber meine Grenzen frei wähle und die Peaks nicht automatisiert auswerte, sollte ich keine Heuristik brauchen.

Da es anscheinend dafür doch nix gibt, werde ich mein geplantes Vorhaben mal umsetzen.

Danke für eure Hilfe, bin für weitere Vorschläge offen

LG
zweihorn
zweihorn
User
Beiträge: 27
Registriert: Donnerstag 11. Mai 2017, 17:09

ok, meine oben vorgeschlagene Lösung funktioniert. Trotzdem danke!
Antworten