2017-02-17 299 views
0

我试图在scipy中使用splev的几个点找到样条函数的衍生物。例如:样条函数的衍生物:`scipy splev`

import numpy as np 
from scipy.interpolate import splprep, splev 
import matplotlib.pyplot as plt 

# function to normalize each row 
def normalized(a, axis=-1, order=2): 
    l2 = np.atleast_1d(np.linalg.norm(a, order, axis)) 
    l2[l2==0] = 1 
    return a/np.expand_dims(l2, axis) 

# points and spline 
pts = np.array([[0,0],[1,1],[2,np.sqrt(2)],[4,2],[9,3]]) 
tck, u = splprep(pts.T, u=None, k=3, s=0.0, per=0) 

# compute new points and derivatives 
u_new = np.linspace(u.min(), u.max(), 5*u.shape[0]) 
x_new, y_new = splev(u_new, tck, der=0) 
xp_num, yp_num = splev(pts, tck, der=1) # numerical derivatices 
xp_the, yp_the= pts[1:,0], 0.5/np.sqrt(pts[1:,0]) # analytical derivatives 
R = normalized(yp_num/xp_num) 
X,Y = pts[1:,0], pts[1:,1] 
U,V = X + R[1:,0], Y+R[1:,1] 

我想在指定点绘制切线:

plt.plot(x_new,y_new,'-b') 
plt.plot(pts[:,0],pts[:,1],'--ro') 
plt.quiver(X,Y,U,V, angles='xy', scale_units='xy') 

enter image description here

我觉得这些切线都是错误的。我的理解是,xp_numyp_num是相对于xy的样条的数值导数。所以要找到dy/dx,我应该简单地将它们分开。它是否正确?

最后,我想找到一个曲线的切线像this

+1

wh在“正常化”吗? –

+0

@PaulPanzer:它规范化每一行。我加了'normalize'的定义。 – Mahdi

+0

奇怪的是,你的代码在我看来好像它不应该在剧情中创建任何向量。 'yp_num'和'xp_num'是1d,不是吗?所以你的'R'应该是1x东西,所以当你切割R [1:,0]时,你应该得到一个空数组。我在这里错过了什么吗? –

回答

1

您的问题(的明显错误的衍生工具),因为你不使用它们,至少在你的代码发布不相关的数值导。什么显然是错误的,除非你的normalized功能做一些真正神奇的是你将yp_the通过xp_the,因为前者是确实的增量,后者是不是应该不断得到

dy 
-- 
dx 

,而不是你的

dy 
---- 
x dx 

你很可能从公式来进行使用的参数曲线

.  dy 
     -- 
dy dt 
-- = ---- 
dx dx 
     -- 
     dt 

t=x,然后忽略dx/dx是恒定的。发生在我们最好的事情。

+0

太棒了,完全正确我想过参数曲线!谢谢! – Mahdi

1

你没有包括您R = normalized(yp_the/xp_the)

我linalg.norm

然后我改变了对delta_Y的标准化衍生

做到了,放弃了对颤动

import numpy as np 
from scipy.interpolate import splprep, splev 
import matplotlib.pyplot as plt 

# points and spline 
pts = np.array([[0,0],[1,1],[2,np.sqrt(2)],[4,2],[9,3]]) 
tck, u = splprep(pts.T, u=None, k=3, s=0.0, per=0) 

# compute new points and derivatives 
u_new = np.linspace(u.min(), u.max(), 5*u.shape[0]) 
x_new, y_new = splev(u_new, tck, der=0) 
xp_num, yp_num = splev(pts, tck, der=1) # numerical derivatices 
xp_the, yp_the= pts[1:,0], 0.5/np.sqrt(pts[1:,0]) # analytical derivatives 
#R = normalized(yp_the/xp_the) 
N = np.linalg.norm(np.array([xp_the, yp_the]), axis=0) 

X,Y = pts[1:,0], pts[1:,1] 
#U,V = X + R[1:,0], Y+R[1:,1] 
U,V = X + xp_the/N, Y + X*yp_the/N # delta Y = dy/dx * x 

plt.axes().set_aspect('equal', 'datalim') 

plt.plot(x_new,y_new,'-b') 
plt.plot(pts[:,0],pts[:,1],'--ro') 
#plt.quiver(X,Y,U,V, scale=10, pivot='mid')# angles='xy', scale_units=’xy’, scale=1 

plt.plot((X, U), (Y, V), '-k', lw=3) 

enter image description here

+0

对不起我的错误。我打算用'xp_num'和'yp_num'来绘制切线。 – Mahdi