Много лет назад NumXL поддерживал функцию интерполяции в качестве утилиты или вспомогательного метода для удовлетворения потребностей наших пользователей в моделировании. К нашему удивлению, эта функция привлекла большое внимание, и мы решили собрать здесь некоторые из наиболее часто задаваемых вопросов о ней.
Что такое интерполяция?
Интерполяция - это численный метод оценки значения новой точки данных на основе диапазона дискретного числа известных точек данных.
Для примера предположим, что значение функции $y=f(x)$ задано в виде набора из пяти (5) различных значений x, как показано на графике ниже.
Теперь мы хотим оценить (т.е. интерполировать) значение функции при $x=5$, используя заданные пять (5) точек данных.
Для целей интерполяции желаемое значение x должно находиться в диапазоне исходного набора данных (например, $2\le x\le 12$).
Прежде чем мы продолжим, давайте ответим на несколько основополагающих вопросов, которые мы часто слышим:
-
А как насчет экстраполяции? Чем она отличается?
Экстраполяция - это процесс оценки значения функции для величины x, которая выходит за пределы диапазона заданного набора данных. -
Поддерживает ли NumXL экстраполяцию?
Да, та же функция NxINTRPL(.) можно использовать для экстраполяции. Обязательно передайте "true" или 1 в аргумент "extrapolate". -
Являются ли подгонка кривых (например, регрессия) и интерполяция одним и тем же?
Подгонка кривых и интерполяция часто используются как взаимозаменяемые понятия, но между ними есть тонкая разница: интерполяция должна точно соответствовать точкам данных, в то время как подгонка кривых должна быть как можно более близкой. -
Следует ли использовать интерполяцию или подгонку кривых?
Это зависит от обстоятельств. Интерполяция предполагает, что точки данных известны идеально (или, по крайней мере, с очень высокой точностью), в то время как подгонка кривых предполагает некоторую степень шума в точках данных.
Подготовка данных
Как мы уже говорили, все методы интерполяции принимают дискретный набор известных точек данных. Для работы с реальными наборами данных используется функция интерполяции NumXL (NxINTRPL) предварительно обрабатывает данные:
- Отсортируйте точки данных в порядке возрастания (по X).
- Беззвучно отбрасывайте точки данных с отсутствующими значениями.
- Замените несколько показаний для одного и того же значения X их средним значением.
ВОПРОСЫ И ОТВЕТЫ:
Q: Должны ли точки данных быть равномерно разделены?
A: Нет, длина интервала между точками данных не обязательно должна быть одинаковой, но мы рекомендуем распределять точки данных по диапазону x, чтобы повысить точность интерполяции и минимизировать влияние провалов.
Методы интерполяции
-
Ступенчатая интерполяция 1: плоская интерполяция вперед:
Методы ступенчатой интерполяции моделируют неизвестную функцию плоской/постоянной между известными точками данных, используя последнее известное значение.
-
Ступенчатая интерполяция 2: Обратная плоская интерполяция:
В случае обратного плоского метода неизвестная функция также моделируется как плоская/постоянная между известными точками данных, но при этом используется уровень непосредственно следующей точки данных.
-
Ступенчатая интерполяция 3: интерполяция ближайших соседей:
При использовании метода ближайших соседей неизвестная функция по-прежнему моделируется плоской/постоянной, но ее уровень определяется уровнем ближайшей точки данных.
-
Линейная интерполяция:
При линейной интерполяции мы соединяем каждую точку данных с соседними с помощью прямых линий.
Обратите внимание, что значения функции между двумя точками данных определяются исключительно этими двумя точками данных.
-
Кубический сплайн: Натуральный сплайн:
Используя метод кубического сплайна, мы строим кусочно-кубический полином на каждом интервале с совпадающими первой и второй производными в заданных точках данных. Вторая производная выбирается равной нулю в первой и последней точках.
Результирующая кривая гладкая, но не "локальная", то есть если функции сильно изменяются (например, x=4), кривая вокруг окружающих точек "шатается" (например, проскакивает в промежуточных точках).
-
Кубический сплайн: AKIMA Сплайн:
Чтобы избежать волнистой кривой естественного кубического сплайна, мы ослабляем непрерывность второй производной вокруг точек данных (узлов), в результате чего получаем некруглые углы.
Как показано на рисунке выше, кривая вокруг точек данных непрерывная, но не гладкая.
-
Кубический сплайн: Штеффен Сплайн:
Сплайн Стеффена добавляет новое ограничение: сегмент кубического сплайна монотонен между точками данных. Никаких колебаний, точка.
Результирующая кривая плавно огибает точки данных и не имеет колебаний между ними. Поэтому минимумы и максимумы могут находиться только в точках данных.
Сплайн Стеффена и его первая производная гарантированно непрерывны, но вторая производная может быть прерывистой.
-
Кубический сплайн: Ограниченный (Крюгер) сплайн:
Крюгер предложил ограниченный кубический сплайн для предотвращения проскакивания, жертвуя гладкостью, поэтому мы больше не требуем непрерывной второй производной в каждой точке и вычисляем значение первой производной численно по окружающим точкам.
Используя ограниченный сплайн (сплайн Крюгера), мы избежали эффекта колебаний при перескоке, характерного для кубического сплайна, и нам не пришлось добавлять ограничения на монотонность.
Существуют и другие типы кубических сплайнов, но мы представили только те, которые в настоящее время поддерживаются в NumXL версии 1.68.
Вопросы и ответы:
Q: Какой тип кубического сплайна следует использовать?
A: Это зависит от характера ваших данных, а также от важности плавной кривой и/или побочного эффекта проскакивания. Во многих случаях мы рекомендуем выбирать ограниченный (Крюгера) кубический сплайн.
Q: Я вижу две функции интерполяции в NumXL: INTERPOLATE(.) и NxINTRPL(.). Какой из них мне следует использовать?
A: Функция INTERPOLATE(.) была нашей ранней функцией реализации, но теперь она устарела. Все вышеупомянутые методы интерполяции доступны только в NxINTRPL(.), поэтому следует использовать только эту функцию.
Q: Функция NxINTRPL(.) принимает в качестве целевого аргумента как одиночное значение, так и массив. Почему?
A: Функция NxINTRPL(.) работает быстрее, если интерполировать сразу для нескольких значений, а не вызывать отдельно для каждого значения. Мы рекомендуем передавать все значения x в нескольких вызовах функции.
Комментарии
Войдите в службу, чтобы оставить комментарий.