приближение функции f (x, y) - PullRequest
1 голос
/ 15 февраля 2011

У меня есть функция af (x, y) = z (определенная в таблице на равномерной сетке), и мне нужно ее приблизить;эта функция гладкая.Результаты аппроксимации должны быть максимально приближены к исходным, производные менее важны.Функциональная область является прямоугольной.Предложите подходы для решения этой задачи, плз.

UPD Мне нужно приближение , а не интерполяция.
UPD2 Форма этой функции очень похожа на поверхность земли
UPD3 Моя основная задача -описывать поверхность с меньшим количеством точек, сохраняя ее форму как можно ближе к оригиналу.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

Я был бы склонен предложить NURBS-приближения для этого. Вы можете сделать приблизительную подгонку в смысле «наименьших квадратов». См., Например, Книга NURBS (Piegl and Tyler, 1997), §9.4.3 . Что касается свободно доступных реализаций, я считаю, что NURBS ++ имеет реализацию этого алгоритма (обязательно проверьте трекер исправлений, прежде чем пытаться его скомпилировать любым современным компилятором). У Octave есть NURBS-пакет , который я раньше не использовал, и я думаю, что у R тоже довольно полный пакет.

Если вы прибываете в этот момент из вероятностного подхода, тогда что-то вроде «смеси гауссов» с использованием EM 'подобного' алгоритма или 'Kriging' может иметь больше смысла .

0 голосов
/ 15 февраля 2011

Итак, у вас есть значения функций через заданные интервалы, такие как (0,0), (0,1), (1,0), (1,1) и т. Д.?Я не думаю, что есть какой-либо «лучший» способ приблизить значения между ними.Вы говорите, что функции «гладкие», поэтому усреднение окружающих значений может быть хорошим.

Учитывая сетку с точечными интервалами (xInterval, yInterval);х идет прямо, а у идет вверх;Я бы сказал что-то вроде этого:

public void setAverage(float y, float x) {
    float dy = (y - yBottom)/yInterval;
    float leftAvgr = leftTopValue * dy + leftBottomValue * (1-dy);
    float rightAvrg = rightTopValue * dy + rightBottomValue * (1-dy);
    float dx = (x - xLeft)/xInterval;
    float avrg = rightAvrg * dx + leftAvgr * (1 - dx);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...