Общедоступный API
#
ChainRulesCore.rrule
— Method
ChainRulesCore.rrule(itp::AbstractInterpolation, x...)
Метод rrule
из пакета ChainRulesCore.jl для интеграции с библиотеками автоматического дифференцирования. Обратите внимание, что он возвращает только градиент относительно точки расчета x
, но не данные внутри itp
.
#
Interpolations.bounds
— Method
bounds(itp::AbstractInterpolation)
Возвращает границы bounds
области itp
в виде кортежа пар (min, max)
для каждой координаты. Лучше всего это пояснить на примере:
julia> itp = interpolate([1 2 3; 4 5 6], BSpline(Linear()));
julia> bounds(itp)
((1, 2), (1, 3))
julia> data = 1:3;
julia> knots = ([10, 11, 13.5],);
julia> itp = interpolate(knots, data, Gridded(Linear()));
julia> bounds(itp)
((10.0, 13.5),)
#
Interpolations.constant_interpolation
— Function
etp = constant_interpolation(knots, A; extrapolation_bc=Throw())
Краткая форма записи для extrapolate(interpolate(knots, A, scheme), extrapolation_bc)
, где scheme
— это либо BSpline(Constant())
, либо Gridded(Constant())
в зависимости от того, является ли knots
диапазонами или векторами.
При необходимости используйте interpolate
или extrapolate
явным образом вместо этого удобного конструктора. При отсутствии экстраполяции производительность повышается.
#
Interpolations.cubic_spline_interpolation
— Function
etp = cubic_spline_interpolation(knots, A; bc=Line(OnGrid()), extrapolation_bc=Throw())
Краткая форма записи для extrapolate(scale(interpolate(A, BSpline(Cubic(bc))),knots), extrapolation_bc)
.
При необходимости используйте interpolate
, scale
или extrapolate
явным образом вместо этого удобного конструктора. При отсутствии масштабирования или экстраполяции производительность повышается.
#
Interpolations.extrapolate
— Method
extrapolate(itp, scheme)
добавляет экстраполяцию к объекту интерполяции согласно указанной схеме.
Схема может иметь одно из следующих значений.
-
Throw
— если индексы выходят за допустимые границы, выдается ошибка BoundsError; -
Flat
— константная экстраполяция по ближайшему значению в границах допустимого интервала; -
Line
— линейная экстраполяция (заключенный в оболочку объект интерполяции должен поддерживать градиент); -
Reflect
— экстраполяция с отражением (индексы должны поддерживатьmod
); -
Periodic
— периодическая экстраполяция (индексы должны поддерживатьmod
).
Схемы также можно объединять в кортежи. Например, схема (Line(), Flat())
использует линейную экстраполяцию по первому измерению и константную по второму.
Наконец, можно задать разные режимы экстраполяции в разных направлениях. При Line(),Flat(, Flat())
экстраполяция по первому измерению будет линейной, если индекс слишком маленький, но константной, если он слишком большой, а по второму измерению всегда будет константной.
#
Interpolations.extrapolate
— Method
extrapolate(itp, fillvalue)
создает объект экстраполяции, который возвращает fillvalue
, когда индексы в itp(x1,x2,...)
выходят за допустимые границы.
#
Interpolations.interpolate!
— Method
Версия interpolate
, выполняемая на месте. Уничтожает входной массив A
и может усекать область в конечных точках.
#
Interpolations.interpolate
— Method
itp = interpolate(A, interpmode, gridstyle, λ, k)
Интерполирует массив A
в режиме, определяемом аргументами interpmode
и gridstyle
, с регуляризацией согласно [1] порядка k
с константой λ
. interpmode
может иметь одно из следующих значений:
-
BSpline(NoInterp())
-
BSpline(Linear())
-
BSpline(Quadratic(BC()))
(см. описание типаBoundaryCondition
) -
BSpline(Cubic(BC()))
Значением может быть также кортеж таких значений, если по каждой оси должна использоваться особая интерполяционная схема.
Аргумент gridstyle
должен иметь одно из следующих значений: OnGrid()
или OnCell()
.
k
соответствует производной, на которую накладывается штраф. В пределе λ->∞ интерполяционная функция представляет собой многочлен порядка k-1
. Значение 2 является наиболее общим.
Значение λ
должно быть неотрицательным. Если оно равно нулю, происходит интерполяция без регуляризации.
#
Interpolations.interpolate
— Method
itp = interpolate(A, interpmode)
Интерполирует массив A
в режиме, определяемом аргументом interpmode
. interpmode
может иметь одно из следующих значений:
-
NoInterp()
-
BSpline(Constant())
-
BSpline(Linear())
-
BSpline(Quadratic(bc))
(см. описание типаBoundaryCondition
) -
BSpline(Cubic(bc))
Значением может быть также кортеж таких значений, если по каждой оси должна использоваться особая интерполяционная схема.
#
Interpolations.interpolate
— Method
itp = interpolate((nodes1, nodes2, ...), A, interpmode)
Интерполирует массив A
на неравномерной, но прямоугольной сетке, определяемой аргументом nodes
, в режиме, определяемом аргументом interpmode
.
interpmode
может иметь одно из следующих значений:
-
NoInterp()
-
Gridded(Constant())
-
Gridded(Linear())
Значением может быть также кортеж таких значений, если по каждой оси должна использоваться особая интерполяционная схема.
#
Interpolations.knots
— Method
knots(itp::AbstractInterpolation)
knots(etp::AbstractExtrapolation)
Возвращает итератор по позициям узлов для AbstractInterpolation или AbstractExtrapolation.
Итератор будет выдавать скалярные значения для интерполяций по одному измерению и кортежи координат для интерполяций более высокой размерности. Итерация по большему количеству измерений рассчитывается как произведение узлов по каждому измерению.
То есть Iterator.product(узлы по 1-му измерению, узлы по 2-му измерению, …)
Экстраполяции с граничными условиями Periodic или Reflect выдают бесконечные последовательности узлов.
Пример
julia> using Interpolations;
julia> etp = linear_interpolation([1.0, 1.2, 2.3, 3.0], rand(4); extrapolation_bc=Periodic());
julia> Iterators.take(knots(etp), 5) |> collect
5-element Vector{Float64}:
1.0
1.2
2.3
3.0
3.2
#
Interpolations.knotsbetween
— Method
knotsbetween(iter; start, stop)
knotsbetween(iter, start, stop)
Выполняет итерацию по всем узлам iter
, соответствующим условию start < k < stop
.
Значением iter
может быть объект AbstractInterpolation
или результат выполнения метода knots
(то есть объект KnotIterator
или ProductIterator
, являющийся оболочкой для KnotIterator
).
Если аргумент start
не указан, итерация начинается с первого узла. Если не указан ни аргумент start
, ни аргумент stop
, происходит ошибка ArgumentError
.
Если таких узлов не существует, возвращается KnotIterator длиной 0.
Пример
julia> using Interpolations;
julia> etp = linear_interpolation([1.0, 1.2, 2.3, 3.0], rand(4); extrapolation_bc=Periodic());
julia> knotsbetween(etp; start=38, stop=42) |> collect
6-element Vector{Float64}:
38.3
39.0
39.2
40.3
41.0
41.2
#
Interpolations.linear_interpolation
— Function
etp = linear_interpolation(knots, A; extrapolation_bc=Throw())
Краткая форма записи для одного из следующих вызовов:
-
extrapolate(scale(interpolate(A, BSpline(Linear())), knots), extrapolation_bc)
-
extrapolate(interpolate(knots, A, Gridded(Linear())), extrapolation_bc)
,
в зависимости от того, содержит ли knots
диапазоны или векторы.
При необходимости используйте interpolate
, scale
или extrapolate
явным образом вместо этого удобного конструктора. При отсутствии масштабирования или экстраполяции производительность повышается.
#
Interpolations.scale
— Method
scale(itp, xs, ys, ...)
масштабирует существующий объект интерполяции так, чтобы было возможным индексирование с использованием координатных осей, отличных от единичных диапазонов. Для этого объект интерполяции заключается в оболочку, а при индексировании индексы приводятся от предоставленных осей к единичным диапазонам.
Параметры xs
и т. д. должны быть либо диапазонами, либо linspace, причем для каждого измерения в объекте интерполяции должен быть один диапазон координат или linspace.
Для каждого измерения NoInterp
в объекте интерполяции диапазон должен быть в точности равен 1:size(itp, d)
.
#
Interpolations.AkimaMonotonicInterpolation
— Type
AkimaMonotonicInterpolation
Монотонная интерполяция методом, предложенным в работе Акимы (1970), A New Method of Interpolation and Smooth Curve Fitting Based on Local Procedures, doi: 10.1145/321607.321609.
Тангенсы определяются в окрестности каждой заданной точки, результаты близки к нарисованным вручную кривым
#
Interpolations.CardinalMonotonicInterpolation
— Type
CardinalMonotonicInterpolation(tension)
Кубические фундаментальные сплайны с использованием параметра tension
(натяжение), значение которого должно находиться в интервале [0,1]. Кубические фундаментальные сплайны могут давать выбросы для немонотонных данных (увеличение натяжения снижает выбросы).
#
Interpolations.Constant
— Type
Постоянные B-сплайны служат для интерполяции по алгоритму ближайшего соседа и фактически возвращают A[round(Int,x)]
при интерполяции без масштабирования. Масштабирование может привести к неточному определению положения соседних элементов из-за ограниченной числовой точности.
Constant{Previous}
выполняет интерполяцию к предыдущему значению, что эквивалентно A[floor(Int,x)]
без масштабирования. Constant{Next}
выполняет интерполяцию к следующему значению, что эквивалентно A[ceil(Int,x)]
без масштабирования.
#
Interpolations.Cubic
— Type
Cubic(bc::BoundaryCondition)
Указывает, что для соответствующей оси должна использоваться кубическая интерполяция.
Расширенная справка
При условии равномерных узлов с интервалом 1 i
-й фрагмент кубического сплайна, реализуемого таким способом, определяется следующим образом:
y_i(x) = cm p(x-i) + c q(x-i) + cp q(1- (x-i)) + cpp p(1 - (x-i))
где
p(δx) = 1/6 * (1-δx)^3 q(δx) = 2/3 - δx^2 + 1/2 δx^3
и значения cX
для X ∈ {m, _, p, pp}
являются предварительно отфильтрованными коэффициентами.
На будущее имейте в виду, что это выражение развертывается в следующий многочлен:
y_i(x) = 1/6 cm (1+i-x)^3 + c (2/3 - (x-i)^2 + 1/2 (x-i)^3) + cp (2/3 - (1+i-x)^2 + 1/2 (1+i-x)^3) + 1/6 cpp (x-i)^3
При выводе граничных условий используются производные y_0'(x)
и y_0''(x)
#
Interpolations.CubicHermite
— Type
CubicHermite
Этот тип намеренно не отражен в документации, так как его интерфейс должен кардинально измениться в будущем так, чтобы он согласовывался с интерфейсом AbstractInterpolation
. Этот API следует считать крайне нестабильным и поэтому закрытым; в доработанном выпуске в его код могут быть внесены критические изменения.
#
Interpolations.FiniteDifferenceMonotonicInterpolation
— Type
FiniteDifferenceMonotonicInterpolation
Классическая кубическая интерполяция без параметра натяжения. Метод конечных разностей может давать выбросы для немонотонных данных.
#
Interpolations.Flat
— Type
Flat(gt)
задает угловой коэффициент экстраполяции равным нулю.
#
Interpolations.FritschButlandMonotonicInterpolation
— Type
FritschButlandMonotonicInterpolation
Монотонная интерполяция методом, предложенным в работе Фритча (Fritsch) и Бутленда (Butland) (1984), A Method for Constructing Local Monotone Piecewise Cubic Interpolants, doi: 10.1137/0905021.
Выполняется быстрее, чем FritschCarlsonMonotonicInterpolation (требуется только один проход), но имеет несколько большее «натяжение».
#
Interpolations.FritschCarlsonMonotonicInterpolation
— Type
FritschCarlsonMonotonicInterpolation
Монотонная интерполяция методом, предложенным в работе Фритча (Fritsch) и Карлсона (Carlson) (1980), Monotone Piecewise Cubic Interpolation, doi: 10.1137/0717021.
Тангенсы сначала инициализируются, а затем корректируются, если не являются монотонными. Может давать выбросы для немонотонных данных.
#
Interpolations.InPlace
— Type
InPlace(gt)
— это граничное условие, которое позволяет выполнять предварительную фильтрацию на месте (обычное требуется заполнение).
#
Interpolations.InPlaceQ
— Type
InPlaceQ(gt)
аналогично InPlace(gt)
, но является точным, когда интерполируемые значения получаются из базового квадратичного уравнения. В первую очередь полезно для тестирования, так как обеспечивает почти точное (на уровне машинной точности) сравнение с истинным значением.
#
Interpolations.Lanczos
— Type
Lanczos{N}(a=4)
Повторная выборка методом Ланцоша с помощью ядра с масштабным параметром a
и поддержкой N
соседних элементов.
Такая форма интерполяции представляет собой попросту дискретную свертку выборок с помощью ядра Ланцоша размером a
. Размер непосредственно влияет на то, насколько «отдаленная» информация учитывается при интерполяции, и связан со временем выполнения зависимостью O(N^2)
. Альтернативная реализация, соответствующая алгоритму lanczos4
из OpenCV, доступна в Lanczos4OpenCV.
#
Interpolations.Lanczos4OpenCV
— Type
Lanczos4OpenCV()
Альтернативная реализация повторной выборки методом Ланцоша с использованием алгоритма lanczos4
из OpenCV: https://github.com/opencv/opencv/blob/de15636724967faf62c2d1bce26f4335e4b359e5/modules/imgproc/src/resize.cpp#L917-L946
#
Interpolations.Line
— Type
Line(gt)
использует постоянный угловой коэффициент для экстраполяции.
#
Interpolations.Linear
— Type
Linear()
Указывает, что для соответствующей оси должна использоваться линейная интерполяция.
Расширенная справка
При условии равномерных узлов с интервалом 1 i
-й фрагмент линейного B-сплайна, реализуемого таким способом, определяется следующим образом:
y_i(x) = c p(x) + cp p(1-x)
где
p(δx) = x
и значения cX
для X ∈ {_, p}
являются коэффициентами.
Линейные B-сплайны интерполируются естественным образом и не требуют предварительной фильтрации, поэтому указывать граничные условия не требуется.
Хотя данный метод реализован немного иначе, чтобы можно было использовать общий фреймворк для B-сплайнов, итоговый интерполянт — это просто кусочно-линейная функция, соединяющая каждую пару соседних точек данных.
#
Interpolations.LinearMonotonicInterpolation
— Type
LinearMonotonicInterpolation
Простая линейная интерполяция.
#
Interpolations.Nearest
— Type
Параметр по умолчанию для Constant
, выполняющий интерполяцию по алгоритму ближайшего соседа. Может также указываться в виде
Constant() === Constant{Nearest}()
#
Interpolations.Next
— Type
Параметр для Constant
, выполняющий интерполяции по алгоритму следующего соседа. Применяется следующим образом.
Constant{Next}()
#
Interpolations.NoInterp
— Type
NoInterp()
указывает, что для соответствующей оси должно использоваться целочисленное индексирование (интерполяция не производится).
#
Interpolations.OnCell
— Type
OnCell()
указывает, что граничное условие применяется в половине шага сетки перед первым узлом и после последнего.
#
Interpolations.OnGrid
— Type
OnGrid()
указывает, что граничное условие применяется в первом и последнем узлах.
#
Interpolations.Periodic
— Type
Periodic(gt)
применяет периодические граничные условия.
#
Interpolations.Previous
— Type
Параметр для Constant
, выполняющий интерполяции по алгоритму предыдущего соседа. Применяется следующим образом. ´´´ Constant{Previous}() ´´´
#
Interpolations.Quadratic
— Type
Quadratic(bc::BoundaryCondition)
Указывает, что для соответствующей оси должна использоваться квадратичная интерполяция.
Расширенная справка
При условии равномерных узлов с интервалом 1 i
-й фрагмент квадратичного сплайна, реализуемого таким способом, определяется следующим образом:
y_i(x) = cm p(x-i) + c q(x) + cp p(1-(x-i))
где
p(δx) = (δx - 1)^2 / 2 q(δx) = 3/4 - δx^2
и значения cX
для X ∈ {m,_,p}
являются предварительно отфильтрованными коэффициентами.
На будущее имейте в виду, что это выражение развертывается в следующий многочлен:
y_i(x) = cm * 1/2 * (x-i-1)^2 + c * (3/4 - x + i)^2 + cp * 1/2 * (x-i)^2
При выводе граничных условий используются производные y_1'(x-1)
и y_1''(x-1)
#
Interpolations.Reflect
— Type
Reflect(gt)
применяет отражательные граничные условия.
#
Interpolations.SteffenMonotonicInterpolation
— Type
SteffenMonotonicInterpolation
Монотонная интерполяция методом, предложенным в работе Стеффена (Steffen) (1990), A Simple Method for Monotonic Interpolation in One Dimension, http://adsabs.harvard.edu/abs/1990A%26A…239..443S
Только один проход; результат обычно представляет собой нечто среднее между результатами методов FritschCarlson и FritschButland.
#
Interpolations.Throw
— Type
Throw(gt)
вызывает ошибку при выходе интерполяции за границы.
Внутренний API
#
Interpolations.boundstep
— Function
Возвращает половину ширины одного шага диапазона.
Эта функция служит для вычисления верхней и нижней границ объектов интерполяции OnCell
.
#
Interpolations.count_interp_dims
— Method
n = count_interp_dims(ITP)
Подсчитывает количество измерений, по которым интерполируется тип ITP
. Измерения NoInterp
не учитываются.
#
Interpolations.deduplicate_knots!
— Method
Interpolations.deduplicate_knots!(knots; move_knots = false)
Makes knots unique by incrementing repeated but otherwise sorted knots using `nextfloat`.
If keyword `move_knots` is true, then `nextfloat` will be applied successively until knots
are unique. Otherwise, a warning will be issued.
# Пример
```jldoctest
julia> knots = [-8.0, 0.0, 20.0, 20.0]
4-element Vector{Float64}:
-8.0
0.0
20.0
20.0
julia> Interpolations.deduplicate_knots!(knots)
4-element Vector{Float64}:
-8.0
0.0
20.0
20.000000000000004
julia> Interpolations.deduplicate_knots!([1.0, 1.0, 1.0, nextfloat(1.0), nextfloat(1.0)]; move_knots = true)
5-element Vector{Float64}:
1.0
1.0000000000000002
1.0000000000000004
1.0000000000000007
1.0000000000000009
```
#
Interpolations.gradient_weights
— Function
w = gradient_weights(degree, δx)
Вычисляет веса для интерполяции градиента со смещением δx
от «базовой» позиции. degree
описывает интерполяционную схему.
Пример
julia> Interpolations.gradient_weights(Linear(), 0.2)
(-1.0, 1.0)
Определяет градиент линейной интерполяции со смещением 3,2 как y[4] - y[3]
.
#
Interpolations.hessian_weights
— Function
w = hessian_weights(degree, δx)
Вычисляет веса для интерполяции гессиана со смещением δx
от «базовой» позиции. degree
описывает интерполяционную схему.
Пример
julia> Interpolations.hessian_weights(Linear(), 0.2)
(0.0, 0.0)
Для линейной интерполяции используются отрезки прямой, поэтому вторая производная равна нулю.
#
Interpolations.inner_system_diags
— Function
dl, d, du = inner_system_diags{T,IT}(::Type{T}, n::Int, ::Type{IT})
Вспомогательная функция для создания системы уравнений предварительной фильтрации: генерирует диагонали для трехдиагональной матрицы размером n
на n
с типом элементов T
, соответствующим типу интерполяции IT
.
dl
, d
и du
предназначены для использования, например, в таком вызове: M = Tridiagonal(dl, d, du)
.
#
Interpolations.inner_system_diags
— Method
Cubic
: непрерывность значения функции, выдаваемого первой и второй производной.
2/3 1/6 1/6 2/3 1/6 1/6 2/3 1/6 ⋱ ⋱ ⋱
#
Interpolations.nextknotidx
— Method
nextknotidx(iter::KnotIterator, x)
Возвращает индекс первого узла, соответствующего условию x < k
, или nothing
, если такого узла нет.
Новые граничные условия должны определяться следующим образом.
nextknotidx(::Type{<:NewBoundaryCondition}, knots::Vector, x)
Здесь knots
— это iter.knots
, а NewBoundaryCondition
— новые граничные условия. Этот метод должен работать со значениями x
, как находящимися внутри границ, так и экстраполированными.
#
Interpolations.prefiltering_system
— Function
M, b = prefiltering_system{T,TC,GT<:GridType,D<:Degree}m(::T, ::Type{TC}, n::Int, ::Type{D}, ::Type{GT})
Для заданных типов элементов (T
, TC
) и интерполяционной схемы (GT
, D
), а также количества строк в выходных данных (n
) вычисляет систему, используемую для предварительной фильтрации коэффициентов сплайна. Граничные условия определяют значения в первой и последней строках.
Некоторые из граничных условий требуют, чтобы в этих строках были нетридиагональные элементы (например, элемент [1,3]
матрицы). Для обеспечения эффективного решения тридиагональных систем используется тождество матрицы Вудбери, добавляющее дополнительные элементы не по трем главным диагоналям.
Отфильтрованные коэффициенты получаются путем решения системы уравнений
M * c = v + b
где c
— искомые коэффициенты, а v
— точки данных.
#
Interpolations.prefiltering_system
— Method
Quadratic{Flat}
OnCell
и Quadratic{Reflect}
OnCell
равносильно заданию y_1'(x) = 0
при x=1/2. В результате применения этого условия получается
-cm + c = 0
#
Interpolations.prefiltering_system
— Method
Quadratic{Flat}
OnGrid
и Quadratic{Reflect}
OnGrid
равносильно заданию y_1'(x) = 0
при x=1
. В результате применения этого условия получается
-cm + cp = 0
#
Interpolations.prefiltering_system
— Method
Cubic{Free}
OnGrid
и Cubic{Free}
OnCell
равносильно требованию дополнительной непрерывной производной на границе предпоследнего интервала; это означает y_1'''(2) = y_2'''(2)
, что дает
1 cm -3 c + 3 cp -1 cpp = 0
#
Interpolations.prefiltering_system
— Method
Cubic{Periodic}
OnGrid
замыкает систему, интерпретируя сами коэффициенты как периодические, что дает
c0 = c(N+1)
где N
— количество точек данных.
#
Interpolations.prefiltering_system
— Method
Cubic{Flat}
, OnCell
равносильно заданию y_1'(x) = 0
при x = 1/2
. В результате применения этого условия получается
-9/8 cm + 11/8 c - 3/8 cp + 1/8 cpp = 0
или, что то же самое,
-9 cm + 11 c -3 cp + 1 cpp = 0
(Обратите внимание, что мы используем y_1'(x)
, хотя, строго говоря, это значение не является допустимым в данной области; если бы мы использовали y_0'(x)
, пришлось бы вводить новые коэффициенты и система бы не замыкалась. Вместо этого мы расширяем самый крайний многочлен для получения дополнительного полуинтервала.)
#
Interpolations.prefiltering_system
— Method
Cubic{Flat}
OnGrid
равносильно заданию y_1'(x) = 0
при x = 1
. В результате применения этого условия получается
-cm + cp = 0
#
Interpolations.prefiltering_system
— Method
Cubic{Line}
OnCell
равносильно заданию y_1''(x) = 0
при x = 1/2
. В результате применения этого условия получается
3 cm -7 c + 5 cp -1 cpp = 0
(Обратите внимание, что мы используем y_1'(x)
, хотя, строго говоря, это значение не является допустимым в данной области; если бы мы использовали y_0'(x)
, пришлось бы вводить новые коэффициенты и система бы не замыкалась. Вместо этого мы расширяем самый крайний многочлен для получения дополнительного полуинтервала.)
#
Interpolations.prefiltering_system
— Method
Cubic{Line}
OnGrid
равносильно заданию y_1''(x) = 0
при x = 1
. В результате применения этого условия получается следующее.
1 cm -2 c + 1 cp = 0
#
Interpolations.prefiltering_system
— Method
Quadratic{Free}
OnGrid
и Quadratic{Free}
OnCell
равносильно требованию дополнительной непрерывной производной на границе предпоследнего интервала; это означает y_1''(3/2) = y_2''(3/2)
, что дает
1 cm -3 c + 3 cp - cpp = 0
#
Interpolations.prefiltering_system
— Method
Quadratic{Line}
OnGrid
и Quadratic{Line}
OnCell
равносильно заданию y_1''(x) = 0
при x=1
и x=1/2
соответственно. Так как y_i''(x)
не зависит от x
для квадратичного B-сплайна, оба этих условия дают
1 cm -2 c + 1 cp = 0
#
Interpolations.prefiltering_system
— Method
Quadratic{Periodic}
OnGrid
и Quadratic{Periodic}
OnCell
замыкают систему, интерпретируя сами коэффициенты как периодические, что дает
c0 = c(N+1)
где N
— количество точек данных.
#
Interpolations.priorknotidx
— Method
priorknotidx(iter::KnotIterator, x)
Возвращает индекс последнего узла, соответствующего условию k < x
, или nothing
, если такого узла нет.
Новые граничные условия должны определяться следующим образом.
priorknotidx(::Type{<:NewBoundaryCondition}, knots::Vector, x)
Здесь knots — это iter.knots
, а NewBoundaryCondition
— новое граничное условие. Этот метод должен работать со значениями x
, как находящимися внутри границ, так и экстраполированными.
#
Interpolations.rescale_gradient
— Function
rescale_gradient(r::AbstractRange)
Реализует цепное правило dy/dx = dy/du * du/dx, используемое при вычислении градиентов с масштабируемыми объектами интерполяции.
#
Interpolations.root_storage_type
— Method
Interpolations.root_storage_type(::Type{<:AbstractInterpolation}) -> Type{<:AbstractArray}
Эта функция возвращает тип массива корневых коэффициентов для AbstractInterpolation
. Некоторые массивы-оболочки, такие как OffsetArray
, должны пропускаться.
#
Interpolations.show_ranged
— Method
show_ranged(io, X, knots)
Замена метода show
по умолчанию для массивов, предназначенная для типов, у которых может не быть канонических точек расчета. rngs
— это кортеж узлов по каждой оси.
#
Interpolations.value_weights
— Function
w = value_weights(degree, δx)
Вычисляет веса для интерполяции значения со смещением δx
от «базовой» позиции. degree
описывает интерполяционную схему.
Пример
julia> Interpolations.value_weights(Linear(), 0.2)
(0.8, 0.2)
Согласуется с тем фактом, что линейная интерполяция при x + 0.2
имеет вид 0.8*y[x] + 0.2*y[x+1]
.
#
Interpolations.weightedindexes
— Method
weightedindexes(fs, itpflags, nodes, xs)
Вычисляет значения WeightedIndex
для вычисления в позиции xs...
. fs
— это функция или кортеж функций, которые определяют требуемые типы индексов, обычно value_weights
, gradient_weights
и (или) hessian_weights
. itpflags
и nodes
можно получить из itpinfo(itp)...
.
Дополнительные сведения см. в документации разработчика.
#
Interpolations.BSplineInterpolation
— Type
BSplineInterpolation{T,N,TCoefs,IT,Axs}
Тип интерполянта для интерполяции B-сплайнами на равномерной сетке с целочисленными узлами. T
означает тип элементов для таких операций, как collect(itp)
, и может согласовываться со значениями, получаемыми в результате вызова itp(x, y, ...)
, по крайней мере для некоторых типов x
и y
. N
— это размерность интерполянта. Остальные параметры типа описывают типы полей:
-
Поле
coefs
содержит интерполяционные коэффициенты. В зависимости от предварительной фильтрации они могут совпадать или не совпадать с предоставленным массивом значений интерполянта. -
parentaxes
содержит оси родительского объекта. В зависимости от предварительной фильтрации они могут быть «уже» осейcoefs
. -
it
содержит тип интерполяции, напримерBSpline(Linear())
или(BSpline(Quadratic(OnCell()),BSpline(Linear()))
.
Объекты BSplineInterpolation
обычно создаются с помощью функции interpolate
. Однако для более точного контроля их можно создавать с помощью следующего вызова:
BSplineInterpolation(TWeights, coefs, it, axs)
Здесь T
вычисляется как произведение TWeights
и eltype(coefs)
. (Это равносильно указанию того, что вычисление будет производиться в позициях itp(x::TWeights, y::TWeights, ...)
.)
#
Interpolations.BoundaryCondition
— Type
BoundaryCondition
Абстрактный тип, имеющий одно из следующих значений (подробные сведения о каждом из них см. в справке):
-
Throw(gt)
-
Flat(gt)
-
Line(gt)
-
Free(gt)
-
Periodic(gt)
-
Reflect(gt)
-
InPlace(gt)
-
InPlaceQ(gt)
#
Interpolations.BoundsCheckStyle
— Type
BoundsCheckStyle(itp)
Признак, определяющий диспетчеризацию проверки границ для itp
. Может возвращать NeedsCheck()
, в случае чего проверка границ выполняется, или CheckWillPass()
, в случае чего проверка возвращает true
.
#
Interpolations.GriddedInterpolation
— Method
GriddedInterpolation(typeOfWeights::Type{<:Real},
knots::NTuple{N, AbstractUnitRange },
array::AbstractArray{TCoefs,N},
interpolationType::DimSpec{<:Gridded})
Construct a GriddedInterpolation for generic knots from an AbstractUnitRange.
AbstractUnitRanges are collected to an Array to not confuse bound calculations (See Issue #398)
#
Interpolations.GriddedInterpolation
— Method
GriddedInterpolation(typeOfWeights::Type{<:Real},
knots::NTuple{N, Union{ AbstractVector{T}, Tuple } },
array::AbstractArray{Tel,N},
interpolationType::DimSpec{<:Gridded})
Construct a GriddedInterpolation for generic knots from an AbstractArray
#
Interpolations.KnotIterator
— Type
KnotIterator{T,ET}(k::AbstractArray{T}, bc::ET)
Определяет итератор по узлам в k
на основе граничных условий bc
.
Поля
-
knots::Vector{T}
— интерполируемые узлы оси, по которым производится итерация -
bc::ET
— граничное условие для оси -
nknots::Int
— количество интерполируемых узлов (то естьlength(knots)
)
ET
— это Union{BoundaryCondition,Tuple{BoundaryCondition,BoundaryCondition}}
Интерфейс итератора
Для интерфейса итератора Julia определены следующие методы:
IteratorSize(::Type{KnotIterator})
-> возвращает одно из следующих значений:
-
Base.IsInfinite
, если в результате итерации получается бесконечная последовательность узлов; -
Base.HasLength
, если в результате итерации получается конечная последовательность узлов; -
Base.SizeUnknown
, если значение невозможно определить исходя лишь из информации о типе.
length
и size
-> определены только в том случае, если IteratorSize имеет значение HasLength; в противном случае вызывается MethodError.
IteratorEltype
всегда возвращает HasEltype
, так как типы данных узлов всегда отслеживаются.
eltype
возвращает тип данных узлов.
iterate
определяет итерацию по узлам начиная с первого в прямом направлении по оси.
Узлы для многомерных интерполянтов
Итерация по узлам многомерного интерполянта осуществляется путем заключения нескольких объектов KnotIterator в Iterators.product
.
Индексирование
KnotIterator
предоставляет ограниченную поддержку обращения к узлам по индексам.
-
getindex
предоставляется дляKnotIterator
, но не поддерживает многомерные интерполяции (заключенные вProductIterator
) и нецелочисленные индексы. -
Ошибка
BoundsError
выдается в случае выхода значения за допустимые пределы при условии реализацииcheckbounds
дляKnotIterator
.
julia> using Interpolations;
julia> etp = linear_interpolation([1.0, 1.2, 2.3, 3.0], rand(4); extrapolation_bc=Periodic());
julia> kiter = knots(etp);
julia> kiter[4]
3.0
julia> kiter[36]
24.3
#
Interpolations.KnotRange
— Type
KnotRange(iter::KnotIterator{T}, start, stop)
Определяет итератор по диапазону узлов, соответствующих условию start < k < stop
.
Поля
-
iter::KnotIterator{T}
— базовый объектKnotIterator
, предоставляющий перебираемые узлы -
range::R
— итератор, определяющий диапазон перебираемых индексов узлов, гдеR <: Union{Iterators.Count, UnitRange}
Интерфейс итератора
Для интерфейса итератора Julia определены следующие методы:
Base.IteratorSize
-> возвращает одно из следующих значений:
-
Base.HasLength
, еслиrange
имеет конечную длину; -
Base.IsInfinite
, еслиrange
имеет бесконечную длину; -
Base.SizeUnknown
, если типrange
не определен.
Base.IteratorEltype
-> возвращает Base.EltypeUnknown
, если параметр типа не задан; в противном случае возвращает Base.HasEltype
.
length
и size
-> возвращают количество перебираемых узлов, если IteratorSize !== IsInfinite
; в противном случае выдают MethodError
.
Многомерные интерполянты
Итерация по узлам многомерного интерполянта осуществляется путем заключения нескольких итераторов KnotRange
в Iterators.product
.
#
Interpolations.LanczosInterpolation
— Type
LanczosInterpolation
#
Interpolations.MonotonicInterpolation
— Type
MonotonicInterpolation
Монотонная интерполяция до третьего порядка, представленная типом, узлами и коэффициентами.
#
Interpolations.MonotonicInterpolationType
— Type
MonotonicInterpolationType
Абстрактный класс для всех типов многотонной интерполяции.
#
Interpolations.WeightedIndex
— Type
wi = WeightedIndex(indexes, weights)
Создает взвешенный индекс wi
, который можно представить как обобщение обычного индекса массива в контексте интерполяции. Для обычного вектора a
a[i]
извлекает элемент с индексом i
. При интерполяции обычно требуется получить диапазон индексов, и результатом является некоторая взвешенная комбинация значений массива с этими индексами. Например, для линейной интерполяции в позиции x
между целочисленными значениями i
и i+1
имеем
ret = (1-f)*a[i] + f*a[i+1]
где f = x-i
находится в интервале между 0 и 1. Это можно представить как a[wi]
, где
wi = WeightedIndex(i:i+1, (1-f, f))
то есть
ret = sum(a[indexes] .* weights)
Таким образом, для линейной интерполяции создаются взвешенные индексы с использованием 2-элементного кортежа для weights
и диапазона indexes
длиной 2. Интерполяция более высокого порядка предполагает больше позиций и весов (например, 3-элементные кортежи для квадратичной интерполяции или 4-элементные для кубической).
Для нескольких измерений реализованы разделяемые интерполяционные схемы, предусматривающие несколько взвешенных индексов. Обращение к ним производится в форме A[wi1, wi2, ...]
, где каждый элемент wi
— это WeightedIndex
по соответствующему измерению.
При интерполяции значений сумма weights
обычно равна 1. Однако в случае вычисления градиента или гессиана это не обязательно верно. Например, градиент одномерной линейной интерполяции можно представить в виде
gwi = WeightedIndex(i:i+1, (-1, 1)) g1 = a[gwi]
Для трехмерного массива A
можно вычислить ∂A/∂x₂
(второй компонент градиента) как A[wi1, gwi2, wi3]
, где wi1
и wi3
— веса «значений», а gwi2
— веса «градиента».
indexes
можно предоставить в виде диапазона либо в виде кортежа той же длины, что и weights
. Второй вариант применим, например, в случае периодических граничных условий.