Как указать количество узловых точек при использовании scipy.splprep

У меня есть следующий фрагмент кода. Он генерирует трехмерный кубический сплайн заданной трехмерной функции, заданной в параметрической форме. Я в значительной степени адаптировал это к своему случаю, используя онлайн-документацию для splprep и splev.

Но я кое-чего не понимаю. Вот код:

%matplotlib inline
from numpy import arange, cos, linspace, pi, sin, random
from scipy.interpolate import splprep, splev
import matplotlib.pyplot as plt

# make ascending spiral in 3-space
t=linspace(0,1.75*2*pi,100)

x = sin(t)
y = cos(t)
z = t


# spline parameters
s=3.0 # smoothness parameter
k=3 # spline order
nest=-1 # estimate of number of knots needed (-1 = maximal)

# find the knot points
tck,u = splprep([x,y,z],s=s,k=k,nest=-1)

# evaluate spline, including interpolated points
xnew,ynew,znew = splev(linspace(0,1,400),tck)

У меня есть несколько вопросов по поводу этой реализации.

  1. Что именно возвращает кортеж (t,c,k) в этом случае ?. Я прочитал документацию, и в ней говорится, что она возвращает узловые точки, коэффициенты и степень сплайна. Разве узловые точки не должны быть координатами вида (x, y, z) ?. Итак, у нас должно быть "number of knots" таких координатных точек. Но это не то, что возвращается. Нам просто возвращается массив length 11.

  2. Что возвращает u? (В документации указано, что он возвращает значения параметра. Что это означает? Значения параметра t?

  3. Когда я использую nest = -1 (это значение по умолчанию), он использует максимальное количество необходимых узловых точек (в этом случае они используют 11 узловых точек). Но как мне указать собственное количество узловых точек, скажем, 50 или 80 и т. Д.?

Я совершенно не понимаю документацию здесь. Может кто меня просветит, может на примерах?


person 46_and_2    schedule 15.01.2017    source источник


Ответы (1)


Значения параметра u

Идея состоит в том, что ваши точки [x, y, z] являются значениями некоторой параметризованной кривой, исходным параметром в вашем примере является t. Знание значений параметра t помогает понять, как выполнять интерполяцию между этими точками. По этой причине вам предоставляется возможность передать значения параметра в качестве необязательного аргумента u (в этом примере это будет u=t). Но если вы решите не делать этого, метод сделает предположение о значениях параметра на основе расстояний между заданными точками (интервал параметра будет от 0 до 1). Это предположение затем возвращается вам как переменная u, чтобы вы знали, как были интерпретированы данные. Если вы все же передадите u = t в качестве аргумента, u, который вы получите обратно, будет точно таким же.

Вам действительно не нужно u, чтобы использовать сплайн. Однако, если желательно сравнить расположение исходных [x, y, z] точек со значениями сплайна, тогда вы можете передать u в качестве аргумента splev. Более короткий способ объяснить значение u: это то, что splev потребуется для воспроизведения [x,y,z] координат, с которыми вы начали, с некоторыми отклонениями из-за сглаживания.

значения tck

Узлы сплайна t - это точки в интервале параметров, а не в трехмерном пространстве. Поскольку в вашем примере интервал параметра составляет [0,1], выбранный по умолчанию, значения t находятся в этом диапазоне. узел - это место на интервале параметров, где изменяются некоторые коэффициенты сплайна. Конечные точки 0 и 1 технически являются несколькими узлами, поэтому они перечислены несколько раз.

Трехмерный характер кривой выражается коэффициентами c. Вы можете заметить, что это список из трех массивов, по одному для каждой координаты.

Количество узловых точек

У этой процедуры интерполяции есть два варианта:

  • точно сообщите ему, что такое узловые точки (задав task=-1 и предоставив t аргумент для узлов). Во избежание путаницы: это t не обязательно t, из которого вы получили точки [x, y, z]. Необязательно, чтобы каждая точка выборки была узловой точкой.
  • оставьте определение узлов на усмотрение, включая их количество.

Однако количество узлов зависит от значения параметра гладкости s, поэтому на него можно влиять косвенно. Например, с вашими данными есть 11 узлов с s = 3, но 12 узлов с s = 1 и 14 узлов с s = 0,1.

person Community    schedule 15.01.2017