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

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

# ChainRulesCore.rruleMethod

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

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

# Interpolations.boundsMethod

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_interpolationFunction

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_interpolationFunction

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

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

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

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

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

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

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

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

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

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

# Interpolations.extrapolateMethod

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

# Interpolations.interpolate!Method

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

# Interpolations.interpolateMethod

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

itp = interpolate(A, interpmode)

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

  • NoInterp()

  • BSpline(Constant())

  • BSpline(Linear())

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

  • BSpline(Cubic(bc))

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

# Interpolations.interpolateMethod

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

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

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

  • NoInterp()

  • Gridded(Constant())

  • Gridded(Linear())

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

# Interpolations.knotsMethod

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

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_interpolationFunction

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

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

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

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

# Interpolations.AkimaMonotonicInterpolationType

AkimaMonotonicInterpolation

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

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

# Interpolations.BSplineType

BSpline(degree)

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

# Interpolations.CardinalMonotonicInterpolationType

CardinalMonotonicInterpolation(tension)

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

# Interpolations.ConstantType

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

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

# Interpolations.CubicType

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

 CubicHermite

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

# Interpolations.FiniteDifferenceMonotonicInterpolationType

FiniteDifferenceMonotonicInterpolation

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

# Interpolations.FlatType

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

# Interpolations.FritschButlandMonotonicInterpolationType

FritschButlandMonotonicInterpolation

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

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

# Interpolations.FritschCarlsonMonotonicInterpolationType

FritschCarlsonMonotonicInterpolation

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

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

# Interpolations.InPlaceType

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

# Interpolations.InPlaceQType

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

# Interpolations.LanczosType

Lanczos{N}(a=4)

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

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

# Interpolations.Lanczos4OpenCVType

Lanczos4OpenCV()

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

# Interpolations.LineType

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

# Interpolations.LinearType

Linear()

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

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

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

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

где

p(δx) = x

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

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

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

# Interpolations.LinearMonotonicInterpolationType

LinearMonotonicInterpolation

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

# Interpolations.NearestType

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

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

# Interpolations.NextType

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

Constant{Next}()

# Interpolations.NoInterpType

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

# Interpolations.OnCellType

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

# Interpolations.OnGridType

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

# Interpolations.PeriodicType

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

# Interpolations.PreviousType

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

# Interpolations.QuadraticType

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

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

# Interpolations.SteffenMonotonicInterpolationType

SteffenMonotonicInterpolation

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

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

# Interpolations.ThrowType

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

Внутренний API

# Interpolations.boundstepFunction

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

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

# Interpolations.count_interp_dimsMethod

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_weightsFunction

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_weightsFunction

w = hessian_weights(degree, δx)

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

Пример

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

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

# Interpolations.inner_system_diagsFunction

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_diagsMethod

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

2/3 1/6
1/6 2/3 1/6
    1/6 2/3 1/6
       ⋱  ⋱   ⋱

# Interpolations.lanczosMethod

lanczos(x, a, n=a)

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

# Interpolations.nextknotidxMethod

nextknotidx(iter::KnotIterator, x)

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

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

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

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

# Interpolations.prefiltering_systemFunction

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_systemMethod

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

-cm + c = 0

# Interpolations.prefiltering_systemMethod

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

-cm + cp = 0

# Interpolations.prefiltering_systemMethod

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

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

# Interpolations.prefiltering_systemMethod

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

c0 = c(N+1)

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

# Interpolations.prefiltering_systemMethod

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_systemMethod

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

-cm + cp = 0

# Interpolations.prefiltering_systemMethod

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_systemMethod

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

1 cm -2 c + 1 cp = 0

# Interpolations.prefiltering_systemMethod

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

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

# Interpolations.prefiltering_systemMethod

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_systemMethod

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

c0 = c(N+1)

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

# Interpolations.priorknotidxMethod

priorknotidx(iter::KnotIterator, x)

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

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

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

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

# Interpolations.rescale_gradientFunction

rescale_gradient(r::AbstractRange)

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

# Interpolations.root_storage_typeMethod

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

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

# Interpolations.show_rangedMethod

show_ranged(io, X, knots)

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

# Interpolations.value_weightsFunction

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

weightedindexes(fs, itpflags, nodes, xs)

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

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

# Interpolations.BSplineInterpolationType

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

BoundaryCondition

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

  • Throw(gt)

  • Flat(gt)

  • Line(gt)

  • Free(gt)

  • Periodic(gt)

  • Reflect(gt)

  • InPlace(gt)

  • InPlaceQ(gt)

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

# Interpolations.BoundsCheckStyleType

BoundsCheckStyle(itp)

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

# Interpolations.GriddedInterpolationMethod

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

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

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

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

LanczosInterpolation

# Interpolations.MonotonicInterpolationType

MonotonicInterpolation

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

# Interpolations.MonotonicInterpolationTypeType

MonotonicInterpolationType

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

# Interpolations.WeightedIndexType

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