Я ищу функцию, которая имитирует функцию MATLAB cscvn
в их подгонке кривой Панель инструментов, подходящая для точек в трехмерном пространстве. Ближайшей функцией, которую я нашел, была scipy.interpolate .splprep, который может вычислять 3 измерения, но теряет точность с меньшим количеством точек данных. Если гладкость сводится к точке подгонки точек, кривая имеет изгибы.
У меня есть дискретный набор данных, состоящий из физических точек (данных высот), которые я хочу смоделировать, поэтому сплайн должен проходить через эти точки. Существует конечное количество точек, расположенных на разной длине хорды друг от друга.
Вот пример функции быстрого тестирования, которую я написал для проверки сплайнов Python. К сожалению, я не могу поделиться своим кодом MATLAB, но функция cscvn
плавно сплайсирует и проходит через все точки данных.
import scipy as sp
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import splprep, splev, interp2d
x = np.linspace(0, 10, num = 20) #list of known x coordinates
y = 2*x #list of known y coordinates
z = x*x #list of known z coordinates
## Note: You must have more points than degree of the spline. if k = 3, must have 4 points min.
print([x,y,z])
tck, u = splprep([x,y,z], s = 26) # Generate function out of provided points, default k = 3
newPoints = splev(u, tck) # Creating spline points
print(newPoints)
ax = plt.axes(projection = "3d")
ax.plot3D(x, y, z, 'go') # Green is the actual 3D function
ax.plot3D(newPoints[:][0], newPoints[:][1], newPoints[:][2], 'r-') # Red is the spline
plt.show()
Вот пример множества точек, образующих плавную кривую (красный), но линия не совпадает с физическими точками данных (зеленый).
Вот пример изгибов в сплайне (красный), созданных слишком малым количеством точек данных (зеленый). Это больше похоже на то, как выглядит мой набор данных.