Документация Engee

Общедоступный API

ChainRulesCore.rrule(itp::AbstractInterpolation, x...)

Метод rrule из пакета ChainRulesCore.jl для интеграции с библиотеками автоматического дифференцирования. Обратите внимание, что он возвращает только градиент относительно точки расчета x, но не данные внутри itp.

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),)
etp = constant_interpolation(knots, A; extrapolation_bc=Throw())

Краткая форма записи для extrapolate(interpolate(knots, A, scheme), extrapolation_bc), где scheme — это либо BSpline(Constant()), либо Gridded(Constant()) в зависимости от того, является ли knots диапазонами или векторами.

При необходимости используйте interpolate или extrapolate явным образом вместо этого удобного конструктора. При отсутствии экстраполяции производительность повышается.

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 явным образом вместо этого удобного конструктора. При отсутствии масштабирования или экстраполяции производительность повышается.

extrapolate(itp, scheme) добавляет экстраполяцию к объекту интерполяции согласно указанной схеме.

Схема может иметь одно из следующих значений.

  • Throw — если индексы выходят за допустимые границы, выдается ошибка BoundsError;

  • Flat — константная экстраполяция по ближайшему значению в границах допустимого интервала;

  • Line — линейная экстраполяция (заключенный в оболочку объект интерполяции должен поддерживать градиент);

  • Reflect — экстраполяция с отражением (индексы должны поддерживать mod);

  • Periodic — периодическая экстраполяция (индексы должны поддерживать mod).

Схемы также можно объединять в кортежи. Например, схема (Line(), Flat()) использует линейную экстраполяцию по первому измерению и константную по второму.

Наконец, можно задать разные режимы экстраполяции в разных направлениях. При Line(),Flat(, Flat()) экстраполяция по первому измерению будет линейной, если индекс слишком маленький, но константной, если он слишком большой, а по второму измерению всегда будет константной.

extrapolate(itp, fillvalue) создает объект экстраполяции, который возвращает fillvalue, когда индексы в itp(x1,x2,...) выходят за допустимые границы.

Версия interpolate, выполняемая на месте. Уничтожает входной массив A и может усекать область в конечных точках.

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 является наиболее общим.

Значение λ должно быть неотрицательным. Если оно равно нулю, происходит интерполяция без регуляризации.

itp = interpolate(A, interpmode)

Интерполирует массив A в режиме, определяемом аргументом interpmode. interpmode может иметь одно из следующих значений:

  • NoInterp()

  • BSpline(Constant())

  • BSpline(Linear())

  • BSpline(Quadratic(bc)) (см. описание типа BoundaryCondition)

  • BSpline(Cubic(bc))

Значением может быть также кортеж таких значений, если по каждой оси должна использоваться особая интерполяционная схема.

itp = interpolate((nodes1, nodes2, ...), A, interpmode)

Интерполирует массив A на неравномерной, но прямоугольной сетке, определяемой аргументом nodes, в режиме, определяемом аргументом interpmode.

interpmode может иметь одно из следующих значений:

  • NoInterp()

  • Gridded(Constant())

  • Gridded(Linear())

Значением может быть также кортеж таких значений, если по каждой оси должна использоваться особая интерполяционная схема.

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
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
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 явным образом вместо этого удобного конструктора. При отсутствии масштабирования или экстраполяции производительность повышается.

scale(itp, xs, ys, ...) масштабирует существующий объект интерполяции так, чтобы было возможным индексирование с использованием координатных осей, отличных от единичных диапазонов. Для этого объект интерполяции заключается в оболочку, а при индексировании индексы приводятся от предоставленных осей к единичным диапазонам.

Параметры xs и т. д. должны быть либо диапазонами, либо linspace, причем для каждого измерения в объекте интерполяции должен быть один диапазон координат или linspace.

Для каждого измерения NoInterp в объекте интерполяции диапазон должен быть в точности равен 1:size(itp, d).

AkimaMonotonicInterpolation

