Schnittpunkt von Funktionen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
XmaJ
User
Beiträge: 2
Registriert: Mittwoch 8. Juli 2020, 11:55

Hallo,
Ich möchte einen Schnittpunkt von zwei Funktionen finden.
Mein Code macht folgendes: Er arbeitet mit einer CSV-Datei, die zu Beginn eingelesen wird. Sie besteht aus 9 Spalten und etwa 150 Zeilen mit diskreten Werten. Danach werden verschiedene Berechnungen, einschließlich Integrationen, durchgeführt.

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt
import math as m
import loaddataa as ld
import scipy.integrate as inte
from scipy.signal import find_peaks
import pandas as pd

# Loading values
dataListStride = ld.loadData("../Projektpraktikum Binder/Data/1 Fabienne/Test1/left foot/50cm")
indexStrideData = 2 
strideData = dataListStride[indexStrideData]

#%%Calculation of the horizontal acceleration

def horizontal(yAngle, yAcceleration, xAcceleration):
     a = ((m.cos(m.radians(yAngle)))*yAcceleration)-((m.sin(m.radians(yAngle)))*xAcceleration)
     return a

resultsHorizontal = list()

for i in range (len(strideData)):
    strideData_yAngle = strideData.to_numpy()[i, 2]
    strideData_xAcceleration = strideData.to_numpy()[i, 4]
    strideData_yAcceleration = strideData.to_numpy()[i, 5]
    resultsHorizontal.append(horizontal(strideData_yAngle, strideData_yAcceleration, strideData_xAcceleration))

resultsHorizontal.insert(0, 0)

#x-axis "convert" into time: 100 Hertz makes 0.01 seconds
scale_factor = 0.01 
x_values = np.arange(len(resultsHorizontal)) * scale_factor


heel_one=pd.Series(strideData.iloc[:,7])
plt.scatter(heel_one.idxmax()*scale_factor,heel_one.max(), color='red')
plt.scatter(heel_one.idxmin()*scale_factor,heel_one.min(), color='blue')

heel_two=pd.Series(strideData.iloc[:,9])
plt.scatter(heel_two.idxmax()*scale_factor,heel_two.max(), color='orange')
plt.scatter(heel_two.idxmin()*scale_factor,heel_two.min(), color='green')


plt.plot(x_values[:-1],strideData.iloc[:,7]) #force heel 
plt.plot(x_values[:-1],strideData.iloc[:,9]) #force toe


#plt.plot(x_values, resultsHorizontal)

#%% Integration of horizontal acceleration
velocity = inte.cumtrapz(resultsHorizontal,x_values)
#print ("Die Werte der Geschwindigkeit lauten:" +str(velocity))
plt.plot(x_values[:-1], velocity)

#%% Integration of velocity
s = inte.cumtrapz(velocity, x_values[:-1])
#print ("Die Werte der Geschwindigkeit lauten:" +str(s))
plt.plot(x_values[:-2],s)
Im folgenden Diagramm sieht man zwei Funktionen (Diagramm über die 7. Spalte (--> blaue Funktion) der CSV-Datei und einmal über die 9. Spalte (--> orange Funktion)).
Ich möchte den Schnittpunkt der beiden Funktionen wissen wo der Pfeil hinzeigt. Wie kann ich das erreichen?
Bild

Meine Idee war folgende:

Code: Alles auswählen

x_values = heel_one[high point_index]

while strideData[x_values,7] > strideData[x_values,9] do
         x_values=x_values-1
Ich denke, dass x_values so etwas wie mein Index ist. Bitte korrigiert mich, wenn dies nicht ganz korrekt ist.

Könnte mir bitte jemand helfen, den Schnittpunkt der beiden Funktionen zu finden, auf den der rote Pfeil zeigt? Vielen Dank für die Hilfe schon mal im voraus.

Wenn eine Information fehlt, bitte bescheid sagen. Danke!
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

Zunächst folgende allgemeine Anmerkungen:
  • find_peaks wird importiert, aber nicht verwendet
  • scipy.integrate als inte abzukürzen scheint mir nicht sinnvoll
  • math als m zu importieren scheint mir nicht sinnvoll, zumal eh schon Numpy verwendet werden soll
  • Variablen schreibt man klein_mit_unterstrich. MixedCase ist für Klassen gedacht.
  • Die Verwendung von Pandas ist da etwas übertrieben, nur um den Index eines Maximums zu finden, zumal eh schon Numpy verwendet werden soll
  • Verwende keine for-Schleife für deine Berechnung, sondern rechne direkt mit Numpy-Arrays (der Tipp, welcher dir hier gegeben wurde, ist nicht gut.
  • Ich weiß nicht was loaddata macht, aber es wäre zu prüfen, ob Numpy das nicht auch direkt importieren kann (Stichwort numpy.loadtxt oder ähnliches).
Zum Thema: Du hast ja keine Funktionen vorliegen, sondern diskrete Werte. Schnittpunkte können sich also auch zwischen den Werten ergeben. Das heißt du musst festlegen, was zwischen zwei Werten angenommen werden soll. Die einfachste und gleichzeitig häufig hinreichend genaue Variante ist die lineare Interpolation. Dann könntest du den Schnittpunkt von den zwei Strecken ermitteln, welche sich aus den zwei Punktepaaren ergibt. Das kann man so lösen wie hier sehr gut beschrieben: https://stackoverflow.com/questions/424 ... ecision-in.
XmaJ
User
Beiträge: 2
Registriert: Mittwoch 8. Juli 2020, 11:55

Hallo, vielen Dank für deine Antwort. Das waren aber viele Anmerkungen :D
Statt der For - Schleife gleich mit Numpy - Arrays zu arbeiten: Wie würde das denn dann aussehen? Ich hatte dazu jetzt keine Idee wie ich das anders lösen soll, deshalb die for - Schleife.
Und zwecks Schnittpunkt: Also würde ich die Funktionen interpolieren und dann den Schnittpunkt bestimmen.

Kurze Frage: Ich wollte in meinem Beitrag ein Bild mit posten? Wie mache ich das hier?
Benutzeravatar
__blackjack__
User
Beiträge: 13927
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@XmaJ: Halt keine ``for``-Schleife um die gleiche Rechnung mit einzelnen Elementen zu machen, sondern gleich die Rechnung mit den ganzen Arrays machen.

In das img-Tag muss die URL direkt zu dem Bild selbst, nicht zu einer HTML-Seite die (unter anderem) das Bild einbindet.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

Direkte Verwendung von Arrays in der Rechnung. Am besten schaust du dir mal das Quickstart Tutorial an: https://numpy.org/doc/stable/user/quickstart.html

Code: Alles auswählen

import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array([10, 20, 30, 40, 50])
print(a * b)
Dazu: numpy.deg2rad. Cosinus und Sinus kann Numpy ebenfalls.
Antworten