2012-11-15 22 views
0

我有一個向量與空間兩點分鐘,例如:在離散數據點一個點找到切向量

A = np.array([-1452.18133319 3285.44737438 -7075.49516676]) 
B = np.array([-1452.20175668 3285.29632734 -7075.49110863]) 

我想找到載體的切線沿一個離散點曲線,gg曲線的開始和結束。我知道如何在Matlab中完成它,但我想用Python來完成。這是Matlab中的代碼:

A = [-1452.18133319 3285.44737438 -7075.49516676]; 
B = [-1452.20175668 3285.29632734 -7075.49110863]; 
points = [A; B]; 
distance = [0.; 0.1667]; 
pp = interp1(distance, points,'pchip','pp'); 
[breaks,coefs,l,k,d] = unmkpp(pp); 
dpp = mkpp(breaks,repmat(k-1:-1:1,d*l,1).*coefs(:,1:k-1),d); 
ntangent=zeros(length(distance),3); 
for j=1:length(distance) 
    ntangent(j,:) = ppval(dpp, distance(j)); 
end 

%The solution would be at beginning and end: 
%ntangent = 
% -0.1225 -0.9061 0.0243 
% -0.1225 -0.9061 0.0243  

任何想法?我試圖用多種方法使用numpy和scipy來找到解決方案,例如

tck, u= scipy.interpolate.splprep(data) 

但沒有方法似乎滿足我想要的東西。

+1

思路:找到蟒等效的你正在使用的matlab函數。嘗試使用新功能轉換代碼。詢問你是否找不到功能。試錯。但請不要在這裏基本上說「把這個matlab代碼轉換爲python」。 – tiago

+0

對不起蒂亞戈,但你不知道你在說什麼。我已經嘗試過在scipy中使用這些函數,但它們不符合要求或方法。我不是簡單地要求將Matlab轉換爲我的代碼。如果你不能提供幫助,那就不要提供誹謗言論 – Nader

+0

Nader,從你最初的問題來看,沒有關於你曾經嘗試過什麼和沒有起作用的具體信息。除非你是特定的,否則你的問題就像是「爲我翻譯這段代碼」。我不知道MATLAB,因此有了這樣的問題,我的幫助意願非常有限。 – tiago

回答

-2

確定,我發現瞭解決方案,它是上述的「PV」稍加修改(注意splev僅適用於一維向量) 我最初使用「tck,u = scipy.interpolate.splprep(data)」時遇到的一個問題是,它需要最少4分才能工作(Matlab有兩點)。我使用了兩點。增加數據點後,它按我的意願工作。

這裏是爲了完整的解決方案:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy import interpolate 
data = np.array([[-1452.18133319 , 3285.44737438, -7075.49516676], 
       [-1452.20175668 , 3285.29632734, -7075.49110863], 
       [-1452.32645025 , 3284.37412457, -7075.46633213], 
       [-1452.38226151 , 3283.96135828, -7075.45524248]]) 

distance=np.array([0., 0.15247556, 1.0834, 1.50007]) 

data = data.T 
tck,u = interpolate.splprep(data, u=distance, s=0) 
yderv = interpolate.splev(u,tck,der=1) 

和切線(其Matlab的結果相匹配,如果使用相同的數據):

(-0.13394599723751408, -0.99063114953803189, 0.026614957159932656) 
(-0.13394598523149195, -0.99063115868512985, 0.026614950816003666) 
(-0.13394595055068903, -0.99063117647357712, 0.026614941718878599) 
(-0.13394595652952143, -0.9906311632471152, 0.026614954146007865) 
+0

'splprep'最少需要4個點,因爲默認情況下它使用三次樣條。如果你用'k = 1'調用它,它將恢復爲線性樣條。如果Matlab只需要兩個點就可以做三次樣條,那麼Matlab必須非常棒。 – tiago

4

der=1到splev得到花鍵的衍生物:

from scipy import interpolate 
import numpy as np 
t=np.linspace(0,1,200) 
x=np.cos(5*t) 
y=np.sin(7*t) 
tck, u = interpolate.splprep([x,y]) 

ti = np.linspace(0, 1, 200) 
dxdt, dydt = interpolate.splev(ti,tck,der=1) 
+0

脾臟只適用於一維載體,我需要使用splprep。雖然謝謝! – Nader

+0

什麼? splev評估由splprep生成的樣條,它工作正常。 –

+0

pv,在你的原始文章中,你使用了「splrep」而不是「splprep」,它通過了我,因爲它給了錯誤。但是,您的想法對於我的解決方案非常有幫助。我發現「splrep」和「splprep」令人困惑,因爲它是東部錯過了差異。 – Nader