Монотонная интерполяция методом, предложенным в работе Акимы (1970), A New Method of Interpolation and Smooth Curve Fitting Based on Local Procedures, doi: 10.1145/321607.321609.

Тангенсы определяются в окрестности каждой заданной точки, результаты близки к нарисованным вручную кривым

BSpline(degree)

Флаг, означающий интерполяцию BSpline (B-сплайн на целочисленной сетке) по соответствующей оси. degree может иметь одно из следующих значений: Constant, Linear, Quadratic или Cubic.

CardinalMonotonicInterpolation(tension)

Кубические фундаментальные сплайны с использованием параметра tension (натяжение), значение которого должно находиться в интервале [0,1]. Кубические фундаментальные сплайны могут давать выбросы для немонотонных данных (увеличение натяжения снижает выбросы).

Постоянные B-сплайны служат для интерполяции по алгоритму ближайшего соседа и фактически возвращают A[round(Int,x)] при интерполяции без масштабирования. Масштабирование может привести к неточному определению положения соседних элементов из-за ограниченной числовой точности.

Constant{Previous} выполняет интерполяцию к предыдущему значению, что эквивалентно A[floor(Int,x)] без масштабирования. Constant{Next} выполняет интерполяцию к следующему значению, что эквивалентно A[ceil(Int,x)] без масштабирования.

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)

 CubicHermite

Этот тип намеренно не отражен в документации, так как его интерфейс должен кардинально измениться в будущем так, чтобы он согласовывался с интерфейсом AbstractInterpolation. Этот API следует считать крайне нестабильным и поэтому закрытым; в доработанном выпуске в его код могут быть внесены критические изменения.

FiniteDifferenceMonotonicInterpolation

Классическая кубическая интерполяция без параметра натяжения. Метод конечных разностей может давать выбросы для немонотонных данных.

Flat(gt) задает угловой коэффициент экстраполяции равным нулю.

FritschButlandMonotonicInterpolation

Монотонная интерполяция методом, предложенным в работе Фритча (Fritsch) и Бутленда (Butland) (1984), A Method for Constructing Local Monotone Piecewise Cubic Interpolants, doi: 10.1137/0905021.

Выполняется быстрее, чем FritschCarlsonMonotonicInterpolation (требуется только один проход), но имеет несколько большее «натяжение».

FritschCarlsonMonotonicInterpolation

Монотонная интерполяция методом, предложенным в работе Фритча (Fritsch) и Карлсона (Carlson) (1980), Monotone Piecewise Cubic Interpolation, doi: 10.1137/0717021.

Тангенсы сначала инициализируются, а затем корректируются, если не являются монотонными. Может давать выбросы для немонотонных данных.

InPlace(gt) — это граничное условие, которое позволяет выполнять предварительную фильтрацию на месте (обычное требуется заполнение).

InPlaceQ(gt) аналогично InPlace(gt), но является точным, когда интерполируемые значения получаются из базового квадратичного уравнения. В первую очередь полезно для тестирования, так как обеспечивает почти точное (на уровне машинной точности) сравнение с истинным значением.

Lanczos{N}(a=4)

Повторная выборка методом Ланцоша с помощью ядра с масштабным параметром a и поддержкой N соседних элементов.

Такая форма интерполяции представляет собой попросту дискретную свертку выборок с помощью ядра Ланцоша размером a. Размер непосредственно влияет на то, насколько «отдаленная» информация учитывается при интерполяции, и связан со временем выполнения зависимостью O(N^2). Альтернативная реализация, соответствующая алгоритму lanczos4 из OpenCV, доступна в Lanczos4OpenCV.

Lanczos4OpenCV()

Альтернативная реализация повторной выборки методом Ланцоша с использованием алгоритма lanczos4 из OpenCV: https://github.com/opencv/opencv/blob/de15636724967faf62c2d1bce26f4335e4b359e5/modules/imgproc/src/resize.cpp#L917-L946

Line(gt) использует постоянный угловой коэффициент для экстраполяции.

Linear()

Указывает, что для соответствующей оси должна использоваться линейная интерполяция.

Расширенная справка

