Сплайн в 3-х измерениях для Python

Я ищу функцию, которая имитирует функцию 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()

Вот пример множества точек, образующих плавную кривую (красный), но линия не совпадает с физическими точками данных (зеленый).

Много точек, сплайны промахи

Вот пример изгибов в сплайне (красный), созданных слишком малым количеством точек данных (зеленый). Это больше похоже на то, как выглядит мой набор данных.

Слишком мало точек, изгибы сплайна


person SpaceJam    schedule 21.05.2020    source источник
comment
Добро пожаловать в StackOverflow, что вы уже сделали? Не могли бы вы поделиться своим кодом?   -  person Manu    schedule 22.05.2020
comment
Я добавил дополнительную деталь   -  person SpaceJam    schedule 22.05.2020
comment
Код @SardarUsama предоставляется в текстовой форме   -  person SpaceJam    schedule 22.05.2020


Ответы (1)


Измените свой U на:

unew = np.arange (0, 1.00, 0.005)

person lidiaxp    schedule 19.01.2021