Здравствуйте, dcb-BanDos, Вы писали:
DB>Есть здоровая функция:
DB>U(t)=c1+c2*ln(1-t*exp(с3))
DB>Есть набор значений данной функции. DB>Вопрос: DB>каким образом для этого набора значений найти максимально близкие коэффициенты?!
Первое: есть ли ограничения на диапазон аргументов
если да метод перебора с маленьким шагом, если нет
значений будет великое множество, при условии одного необходимого случайно генерируешь с1 и с2 а с3 вычисляешь методом перебора
Здравствуйте, dcb-BanDos, Вы писали:
DB>Есть здоровая функция:
DB>U(t)=c1+c2*ln(1-t*exp(с3))
DB>Есть набор значений данной функции. DB>Вопрос: DB>каким образом для этого набора значений найти максимально близкие коэффициенты?!
Здравствуйте, dcb-BanDos, Вы писали:
DB>Есть здоровая функция:
DB>U(t)=c1+c2*ln(1-t*exp(с3))
DB>Есть набор значений данной функции. DB>Вопрос: DB>каким образом для этого набора значений найти максимально близкие коэффициенты?!
Эту функцию можно здорово упростить .
U(t)=c1 + c2*Х , Х = ln(1 - t*exp(с3))
Итак, мы имееем систему нелинейных уравнений, с 3 неизвестными -- с1, с2, Х.
Ее решить гораздо легче, чем первоначальную, у меня даже есть подозрение, что решить можно точно.
Если у нас будет точное решение, то с3 можно найти из любого Х, ведь у нас есть U(t) и t.
с3 = ln((1 - exp(X))/t)
Если у нас нет точного решения, можно взять среднее арифметическое (геометрическое) по всем найденным из Х значениям, или использовать МНК.
Короче тут уже широкий простор для фантазии.
Здравствуйте, dcb-BanDos, Вы писали:
DB>Есть здоровая функция:
DB>U(t)=c1+c2*ln(1-t*exp(с3))
DB>Есть набор значений данной функции. DB>Вопрос: DB>каким образом для этого набора значений найти максимально близкие коэффициенты?!
М.б. что-то на такую тему помудрить... Взять численно производную. Раз величины U(t) и t известны, известны и U`(t) в соотв-их t (приближенно, методом разностной аппроксимации).
Заменим для краткости c3 = exp(c3), тогда:
U = c1 + c2*ln(1 — t*с3)
U` = c2*[c3/(1 — t*c3)]
Отсюда: c3 = U`/(c2 + t*U`)
Т.е. U`/(c2 + t*U`) = const при всех U` и t
или отсюда же
U`*(t*c3 — 1) = const при всех U` и t
К МНК чтоб свести надо лин. систему составить... А тут...
Здравствуйте, dcb-BanDos, Вы писали:
DB>каким образом для этого набора значений найти максимально близкие коэффициенты?!
Метод наименьших квадратов или метод максимального правдоподобия — первое, что приходит на ум. Хотя методов параметрической идентификации довольно много.
Здравствуйте, piAnd, Вы писали:
A>М.б. что-то на такую тему помудрить... Взять численно производную. Раз величины U(t) и t известны, известны и U`(t) в соотв-их t (приближенно, методом разностной аппроксимации).
A>Заменим для краткости c3 = exp(c3), тогда:
A>U = c1 + c2*ln(1 — t*с3)
A>U` = c2*[c3/(1 — t*c3)]
A>Отсюда: c3 = U`/(c2 + t*U`)
A>Т.е. U`/(c2 + t*U`) = const при всех U` и t A>или отсюда же A>U`*(t*c3 — 1) = const при всех U` и t
A>К МНК чтоб свести надо лин. систему составить... А тут...
мы и получи как-раз лин. систему.
Вот набор уравнений:
U`*(t*c3 — 1) = c2*c3
Таких уравнений n шт.
Искомые нами "Иксы".: x1=c3 и x2=c2*c3
Вобщем все сводится к вполне лин. системе:
Ai*x1 + Bi*x2 = Ci
Здравствуйте, AZIZE, Вы писали:
AZI>Здравствуйте, dcb-BanDos, Вы писали:
AZI>Первое: есть ли ограничения на диапазон аргументов AZI>если да метод перебора с маленьким шагом, если нет AZI>значений будет великое множество, при условии одного необходимого случайно генерируешь с1 и с2 а с3 вычисляешь методом перебора
метод перебора как-то даже и не вспомнил.
сейчас попробовал, слишком медленно, приходится перебирать довольно большое количество.
мне бы пиркрутить МНК сюда...
Ничто не ограничивает полет мысли программиста так, как компилятор.
Здравствуйте, dcb-BanDos, Вы писали:
DB>Есть здоровая функция:
DB>U(t)=c1+c2*ln(1-t*exp(с3))
DB>Есть набор значений данной функции. DB>Вопрос: DB>каким образом для этого набора значений найти максимально близкие коэффициенты?!
Можно попробовать склепать подобие нейронной сети.
c3 ln c2 line
x --> () --> () --> y
| |
(-1) (c1)
В итоге y принимает следующее значение ln(с3*x + 1)*c2 — c1.
Вывести из полученных значений те, которые надо, будет несложно.
Обучать по стандартным формулам метода градиентного спуска. Я уже такую фишку делал.
Минусы:
100% гарантии, что сеть сойдется быстро нет. В рассмотренном случае начальные значения лучше задавать ручками.
Логарифм в качестве функции активации -- это жесть, лишние проблемы, которые придется учитывать.
Если не реализовать интерфейс нейронной сети, придется ручками прописывать и выводить нетривиальные формулы, что м.б. чревато
Плюсы:
Если будет работать ( ), то скорость будет выше, чем у генетического алгоритма, т.е. быстрее, чем тупое решение в лоб.
Можно достичь довольно солидной точности
ЗЫЖ Гхм, самому интересно стало, заработает или нет .
Здравствуйте, Grey2002, Вы писали:
G>Здравствуйте, dcb-BanDos, Вы писали:
DB>>каким образом для этого набора значений найти максимально близкие коэффициенты?!
G>Метод наименьших квадратов или метод максимального правдоподобия — первое, что приходит на ум. Хотя методов параметрической идентификации довольно много.
как не пытался, не свести мне к МНК =(
Ничто не ограничивает полет мысли программиста так, как компилятор.
Здравствуйте, dcb-BanDos, Вы писали:
DB>Есть здоровая функция:
DB>U(t)=c1+c2*ln(1-t*exp(с3))
DB>Есть набор значений данной функции. DB>Вопрос: DB>каким образом для этого набора значений найти максимально близкие коэффициенты?!
Если область поиска недостаточно ограничена, то воспользоваться только полным перебором неполучится.
Задача тут нелинейная, поэтому если вписывать по МНК то нужно знать хорошее начальное приближение для c1,c2,c3.
А затем использовать нелинейную оптимизацию.
Если набор пар (t[i],U[i]) большой, то в качестве нелинейного оптимизатора
лучше использовать метод левенберга-марквадта (для минимизации суммы sum(U[i]-U(t[i]))^2,i=1..n)).
Общий алгоритм выглядит так:
1. Загадать случайно и равномерно c1,c2,c3 из области поиска (начальное приближение)
2. Вызвать минимизатор для спуска к локальному минимуму с начальным приближением c1,c2,c3
3. if(найденное решение недостаточно хорошее) goto 1
А вообще если эту задачу нужно решить только 1 раз, то лучше воспользоваться Maple, MatLab или MathCad ...
Там есть все необходимое для решения подобных задач.
Простенькую реализацию метода левенберга-марквадта легко набросать самому.
Достаточно иметь процедуру которая решает линейную систему уравнений.
Здравствуйте, unreg_flex, Вы писали:
_>Здравствуйте, piAnd, Вы писали:
A>>U = c1 + c2*ln(1 — t*с3)
A>>U` = c2*[c3/(1 — t*c3)]
_>Производная найдена неправильно Дальше бред.
Ошибка — имеете ввиду в знаке производной?
И почему дальше бред?
Конечно, есть проблема с вычислением производной, м.б. это как-то и решается, сама схема то на бред не похожа...
Здравствуйте, dcb-BanDos, Вы писали:
DB>Есть здоровая функция:
DB>U(t)=c1+c2*ln(1-t*exp(с3))
DB>Есть набор значений данной функции. DB>Вопрос: DB>каким образом для этого набора значений найти максимально близкие коэффициенты?!
Я вижу это так (надеюсь поможет):
Пусть нам известны значения U(t),U(t+1) и U(t+2)
Дано: U(t)=c1+c2*ln(1-t*exp(с3)) => c1=U(t)-c2*ln(1-t*exp(с3))
Заменяем с1 на полученную подстановку:
Сорри, только заметил что за c3 обозначили exp(c3).
Но тем не менее это проблему не решает, система все равно остается трансцендентной.
Мне непонятно откуда взялась матрица A в вашем примере, можно подробней если не затруднит?
Здравствуйте, unreg_flex, Вы писали:
_>Сорри, только заметил что за c3 обозначили exp(c3). _>Но тем не менее это проблему не решает, система все равно остается трансцендентной. _>Мне непонятно откуда взялась матрица A в вашем примере, можно подробней если не затруднит?
Да. Трансцендентна для U.
А если взять U` = -c2*[c3/(1 — t*c3)], где заменили c3=exp(c3) для краткости, то:
U`*(1 — t*c3) = -c2*c3
-U`*t*c3 +c2*c3 = -U`
последнее — уже лин. система вида:
Ai*x1 + Bi*x2 = Ci
где x1 = c3; x2 = c2*c3 {можно так делать или нет — мне слегка непонятно, но как видно в маткаде работает}
Ai = -U`*t; Bi = 1; Ci = -U` для i взятой во всех отсчетах [0;N]
Здравствуйте, piAnd, Вы писали:
A>Да. Трансцендентна для U. A>А если взять U` = -c2*[c3/(1 — t*c3)], где заменили c3=exp(c3) для краткости, то:
A>U`*(1 — t*c3) = -c2*c3
A>-U`*t*c3 +c2*c3 = -U`
A>последнее — уже лин. система вида:
A>Ai*x1 + Bi*x2 = Ci
A>где x1 = c3; x2 = c2*c3 {можно так делать или нет — мне слегка непонятно, но как видно в маткаде работает}
так делать можно.
A>Ai = -U`*t; Bi = 1; Ci = -U` для i взятой во всех отсчетах [0;N]
A>
A>Матрицы для МНК:
A> | -U`0*t0 1 | | -U`0 |
A>A = | -U`1*t1 1 | B = | -U`1 |
A> | ... ... | | ... |
A>[A] = Nx2; [B] = Nx1
A>
Это все понятно, мне неясно только одно, почему вместо поиска параметров функции U по набору её значений (t[i],U(t[i]))
ищутся параметры ее производной.
Если уже и искать параметры производной, то нужен набор (t[i],U'(t[i])),
но по условию его нет, а в ваших вычислениях он активно используется.
Также не вижу пути для поиска U'(t[i]) через U(t[i]), особенно если значения содержат шум и не заданы с очень маленьким шагом.