Здравствуйте, unreg_flex, Вы писали:
_>Также не вижу пути для поиска U'(t[i]) через U(t[i]), особенно если значения содержат шум и не заданы с очень маленьким шагом.
Ну t[i] это среднее значение между точками. Нелинейность внесет конечно некоторое искажение. А шумы МНК не мешают — он с ними какраз и борется.
Здравствуйте, unreg_flex, Вы писали:
_>Это все понятно, мне неясно только одно, почему вместо поиска параметров функции U по набору её значений (t[i],U(t[i])) _>ищутся параметры ее производной. _>Если уже и искать параметры производной, то нужен набор (t[i],U'(t[i])), _>но по условию его нет, а в ваших вычислениях он активно используется.
_>Также не вижу пути для поиска U'(t[i]) через U(t[i]), особенно если значения содержат шум и не заданы с очень маленьким шагом.
Что-то скачками с ветки на ветку пошло...
_>Это все понятно, мне неясно только одно, почему вместо поиска параметров функции U по набору её значений (t[i],U(t[i])) _>ищутся параметры ее производной.
Есть ли разница между параметрами в U и в U`?
_>Если уже и искать параметры производной, то нужен набор (t[i],U'(t[i])), _>но по условию его нет, а в ваших вычислениях он активно используется. _>Также не вижу пути для поиска U'(t[i]) через U(t[i]), особенно если значения содержат шум и не заданы с очень маленьким шагом.
Ну... В ЦОС часто получают производные, имея лишь сами данные, во многих случаях либо это нормально, либо смиряются с этой неудобностью. Например, скорость вращения колеса робота меряют часто по его углам через числ. производную, и не тратят баксы на скоростемер.
Что-нить типа интерполяции замутить можно.
МНК тут для шума и прилеплен
Это все конечно справедливо. Проблема такая тут есть, и даже с бородой. Не спорю.
Здравствуйте, tinytjan, Вы писали:
T>Здравствуйте, unreg_flex, Вы писали:
_>>Это все понятно, мне неясно только одно, почему вместо поиска параметров функции U по набору её значений (t[i],U(t[i])) _>>ищутся параметры ее производной. _>>Если уже и искать параметры производной, то нужен набор (t[i],U'(t[i])), _>>но по условию его нет, а в ваших вычислениях он активно используется.
_>>Также не вижу пути для поиска U'(t[i]) через U(t[i]), особенно если значения содержат шум и не заданы с очень маленьким шагом.
T>Думаю, стОит спросить у аффтара
значений около 100-150,
функция — зависимость напряжения от времени
при чем тут производные — мне тоже непонятно
Ничто не ограничивает полет мысли программиста так, как компилятор.
On Fri, 27 Jul 2007 11:26:02 +0600, dcb-BanDos <53868@users.rsdn.ru> wrote:
> Есть здоровая функция: > > U(t)=c1+c2*ln(1-t*exp(с3)) > > Есть набор значений данной функции. > Вопрос: > каким образом для этого набора значений найти максимально близкие > коэффициенты?!
функция V(t)=exp(U(t)), равна exp(c1)*exp(c2*ln(1-t*exp(c3)) =
K1*(1-t*K3)^K2
то есть, экспоненцируя ось ординат, можно свести к более простой задаче
оптимизации.
еще можно взять разложение тейлора функции V(t) и оптимизировать его
вместо оригинала.
Здравствуйте, dcb-BanDos, Вы писали:
DB>Есть здоровая функция:
DB>U(t)=c1+c2*ln(1-t*exp(с3))
DB>Есть набор значений данной функции. DB>Вопрос: DB>каким образом для этого набора значений найти максимально близкие коэффициенты?!
понятие "максимально близкие" для функций неоднозначно. Характеристикой близости является мера. Уточните в какой мере искомые функции должны быть наиболее близкими
Здравствуйте, Megabyte, Вы писали:
M>функция V(t)=exp(U(t)), равна exp(c1)*exp(c2*ln(1-t*exp(c3)) = M>K1*(1-t*K3)^K2 M>то есть, экспоненцируя ось ординат, можно свести к более простой задаче M>оптимизации. M>еще можно взять разложение тейлора функции V(t) и оптимизировать его M>вместо оригинала.
Как-то незаметно тут упрощения.
В исходном варианте надо считать только логарифм (если заметить c3=exp(c3) как предложил piAnd)
А тут надо в вещественную степень возводить, что по сути и логарифм и експонента и умножение.
На счет тейлора тоже сомнительно, приближение будет нормально себя вести только в окрестности 0.
Здравствуйте, dcb-BanDos, Вы писали:
DB>значений около 100-150, DB>функция — зависимость напряжения от времени DB>при чем тут производные — мне тоже непонятно
В принципе в идее с поиском производной есть рациональное зерно,
Общий смысл в подборе такого оператора F, что F(U) имеет более простой
вид, или еще лучше F(U) становится дробно-рациональной относительно искомых параметров (для сведения к линейной системе).
(Если я правильно понял)
В данном случае это может быть полезно, поскольку U(t) имеет простое поведение и погрешность
численного вычисления производных тут может быть невелика (особенно если значений много и они близко расположены друг от друга).
Возможно в этой задаче можно это применить, например для поиска начального приближения.
В общем виде такой подход может дать странные результаты.
Выберем среди пар (t[i],U(t[i])) три соседние пары идущие подряд относительно t.
Поведение U между этими парами неизвестно, там к примеру может быть очень большой всплеск,
те производная U между ними может менятся в широких пределах.
Однако U(t1) U(t2) и U(t3) могут лежать в пологах этого всплеска или почти на одной горизонтальной прямой,
поэтому при численном вычислении производных получатся почти нули, что даст колоссальные погрешности при приближении МНК.
Однако повторюсь, для хороших (особенно монотонных) функций и с большим количеством исходных данных возможно это вполне приемлимо.
Здравствуйте, sadomovalex, Вы писали:
S>Здравствуйте, dcb-BanDos, Вы писали:
DB>>Есть здоровая функция:
DB>>U(t)=c1+c2*ln(1-t*exp(с3))
DB>>Есть набор значений данной функции. DB>>Вопрос: DB>>каким образом для этого набора значений найти максимально близкие коэффициенты?!
S>понятие "максимально близкие" для функций неоднозначно. Характеристикой близости является мера. Уточните в какой мере искомые функции должны быть наиболее близкими
В принципе задачу решил перебором, оптимизировал, получил результат в 200мс для 100 изначальных данных.
Точность — высокая, погрешность около 3%.
Данный результат устраивает, но хотелось бы найти что-то более красивое =)
Ничто не ограничивает полет мысли программиста так, как компилятор.
On Tue, 31 Jul 2007 11:38:54 +0600, unreg_flex <35652@users.rsdn.ru> wrote:
> Как-то незаметно тут упрощения. > В исходном варианте надо считать только логарифм (если заметить > c3=exp(c3) как предложил piAnd) > А тут надо в вещественную степень возводить, что по сути и логарифм и > експонента и умножение. > На счет тейлора тоже сомнительно, приближение будет нормально себя вести > только в окрестности 0.
я, кстати, не понял — даны значения функции-"черного ящика", или дан сам
"черный ящик", которому можно скормить неограниченное число входных
данных, и он выдаст числа?
а упрощение в том, что после экспоненцирования мы имеем степенную функцию,
смещенную относительно центра координат, и растянутую вдоль осей.
параметры в данном случае определяют степень, смещение и растяжение.
по-моему, искать степень фукции гораздо проще, чем аргумент логарифма.