При условии равномерных узлов с интервалом 1 i-й фрагмент линейного B-сплайна, реализуемого таким способом, определяется следующим образом:

y_i(x) = c p(x) + cp p(1-x)

где

p(δx) = x

и значения cX для X ∈ {_, p} являются коэффициентами.

Линейные B-сплайны интерполируются естественным образом и не требуют предварительной фильтрации, поэтому указывать граничные условия не требуется.

Хотя данный метод реализован немного иначе, чтобы можно было использовать общий фреймворк для B-сплайнов, итоговый интерполянт — это просто кусочно-линейная функция, соединяющая каждую пару соседних точек данных.

LinearMonotonicInterpolation

Простая линейная интерполяция.

Параметр по умолчанию для Constant, выполняющий интерполяцию по алгоритму ближайшего соседа. Может также указываться в виде

Constant() === Constant{Nearest}()

Параметр для Constant, выполняющий интерполяции по алгоритму следующего соседа. Применяется следующим образом.

Constant{Next}()

NoInterp() указывает, что для соответствующей оси должно использоваться целочисленное индексирование (интерполяция не производится).

OnCell() указывает, что граничное условие применяется в половине шага сетки перед первым узлом и после последнего.

OnGrid() указывает, что граничное условие применяется в первом и последнем узлах.

Periodic(gt) применяет периодические граничные условия.

Параметр для Constant, выполняющий интерполяции по алгоритму предыдущего соседа. Применяется следующим образом. ´´´ Constant{Previous}() ´´´

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)

Reflect(gt) применяет отражательные граничные условия.

SteffenMonotonicInterpolation

Монотонная интерполяция методом, предложенным в работе Стеффена (Steffen) (1990), A Simple Method for Monotonic Interpolation in One Dimension, http://adsabs.harvard.edu/abs/1990A%26A…​239..443S

Только один проход; результат обычно представляет собой нечто среднее между результатами методов FritschCarlson и FritschButland.

Throw(gt) вызывает ошибку при выходе интерполяции за границы.

Внутренний API

Возвращает половину ширины одного шага диапазона.

Эта функция служит для вычисления верхней и нижней границ объектов интерполяции OnCell.

n = count_interp_dims(ITP)

