Может ли кто-нибудь описать метод двумерной интерполяции, который лучше, чем билинейная интерполяция?
У меня есть сетка точек данных, на которой я в настоящее время использую билинейную интерполяцию, чтобы найти недостающие точки в сетке. Мне указали в направлениях Кригинг, или, как ты, лучшая линейная объективная оценка, но я не смог найти хороший исходный код или алгебраическое объяснение. Кто-нибудь знает какие-либо другие методы интерполяции, которые я мог бы использовать?
- Обновление @Sam Greenhalgh Я рассмотрел бикубическую интерполяцию, но результаты, которые я получил, используя пример кода, который я нашел, казались неправильными.
Вот пример кода для Bicubic
Заметьте, я пишу на C#, но приветствую примеры и с других языков.
//array 4
double cubicInterpolate(double[] p, double x)
{
return p[1] + 0.5 * x * (p[2] - p[0] + x * (2.0 * p[0] - 5.0 * p[1] + 4.0 * p[2] - p[3] + x * (3.0 * (p[1] - p[2]) + p[3] - p[0])));
}
//array 4 4
public double bicubicInterpolate(double[][] p, double x, double y)
{
double[] arr = new double[4];
arr[0] = cubicInterpolate(p[0], y);
arr[1] = cubicInterpolate(p[1], y);
arr[2] = cubicInterpolate(p[2], y);
arr[3] = cubicInterpolate(p[3], y);
return cubicInterpolate(arr, x);
}
double[][] p = {
new double[4]{2.728562594,2.30599759,1.907579158,1.739559264},
new double[4]{3.254756633,2.760758022,2.210417411,1.979012766},
new double[4]{4.075740069,3.366434527,2.816093916,2.481060234},
new double[4]{5.430966401,4.896723504,4.219613391,4.004306461}
};
Console.WriteLine(CI.bicubicInterpolate(p, 2, 2));
2 ответа
Одним из широко используемых методов интерполяции является кригинг (или регрессия Гаусса).
Однако использование кригинга не рекомендуется, когда ваши точки данных находятся на регулярной сетке. Евклидовы расстояния между точками данных используются для настройки параметров модели. Но в сетке гораздо меньше значений расстояния, чем, скажем, в случайно смоделированном наборе точек.
Тем не менее, даже если ваши данные регулярно размещаются, было бы интересно попробовать. Если вы заинтересованы, вы можете использовать следующие программы:
- Пакет DiceKriging на языке R (существуют другие, такие как kriging, gstat...)
- Набор инструментов DACE в Matlab
- СТК в Матлаб / Октава
- И многие другие (например, в python)...
ПРИМЕЧАНИЕ: может быть интересно отметить (я не совсем точно, в каком контексте вы хотите применить кригинг), что свойство интерполяции кригинга можно очень легко ослабить, чтобы учесть, например, возможные ошибки измерения.
Если ваши точки данных находятся на регулярной сетке, я бы рекомендовал использовать кусочно-линейный сплайн в двух измерениях. Вы можете сначала заполнить данные для строк (значения x), а затем заполнить данные для столбцов (значения y).
Math.NET Numerics имеет кусочно-линейную сплайн-функцию, которая вам понадобится:
MathNet.Numerics.Interpolation.LinearSpline.InterpolateSorted