0

空間内に最小 2 点のベクトルがあります。たとえば、次のようになります。

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)

しかし、どの方法も私が望むものを満たしていないようです。

4

2 に答える 2

6

der=1splev に与えて、スプラインの導関数を取得します。

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)
于 2012-11-16T15:32:43.780 に答える
0

わかりました。上記の「pv」を少し変更した解決策を見つけました(splevは1Dベクトルに対してのみ機能することに注意してください)。「tck、u = scipy.interpolate.splprep(data)」で最初に抱えていた問題の1つは、動作するには最低4ポイントが必要です(Matlabは2ポイントで動作します)。私は2つのポイントを使用していました。データポイントを増やした後、それは私が望むように動作します。

完全性のための解決策は次のとおりです。

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)
于 2012-11-17T05:01:36.030 に答える