Подсчитывает количество измерений, по которым интерполируется тип ITP. Измерения NoInterp не учитываются.

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
```
w = gradient_weights(degree, δx)

Вычисляет веса для интерполяции градиента со смещением δx от «базовой» позиции. degree описывает интерполяционную схему.

Пример

julia> Interpolations.gradient_weights(Linear(), 0.2)
(-1.0, 1.0)

Определяет градиент линейной интерполяции со смещением 3,2 как y[4] - y[3].

w = hessian_weights(degree, δx)

Вычисляет веса для интерполяции гессиана со смещением δx от «базовой» позиции. degree описывает интерполяционную схему.

Пример

julia> Interpolations.hessian_weights(Linear(), 0.2)
(0.0, 0.0)

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

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).

Cubic: непрерывность значения функции, выдаваемого первой и второй производной.

2/3 1/6
1/6 2/3 1/6
    1/6 2/3 1/6
       ⋱  ⋱   ⋱
lanczos(x, a, n=a)

Реализация ядра Ланцоша

nextknotidx(iter::KnotIterator, x)

Возвращает индекс первого узла, соответствующего условию x < k, или nothing, если такого узла нет.

Новые граничные условия должны определяться следующим образом.

nextknotidx(::Type{<:NewBoundaryCondition}, knots::Vector, x)

Здесь knots — это iter.knots, а NewBoundaryCondition — новые граничные условия. Этот метод должен работать со значениями x, как находящимися внутри границ, так и экстраполированными.

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 — точки данных.

Quadratic{Flat} OnCell и Quadratic{Reflect} OnCell равносильно заданию y_1'(x) = 0 при x=1/2. В результате применения этого условия получается

-cm + c = 0

Quadratic{Flat} OnGrid и Quadratic{Reflect} OnGrid равносильно заданию y_1'(x) = 0 при x=1. В результате применения этого условия получается

-cm + cp = 0

Cubic{Free} OnGrid и Cubic{Free} OnCell равносильно требованию дополнительной непрерывной производной на границе предпоследнего интервала; это означает y_1'''(2) = y_2'''(2), что дает

1 cm -3 c + 3 cp -1 cpp = 0

Cubic{Periodic} OnGrid замыкает систему, интерпретируя сами коэффициенты как периодические, что дает

c0 = c(N+1)

где N — количество точек данных.

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), пришлось бы вводить новые коэффициенты и система бы не замыкалась. Вместо этого мы расширяем самый крайний многочлен для получения дополнительного полуинтервала.)

Cubic{Flat} OnGrid равносильно заданию y_1'(x) = 0 при x = 1. В результате применения этого условия получается

-cm + cp = 0

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), пришлось бы вводить новые коэффициенты и система бы не замыкалась. Вместо этого мы расширяем самый крайний многочлен для получения дополнительного полуинтервала.)

Cubic{Line} OnGrid равносильно заданию y_1''(x) = 0 при x = 1. В результате применения этого условия получается следующее.

1 cm -2 c + 1 cp = 0

Quadratic{Free} OnGrid и Quadratic{Free} OnCell равносильно требованию дополнительной непрерывной производной на границе предпоследнего интервала; это означает y_1''(3/2) = y_2''(3/2), что дает

1 cm -3 c + 3 cp - cpp = 0

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

Quadratic{Periodic} OnGrid и Quadratic{Periodic} OnCell замыкают систему, интерпретируя сами коэффициенты как периодические, что дает

c0 = c(N+1)

где N — количество точек данных.

priorknotidx(iter::KnotIterator, x)

Возвращает индекс последнего узла, соответствующего условию k < x, или nothing, если такого узла нет.

Новые граничные условия должны определяться следующим образом.

priorknotidx(::Type{<:NewBoundaryCondition}, knots::Vector, x)

Здесь knots — это iter.knots, а NewBoundaryCondition — новое граничное условие. Этот метод должен работать со значениями x, как находящимися внутри границ, так и экстраполированными.

rescale_gradient(r::AbstractRange)

Реализует цепное правило dy/dx = dy/du * du/dx, используемое при вычислении градиентов с масштабируемыми объектами интерполяции.

Interpolations.root_storage_type(::Type{<:AbstractInterpolation}) -> Type{<:AbstractArray}

Эта функция возвращает тип массива корневых коэффициентов для AbstractInterpolation. Некоторые массивы-оболочки, такие как OffsetArray, должны пропускаться.

show_ranged(io, X, knots)

Замена метода show по умолчанию для массивов, предназначенная для типов, у которых может не быть канонических точек расчета. rngs — это кортеж узлов по каждой оси.

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].

weightedindexes(fs, itpflags, nodes, xs)

Вычисляет значения WeightedIndex для вычисления в позиции xs.... fs — это функция или кортеж функций, которые определяют требуемые типы индексов, обычно value_weights, gradient_weights и (или) hessian_weights. itpflags и nodes можно получить из itpinfo(itp)....

Дополнительные сведения см. в документации разработчика.

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, ...).)

BoundaryCondition

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

  • Throw(gt)

  • Flat(gt)

  • Line(gt)

  • Free(gt)

  • Periodic(gt)

  • Reflect(gt)

  • InPlace(gt)

  • InPlaceQ(gt)

Здесь gt — это тип сетки, например OnGrid() или OnCell().

BoundsCheckStyle(itp)

Признак, определяющий диспетчеризацию проверки границ для itp. Может возвращать NeedsCheck(), в случае чего проверка границ выполняется, или CheckWillPass(), в случае чего проверка возвращает true.

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)
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
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
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.

LanczosInterpolation
MonotonicInterpolation

Монотонная интерполяция до третьего порядка, представленная типом, узлами и коэффициентами.

MonotonicInterpolationType

Абстрактный класс для всех типов многотонной интерполяции.

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. Второй вариант применим, например, в случае периодических граничных условий.