Find the tangent vector at a point for discrete data points

I have a vector with min of two points in space, for example:

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

I want to find the tangent to the vector at individual points along the curve, gg is the beginning and end of the curve. I know how to do this in Matlab, but I want to do it in Python. This is the code in 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 

Any ideas? I tried to find a solution using numpy and scipy using several methods, for example.

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

but not one of the methods satisfies what I want.

0
source share
2 answers

ok, I found a solution which is a small modification of ā€œpvā€ above (note that splev only works for 1D vectors) One of the problems that I encountered initially: "tck, u = scipy.interpolate.splprep (data) ", is that it requires a minimum of 4 points to work (Matlab works with two points). I used two points. After enlarging the data points, it works the way I want.

Here is the solution for completeness:

 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) 

and tangents (which match Matlab results if the same data is used):

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

Give der=1 splev to get the derivative of the spline:

 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) 
+4
source

Source: https://habr.com/ru/post/917741/


All Articles