Аппроксимация 2D-функции с весовыми коэффициентами - PullRequest
4 голосов
/ 19 марта 2011

Мне нужно аппроксимировать определяемую таблицей 2D-функцию следующим образом:

x0 y0
x1 y1
...
xn yn

для каждой точки, в которой у меня есть «вес» (среднеквадратическая ошибка для этой меры).Мне нужно написать такую ​​функцию:

typedef std::vector< double > DVector;
void approximate2D(
      const DVector & x
    , const DVector & y
    , const DVector & weights
    , double newMeasuredX
    , double newMeasuredY
    , double newMeasuredWeight
    , double & outApproximatedX
    , double & outApproximatedY
);

, чтобы получить одно значение (outApproximatedX; outApproximatedY), зависящее от предыдущих значений и нового измеренного значения.

Среднеквадратическую ошибку (RMS) следует использовать следующим образом: если ошибка RMS минимальна, то требуемая функция должна приближаться к этой точке, если ошибка RMS максимальна, тогда эта точка должна бытьиспользовать с минимальным вкладом.

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

Погуглил около половины дня, и не нашел никаких предложений.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 19 марта 2011

Чтобы минимизировать общее квадратичное расстояние до линии ax + на = r , вы не можете использовать матричные уравнения, так как проблема не вдлиннее линейного.

Расстояние до линии можно определить следующим образом.Тогда функция, которую вы хотите минимизировать, это f ( a , b , r ).Эта задача несколько упрощается, когда a 2 + b 2 = 1.

Concepts

Если вы расширяете это, это становится довольно сложным.Мне удалось разбить его и несколько упростить.

Calculations, calculations, calculations!

Чтобы вычислить это по многим точкам ( O ( n * 1039)* 2 )) может стать медленным.Однако есть легкая оптимизация.Вместо того, чтобы вычислять суммы снова и снова, вы можете хранить частичные результаты:

Something that looks like an algorithm

Здесь переменные σ являются аккумуляторами для общих терминов.Каждый раз, когда вы хотите добавить еще одну точку в вычисления, вы обновляете 9 переменных и используете их для вычисления a , b и r , как и раньше.

1 голос
/ 21 марта 2011

Большое спасибо за MizardX. Отличная помощь. Вот что я написал (если кому-то нужно :))
http://liveworkspace.org/code/815e2cc0810ab8ef14951252cca3fbbf

P.S. Я не могу голосовать за MizardX (без репутации). Может ли кто-нибудь сделать это для меня?

1 голос
/ 19 марта 2011

То, что вы хотите, это кривая заполнения пространства, либо кривая Гильберта, либо кривая Пеано. SFC является хорошим приближением 2D или XD сетки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...