2016-04-07 1 views
1

J'ai des données qui décrivent une série comme ça:Trouver où une fonction commence et se termine pour diminuer

enter image description here

Je suis intéressé par le calcul des points où les forts de début et de fin décroissantes. Comme ça:

enter image description here

Je calcuted la dérivée seconde de ma fonction et obtenir les points quand il a minima négatif (commencer à diminuer) et un maximum positif.

Mais ce que j'obtenir dans la plupart des cas est similaire à celle:

enter image description here

Où suis-je tort?

Ici il y a mon code python:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.interpolate import InterpolatedUnivariateSpline 

# set x and y 
y = data_series 
x = range(len(data_series)) 

# interpolation 
f = InterpolatedUnivariateSpline(x, y) 

# gen function points 
new_x = np.linspace(min(x), max(x), num=1000, endpoint=True) 
new_y = f(new_x) 

# calculate second derivative 
y_df1 = np.insert(np.diff(y), 0, 0) 
y_df2 = np.insert(np.diff(y_df1), 0, 0) 

# points where the decrease starts and ends 
# (where the second derivative is minimum and maximum) 
x_dec = np.where(y_df2 == min(y_df2))[0][0] 
x_inc = np.where(y_df2 == max(y_df2))[0][0] 

# plot 
plt.plot(new_x, new_y, 'b', lw=3, alpha=0.7) 
plt.plot(x_dec, f(x_dec), 'ro', ms= 8) 
plt.plot(x_inc, f(x_inc),'ro', ms=8) 
plt.show()   

Répondre

2

Tu ne fais rien de mal. Le premier point sur le graphique que vous obtenez est en fait le point auquel la dérivée première cesse de diminuer, et donc où la dérivée seconde est (plus proche de) zéro.

+0

Le premier point sur le graphique est où la dérivée seconde n'est pas la plus proche de zéro, mais est sur son minimum (et une valeur négative). Cependant, y at-il un moyen d'attraper le point sur la courbe (devrait être x autour de 50) où la diminution commence? – Ewybe

+0

Vous voulez dire quelque chose comme 'np.where (y_df1 <0) [0] [0]'? Cela vous donnera le premier index où la première dérivée de 'y' est négative. (Remplacer '<0' par' acdr