Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Аппроксимация 2D ф-ции с весовыми коэффициентами


Автор: borisbn 19.3.2011, 16:31
Здравствуйте !
Долго думал где разместить вопрос здесь или в "Алгоритмах", но, т.к. гуглил не меньше пол-дня и ничего конкретного не нашёл, то решил, всё-таки, задать здесь.
Итак.

Мне нужно апроксимировать функцию двух переменных, заданную таблично
Цитата

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) в зависимости от предыдущих значений и вновь поступившего измерения.
"Вес" (вернее всё-таки СКО) должен работать следующим образом: при минимальном СКО искомая ф-ция должна проходить в непосредственной близости от соответствующей точки, при максимальном СКО данная точка пратически не должна учитываться.
Аппроксимация должна быть линейной ( наверное ??? ), т.к. я знаю, что искомая функция - прямая линия.

P.S. Большая просьба - не отсылать в гугл для поиска МНК, т.к. я там уже был и не нашёл готового решения.
P.P.S. Если кто-нибудь ещё и исходниками такой ф-ции поделится - буду ваще благодарен.
Спасибо.

Автор: volatile 19.3.2011, 23:29
Цитата(borisbn @  19.3.2011,  17:11 Найти цитируемый пост)
deleted
В смысле вопрос уже решен? 

Если нет, то пара вопросов.
Цитата(borisbn @  19.3.2011,  16:31 Найти цитируемый пост)
Хотелось бы получить функцию вида:

По той сигнатуре что вы привели, это похоже не на функцию 2-ух переменных.
А больше похоже на (образно выражаясь) мишень. В которую бьют выстрелами (newMeasuredX, newMeasuredY), и вы хотите получить апроксимированный центр этой мишени, учитывающий все прошлые "выстрелы".

Если же это функция, то это подразумевает зависимость y=f(x).
То есть задаете х, получаете апроксимированный игрек. Или наоборот x=f(y)
Как вы хотите получить сразу два значения?

В зависимости от этого будут разные решения.

Автор: alexvs11 19.3.2011, 23:32
Цитата(volatile @  19.3.2011,  23:29 Найти цитируемый пост)
Если же это функция, то это подразумевает зависимость y=f(x).То есть задаете х, получаете апроксимированный игрек. Или наоборот x=f(y)Как вы хотите получить сразу два значения?

согласен, противоречущие параграфы

Автор: borisbn 20.3.2011, 10:49
Цитата(volatile @  19.3.2011,  23:29 Найти цитируемый пост)
В смысле вопрос уже решен? 

нет. напортачил в первом посте, написал во втором "не отвечайте, пока не исправлю", затем второй удалил... smile

Цитата(volatile @  19.3.2011,  23:29 Найти цитируемый пост)
 вы хотите получить апроксимированный центр этой мишени, учитывающий все прошлые "выстрелы".

не центр, а скорее "куда дальше стрелять". ок, распишу исходную задачу.
Есть траектория движения объекта. Известно, что это - прямая, но мне она заранее не известна. Я могу с неким периодом измерять местоположение этого объекта, причём каждое измерение (newMeasuredX, newMeasuredY) сопровождается СКО этого измерения в метрах (newMeasuredWeight). Так вот мне требуется скорректировать это измерение, учитывая несколько предыдущих, при этом необходимо учитывать также СКО предыдущих измерений.
user posted image
на рисунке:
  • черные точки - предыдущие измерения
  • красная точка - текущее измерение
  • синяя точка - то, что я хочу получить.

Автор: Ln78 20.3.2011, 13:45
Цитата(borisbn @  19.3.2011,  16:31 Найти цитируемый пост)
апроксимировать функцию двух переменных

Цитата(borisbn @  20.3.2011,  10:49 Найти цитируемый пост)
напортачил в первом посте

Так двух или одной? И гипотеза о прямолинейности абсолютно несомненна, никаких корректировок в движении быть не может? Если так, то самый простой способ решения – именно через МНК. Для равноточных измерений система 
Ax=b. 
Если измерения имеют разную точность, и известно их СКО, то каждое из уравнений нужно поделить на дисперсию (квадрат СКО) соответствующего измерения. 
А решается обычным образом, умножением на транспонированную матрицу. Фактически нужно определить два числа, решить систему уравнений размера 2 на 2. Для такого случая элементарно находится обратная матрица, можно выписывать рекуррентные соотношения. По мне, их проще на бумажке вывести, чем здесь написать (соответствующим образом отформатировав).

Автор: borisbn 21.3.2011, 19:19
Спасибо всем, кто хотел помочь. Вопрос решён.
Правда на http://stackoverflow.com/questions/5362154/approximation-of-2d-function-with-weight-coefficients, но какая разница smile
Я там, кстати, в последнем посте (ответе) выложил ссылку на исходники...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)