Hüllkurven um Punktwolke

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Hallo liebes Forum,

ich würde gern um eine Punktwolke einhüllende Kurven sowie eine Kurve durch die Mitte in das angehangene Diagramm zeichnen.
Dort ist die Mittellinie bereits eingezeichnet, es fehlen jedoch die Einhüllenden.
Leider weiß ich nicht wie ich diese Kurven realisieren soll.
Habt ihr eine Idee?

Bild
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dein Bild geht nicht.
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Bild
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Patrick1990: wie definierst Du die Einhüllende?
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Sirius3 hat geschrieben:@Patrick1990: wie definierst Du die Einhüllende?
so:
Bild
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@Patrick1990: Das ist ein Beispiel, keine Definition.
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

narpfel hat geschrieben:@Patrick1990: Das ist ein Beispiel, keine Definition.
Welche Art von Definition erwartest du denn?
Ich benötige halt zwei Kurven, welche ca. 90% oder 95% der Punkte umhüllen und eine mittlere Kurve.
Die Ausreißer sollen nicht beachtet werden und ein Polynom zweiten Grades wäre für die Art der Kurven .
gut geeignet.
Habe nun mal etwas versucht aber es ist noch nicht zufriedenstellend.
Weiterhin müsste die logarithmische Skalierung der x-Achse beachtet werden.

Bild
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Patrick1990: normalerweise hat man ja eine Theoriekurve, die die gemessenen Werte beschreiben soll. Da gibt es dann verschiedene Parameter, und die Frage wäre dann z.B. finde die Werte so, dass der Abstand der Punkte zur Kurve minimal wird (Mittelkurve), dass 95% der Punkte unter der Kurve liegen, oder eben dass 95% der Punkte über der Kurve liegen. So sähe dann eine Definition aus. Kann aber auch ganz anders definiert werden. Wir wissen nicht, was Du brauchst, das kannst nur Du sagen!
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@Patrick1990: Es kann für uns auch hilfreich sein, wenn du deinen Ansatz (sprich ein Minimalbeispiel inklusive Testdaten) zeigst.
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Sirius3 hat geschrieben:@Patrick1990: normalerweise hat man ja eine Theoriekurve, die die gemessenen Werte beschreiben soll. Da gibt es dann verschiedene Parameter, und die Frage wäre dann z.B. finde die Werte so, dass der Abstand der Punkte zur Kurve minimal wird (Mittelkurve), dass 95% der Punkte unter der Kurve liegen, oder eben dass 95% der Punkte über der Kurve liegen. So sähe dann eine Definition aus. Kann aber auch ganz anders definiert werden. Wir wissen nicht, was Du brauchst, das kannst nur Du sagen!
Leider beruhen diese Werte nicht ausschließlich auf einer Gleichung. Sie sind aus einer riesigen Tabelle von Maschinendaten und geben die Ausnutzung der Maschinen an. Dort zählen sehr viele Faktoren herein, jedoch auch technologisch bedingte Faktoren, die nicht bekannt sind.
Nach dem Entwurf der Maschine kann dieser Ausnutzungsfaktor bestimmt werden.
Für jeden neuen Entwurf nutzt man jedoch eine solche Tabelle, um schon im Vorfeld einen groben Anhaltspunkt zu bekommen.
Mein Ziel ist es nun einen Leistungswert vorzugeben (auf der x-Achse aufgetragen) und durch die drei Kurven einmal einen Mittelwert und zwei Grenzen dieses Leistungsfaktors (y-Achse) zum zugehörigen Leistungswert zu erhalten.

Hier noch ein Beispiel mit den Werten:

Code: Alles auswählen

from numpy import array, sign, zeros
from scipy.interpolate import interp1d
#from matplotlib.pyplot import plot,show,hold,grid
import matplotlib.pyplot as plt

y = array([2.72707696,2.63617439,2.54527183,2.45211548,2.63617439,
           3.84645565,2.47615583,3.05305409,2.54827687,3.84645565,
           2.46413565,3.84645565,2.94401644,3.84645565,4.73168929,
           2.98036232,4.1887902,4.71190817,2.88949762,4.66943022,
           5.23254529,4.71190817,4.27427572,4.39964092,5.63676707,
           7.15293505,4.04631435,4.55163919,4.60717115,5.4294562,
           5.33581921,7.03331773,4.78402922,4.25290434,4.95714817,
           5.68848053,6.99572768,5.49979457,7.03998354,5.44708431,
           5.33581921,6.75991664,6.87467146,5.55440859,5.99876128,
           5.67555216,6.97607676,5.62924139,7.20959136,5.49979457,
           7.05477342,5.46471241,8.43869703,6.87467146,5.50652576,
           7.6992562,5.60748354,6.60614702,5.49979457,5.53312733,
           6.65544662,5.54562619,8.43869703,7.98685649,5.54642812,
           7.03998354,7.6992562,5.79311695,5.57370352,5.33095537,
           6.70474623,5.49979457,8.96209787,8.39607735,5.55972891,
           5.89263704,7.89667302,5.63000355,9.13127276,5.88936335,
           8.40673227,7.98685649,8.93445391,7.7239333,5.3879134,
           8.41312522,8.96209787,7.6992562,8.43869703,5.3777794,
           7.98685649,8.42043146,7.91312442,5.58496353,9.13127276,
           10.84809562,8.42271465,7.85436942,7.97249164,5.49166632,
           9.07215872,9.24042836,7.82264171,5.41324842,7.96387274,
           8.57566622,9.0446435,7.94855023,8.9548522,7.94581407,
           9.17907497,9.12221396,10.85799351,7.97249164,9.08002021,
           9.24042836,8.95734376,9.20468097,8.58170542,9.11803858,
           10.87449001,8.97978622,8.98035007,9.11574339,8.76398243,
           10.79365718,9.11768456,8.59023265,10.84809562,10.87119071,
           10.85092359,10.79365718])

