2013-05-01 19 views
5

Bazı tek boyutlu verilerim var ve bir spline ile sığdırıyorum. Daha sonra, bükülme noktalarını (eyer noktalarını göz ardı ederek) bulmak istiyorum. Şimdi splev'in oluşturduğu değerlerin çoğunda scipy.signal.argrelmin (ve argrelmax) kullanarak ilk türevinin extremalarını araştırıyorum.Spline takılı 1d verisinde dönme noktaları bulma

import scipy.interpolate 
import scipy.optimize 
import scipy.signal 
import numpy as np 
import matplotlib.pyplot as plt 
import operator 

y = [-1, 5, 6, 4, 2, 5, 8, 5, 1] 
x = np.arange(0, len(y)) 
tck = scipy.interpolate.splrep(x, y, s=0) 

print 'roots', scipy.interpolate.sproot(tck) 
# output: 
# [0.11381478] 

xnew = np.arange(0, len(y), 0.01) 
ynew = scipy.interpolate.splev(xnew, tck, der=0) 

ynew_deriv = scipy.interpolate.splev(xnew, tck, der=1) 

min_idxs = scipy.signal.argrelmin(ynew_deriv) 
max_idxs = scipy.signal.argrelmax(ynew_deriv) 
mins = zip(xnew[min_idxs].tolist(), ynew_deriv[min_idxs].tolist()) 
maxs = zip(xnew[max_idxs].tolist(), ynew_deriv[max_idxs].tolist()) 
inflection_points = sorted(mins + maxs, key=operator.itemgetter(0)) 

print 'inflection_points', inflection_points 
# output: 
# [(3.13, -2.9822449358974357), 
# (5.03, 4.3817785256410255) 
# (7.13, -4.867132628205128)] 

plt.legend(['data','Cubic Spline', '1st deriv']) 
plt.plot(x, y, 'o', 
     xnew, ynew, '-', 
     xnew, ynew_deriv, '-') 
plt.show() 

Fakat bu çok yanlış bir şey hissettiriyor. Sanırım o kadar çok değer üretmeden aradığımı bulmak için bir olasılık var. Sproot gibi bir şey ama belki ikinci türeve uygulanabilir mi?

+0

Olumlu İşte

bunu yapmak için koddur. ;-) –

cevap

4

derivative of a B-spline is also a B-spline. Bu nedenle, öncelikle verilerinize bir spline sığdırabilirsiniz, daha sonra türev spline katsayılarını oluşturmak için türev formülünü kullanın ve son olarak spline kök bulgusunu türev spline'ın köklerini elde etmek için kullanın. Bunlar daha sonra orijinal eğrinin maksimumu/minimidir. https://gist.github.com/pv/5504366

katsayılarının ilgili hesaplama geçerli::

t, c, k = scipys_spline_representation 
# Compute the denominator in the differentiation formula. 
dt = t[k+1:-1] - t[1:-k-1] 
# Compute the new coefficients 
d = (c[1:-1-k] - c[:-2-k]) * k/dt 
# Adjust knots 
t2 = t[1:-1] 
# Pad coefficient array to same size as knots (FITPACK convention) 
d = np.r_[d, [0]*k] 
# Done, a new spline 
new_spline_repr = t2, d, k-1 

Finding inflection points of a curve via derivative splines

+1

Vay, harika, teşekkürler. Bilmiyordum, splineları ayırmak çok kolaydı. Kökler() sadece sipariş 3 için çalıştığından, sanırım extrema ve bükülme noktalarını bulmak istiyorsam farklı kıvrımlar kullanmak zorundayım, ama şu anda benim için bir sorun değil. Birisinin benim sorunumun kodunuzla nasıl çözülebileceğiyle ilgilenmesi durumunda: https://ideone.com/qKja7X ve http://s21.postimg.org/mbc96qcxj/out.png ve https://ideone.com/ m757q9 –