29.1 Одномерная интерполяция
Octave поддерживает несколько методов одномерной интерполяции, большинство из которых описаны в этом разделе. Полиномиальная интерполяция и Интерполяция на рассеянных данных описывают дополнительные методы.
- yi = interp1 (x, y, xi)
- yi = interp1 (y, xi)
- yi = interp1 (…, method)
- yi = interp1 (…, extrap)
- yi = interp1 (…, "left")
- yi = interp1 (…, "right")
- pp = interp1 (…, "pp")
-
Одномерная интерполяция.
Интерполирует входные данные, чтобы определить значение yi в точках xi. Если не указано, x принимается за индексы y (
1:length (y)). Если y является матрицей или N-мерным массивом, интерполяция выполняется по каждому столбцу y.Метод интерполяции method может быть одним из:
"nearest"-
Возвращает ближайшего соседа.
"previous"-
Возвращает предыдущего соседа.
"next"-
Возвращает следующего соседа.
-
"linear"(по умолчанию) -
Линейная интерполяция от ближайших соседей.
"pchip"-
Кубический интерполирующий полином Эрмита — сохраняющая форму интерполяция с плавной первой производной.
"cubic"-
Кубическая интерполяция (то же, что и
"pchip"). "spline"Кубическая сплайновая интерполяция — плавные первая и вторая производные по всей кривой.
Добавление «*» в начало любого из указанных выше методов заставляет
interp1предполагать, что x равномерно распределены, и используются толькоx(1)иx(2). Обычно это быстрее и никогда не медленнее. По умолчанию используется"linear".Если extrap — строка
"extrap", то значения за пределами конечных точек экстраполируются с использованием текущего method. Если extrap — число, то значения за пределами конечных точек заменяются этим числом. Если не указано, extrap по умолчанию равноNA.Если указан строковый аргумент
"pp", то xi не следует указывать, иinterp1возвращает объект кускового полинома. Этот объект позже можно использовать сppval, чтобы оценить интерполяцию. Существует эквивалентность, такая чтоppval (interp1 (x, y, method,."pp"), xi) == interp1 (x, y, xi, method,"extrap")Повторяющиеся точки в x задают разрывную интерполянтную функцию. Может быть не более 2 последовательных точек с одинаковым значением. Если x возрастает, по умолчанию разрывная интерполянта является правонепрерывной. Если x убывает, по умолчанию разрывная интерполянта является левонепрерывной. Условие непрерывности интерполянта можно указать, используя опции
"left"или"right"для выбора левонепрерывной или правонепрерывной интерполянты соответственно. Разрывная интерполяция разрешена только для методов"nearest"и"linear"; во всех остальных случаях значения x должны быть уникальными.Пример использования
interp1:xf = [0:0.05:10]; yf = sin (2*pi*xf/5); xp = [0:10]; yp = sin (2*pi*xp/5); lin = interp1 (xp, yp, xf); near = interp1 (xp, yp, xf, "nearest"); pch = interp1 (xp, yp, xf, "pchip"); spl = interp1 (xp, yp, xf, "spline"); plot (xf,yf,"r", xf,near,"g", xf,lin,"b", xf,pch,"c", xf,spl,"m", xp,yp,"r*"); legend ("original", "nearest", "linear", "pchip", "spline");См. также: pchip, spline, interpft, interp2, interp3, interpn.
Существуют некоторые важные различия между различными методами интерполяции. Метод "spline" гарантирует, что первая и вторая производные интерполированных значений имеют непрерывную производную, в то время как другие методы этого не обеспечивают. Это означает, что результаты метода "spline" обычно более плавные. Если интерполируемая функция фактически гладкая, то "spline" даст превосходные результаты. Однако, если интерполируемая функция каким-то образом разрывна, интерполяция "pchip" может дать лучшие результаты.
Это можно продемонстрировать кодом:
t = -2:2;
dt = 1;
ti =-2:0.025:2;
dti = 0.025;
y = sign (t);
ys = interp1 (t,y,ti,"spline");
yp = interp1 (t,y,ti,"pchip");
ddys = diff (diff (ys)./dti) ./ dti;
ddyp = diff (diff (yp)./dti) ./ dti;
figure (1);
plot (ti,ys,"r-", ti,yp,"g-");
legend ("spline", "pchip", 4);
figure (2);
plot (ti,ddys,"r+", ti,ddyp,"g*");
legend ("spline", "pchip");
Результат которого можно увидеть на рисунке 29.1 и 29.2.
Рисунок 29.1: Сравнение методов интерполяции "pchip" и "spline" для ступенчатой функции
Рисунок 29.2: Сравнение второй производной методов интерполяции "pchip" и "spline" для ступенчатой функции
Интерполяция Фурье — это метод ресемплирования, в котором сигнал преобразуется в частотную область, заполняется нулями, а затем преобразуется обратно во временную область.
- interpft (x, n)
- interpft (x, n, dim)
-
Интерполяция Фурье.
Если x — вектор, то x ресемплируется с n точками. Данные в x считаются равноотстоящими. Если x — матрица или N-мерный массив, интерполяция выполняется по каждому столбцу x.
Если dim указан, то интерполяция выполняется вдоль измерения dim.
interpftпредполагает, что интерполируемая функция является периодической, и поэтому делаются предположения о конечных точках интерполяции.См. также: interp1.
Существует два существенных ограничения интерполяции Фурье. Во-первых, предполагается, что сигнал функции является периодическим, поэтому непериодические сигналы будут плохо представлены на краях. Во-вторых, как сигнал, так и его интерполяция должны быть получены при равноотстоящих точках. Пример использования interpft:
t = 0 : 0.3 : pi; dt = t(2)-t(1);
n = length (t); k = 100;
ti = t(1) + [0 : k-1]*dt*n/k;
y = sin (4*t + 0.3) .* cos (3*t - 0.1);
yp = sin (4*ti + 0.3) .* cos (3*ti - 0.1);
plot (ti, yp, "g", ti, interp1 (t, y, ti, "spline"), "b", ...
ti, interpft (y, k), "c", t, y, "r+");
legend ("sin(4t+0.3)cos(3t-0.1)", "spline", "interpft", "data");
который демонстрирует плохое поведение интерполяции Фурье для непериодических функций, как видно на рисунке 29.3.
Рисунок 29.3: Сравнение interp1 и interpft для непериодических данных
Кроме того, вспомогательные функции spline и lookup, которые лежат в основе функции interp1, могут вызываться напрямую.
- pp = spline (x, y)
- yi = spline (x, y, xi)
-
Возвращает кубический сплайн-интерполянт точек x и y.
При вызове с двумя аргументами возвращает кусковой полином pp, который можно использовать с
ppvalдля оценки полинома в определенных точках.При вызове с третьим входным аргументом
splineвычисляет сплайн в точках xi. Третья форма вызоваspline (x, y, xi)эквивалентнаppval (spline (x, y), xi).Переменная x должна быть вектором длины n.
y может быть либо вектором, либо массивом. Если y — вектор, его длина должна быть либо n, либо
n + 2. Если длина y равна n, то используется граничное условие"not-a-knot". Если длина y равнаn + 2, то первые и последние значения вектора y являются значениями первой производной кубического сплайна в конечных точках.Если y — массив, размер y должен иметь вид
[s1, s2, …, sk, n]или[s1, s2, …, sk, n + 2]. Массив внутренне преобразуется в матрицу, где ведущее измерение задаетсяs1 * s2 * … * sk, а затем каждая строка этой матрицы обрабатывается отдельно. Обратите внимание, что это прямо противоположноinterp1, но сделано для совместимости с MATLAB.
© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v6.4.0/One_002ddimensional-Interpolation.html