x = array([2.80000000e-01,5.50000000e-01,8.10000000e-01,9.50000000e-01,
           1.13000000e+00,1.30000000e+00,2.04000000e+00,2.70000000e+00,
           3.16000000e+00,2.90000000e+00,4.09000000e+00,4.50000000e+00,
           5.30000000e+00,6.10000000e+00,7.40000000e+00,8.20000000e+00,
           9.80000000e+00,9.40000000e+00,1.05000000e+01,1.49000000e+01,
           1.47000000e+01,1.89000000e+01,1.96000000e+01,2.10000000e+01,
           2.11000000e+01,1.62000000e+01,2.81000000e+01,2.74000000e+01,
           2.93000000e+01,3.07000000e+01,3.00000000e+01,2.05000000e+01,
           3.77000000e+01,3.94000000e+01,4.21000000e+01,4.21000000e+01,
           3.19000000e+01,5.90000000e+01,4.00000000e+01,6.10000000e+01,
           6.00000000e+01,4.68000000e+01,4.05000000e+01,6.80000000e+01,
           6.60000000e+01,8.40000000e+01,6.40000000e+01,9.50000000e+01,
           6.30000000e+01,1.18000000e+02,8.00000000e+01,1.23000000e+02,
           1.05000000e+02,8.10000000e+01,1.35000000e+02,1.26000000e+02,
           1.63000000e+02,1.14000000e+02,1.76000000e+02,2.05000000e+02,
           1.53000000e+02,2.36000000e+02,2.11000000e+02,2.17000000e+02,
           2.73000000e+02,2.00000000e+02,2.51000000e+02,3.07000000e+02,
           3.23000000e+02,3.28000000e+02,2.30000000e+02,3.52000000e+02,
           3.29000000e+02,3.15000000e+02,4.09000000e+02,4.34000000e+02,
           3.84000000e+02,4.88000000e+02,3.98000000e+02,4.97000000e+02,
           4.21000000e+02,4.34000000e+02,5.22000000e+02,5.02000000e+02,
           6.25000000e+02,5.26000000e+02,6.58000000e+02,6.27000000e+02,
           6.32000000e+02,7.80000000e+02,6.52000000e+02,7.36000000e+02,
           7.69000000e+02,9.70000000e+02,7.95000000e+02,8.86000000e+02,
           8.42000000e+02,8.92000000e+02,8.68000000e+02,1.11100000e+03,
           9.94000000e+02,1.06400000e+03,1.01700000e+03,1.25600000e+03,
           1.08100000e+03,1.13500000e+03,1.32400000e+03,1.29600000e+03,
           1.56700000e+03,1.51400000e+03,1.67000000e+03,1.59100000e+03,
           1.77400000e+03,1.73300000e+03,1.99200000e+03,2.13700000e+03,
           1.96200000e+03,2.34600000e+03,2.27400000e+03,2.64400000e+03,
           2.66600000e+03,2.63300000e+03,3.14200000e+03,2.78000000e+03,
           3.60300000e+03,3.53400000e+03,3.18300000e+03,4.06700000e+03,
           4.43400000e+03,5.32800000e+03,6.20700000e+03,7.06600000e+03])


q_u = zeros(y.shape)
q_l = zeros(y.shape)

#Prepend the first value of (s) to the interpolating values. This forces the model to use the same starting point for both the upper and lower envelope models.

u_x = [0,]
u_y = [y[0],]

l_x = [0,]
l_y = [y[0],]

#Detect peaks and troughs and mark their location in u_x,u_y,l_x,l_y respectively.

for k in range(1,len(y)-1):
    if (sign(y[k]-y[k-1])==1) and (sign(y[k]-y[k+1])==1):
        u_x.append(k)
        u_y.append(y[k])

    if (sign(y[k]-y[k-1])==-1) and ((sign(y[k]-y[k+1]))==-1):
        l_x.append(k)
        l_y.append(y[k])

#Append the last value of (s) to the interpolating values. This forces the model to use the same ending point for both the upper and lower envelope models.

u_x.append(len(y)-1)
u_y.append(y[-1])

l_x.append(len(y)-1)
l_y.append(y[-1])

#Fit suitable models to the data. 

u_p = interp1d(u_x,u_y, kind = 'cubic',bounds_error = False, fill_value=0.0)
l_p = interp1d(l_x,l_y,kind = 'cubic',bounds_error = False, fill_value=0.0)

#Evaluate each model over the domain of (s)
for k in range(0,len(y)):
    q_u[k] = u_p(k)
    q_l[k] = l_p(k)

#Plot everything
plt.scatter(x,y)
plt.xscale("log")
plt.hold(True)
plt.plot(x,q_u, "r")
plt.plot(x,q_l, "g")
plt.grid(True)
plt.show()
Dieses ist angehnt an: https://stackoverflow.com/questions/342 ... f-a-signal
Antworten