математика
От: dcb-BanDos Россия  
Дата: 27.07.07 07:26
Оценка:
Есть здоровая функция:

U(t)=c1+c2*ln(1-t*exp(с3))

Есть набор значений данной функции.
Вопрос:
каким образом для этого набора значений найти максимально близкие коэффициенты?!
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re: математика
От: AZIZE  
Дата: 27.07.07 07:41
Оценка:
Здравствуйте, dcb-BanDos, Вы писали:

DB>Есть здоровая функция:


DB>U(t)=c1+c2*ln(1-t*exp(с3))


DB>Есть набор значений данной функции.

DB>Вопрос:
DB>каким образом для этого набора значений найти максимально близкие коэффициенты?!

Первое: есть ли ограничения на диапазон аргументов
если да метод перебора с маленьким шагом, если нет
значений будет великое множество, при условии одного необходимого случайно генерируешь с1 и с2 а с3 вычисляешь методом перебора
Re: математика
От: MBo  
Дата: 27.07.07 07:47
Оценка:
Здравствуйте, dcb-BanDos, Вы писали:

DB>Есть здоровая функция:


DB>U(t)=c1+c2*ln(1-t*exp(с3))


DB>Есть набор значений данной функции.

DB>Вопрос:
DB>каким образом для этого набора значений найти максимально близкие коэффициенты?!

http://alglib.sources.ru/optimization/
http://www.nrbook.com/a/bookcpdf.php
Re: математика
От: tinytjan  
Дата: 27.07.07 08:24
Оценка:
Здравствуйте, 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)


Если у нас нет точного решения, можно взять среднее арифметическое (геометрическое) по всем найденным из Х значениям, или использовать МНК.
Короче тут уже широкий простор для фантазии.

Собсно, все, удачи .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: математика
От: tinytjan  
Дата: 27.07.07 08:43
Оценка:
Здравствуйте, tinytjan, Вы писали:

Извиняюсь, поспешил
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: математика
От: dcb-BanDos Россия  
Дата: 27.07.07 10:34
Оценка:
Здравствуйте, tinytjan, Вы писали:

T>Здравствуйте, tinytjan, Вы писали:


T>Извиняюсь, поспешил


и мне так показалось =)
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re: математика
От: piAnd Россия  
Дата: 27.07.07 12:25
Оценка:
Здравствуйте, 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

К МНК чтоб свести надо лин. систему составить... А тут...
Re: математика
От: Grey2002  
Дата: 27.07.07 12:29
Оценка:
Здравствуйте, dcb-BanDos, Вы писали:

DB>каким образом для этого набора значений найти максимально близкие коэффициенты?!


Метод наименьших квадратов или метод максимального правдоподобия — первое, что приходит на ум. Хотя методов параметрической идентификации довольно много.
Re[2]: математика
От: piAnd Россия  
Дата: 27.07.07 12:47
Оценка:
Здравствуйте, 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

Решается МНК, если не ошибаюсь.
Re[2]: математика
От: dcb-BanDos Россия  
Дата: 27.07.07 12:56
Оценка:
Здравствуйте, AZIZE, Вы писали:

AZI>Здравствуйте, dcb-BanDos, Вы писали:




AZI>Первое: есть ли ограничения на диапазон аргументов

AZI>если да метод перебора с маленьким шагом, если нет
AZI>значений будет великое множество, при условии одного необходимого случайно генерируешь с1 и с2 а с3 вычисляешь методом перебора

метод перебора как-то даже и не вспомнил.
сейчас попробовал, слишком медленно, приходится перебирать довольно большое количество.
мне бы пиркрутить МНК сюда...
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re: математика
От: tinytjan  
Дата: 27.07.07 13:15
Оценка:
Здравствуйте, 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% гарантии, что сеть сойдется быстро нет. В рассмотренном случае начальные значения лучше задавать ручками.
Логарифм в качестве функции активации -- это жесть, лишние проблемы, которые придется учитывать.
Если не реализовать интерфейс нейронной сети, придется ручками прописывать и выводить нетривиальные формулы, что м.б. чревато

Плюсы:
Если будет работать ( ), то скорость будет выше, чем у генетического алгоритма, т.е. быстрее, чем тупое решение в лоб.
Можно достичь довольно солидной точности

ЗЫЖ Гхм, самому интересно стало, заработает или нет .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: математика
От: dcb-BanDos Россия  
Дата: 27.07.07 13:50
Оценка:
Здравствуйте, Grey2002, Вы писали:

G>Здравствуйте, dcb-BanDos, Вы писали:


DB>>каким образом для этого набора значений найти максимально близкие коэффициенты?!


G>Метод наименьших квадратов или метод максимального правдоподобия — первое, что приходит на ум. Хотя методов параметрической идентификации довольно много.


как не пытался, не свести мне к МНК =(
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re[3]: математика
От: Programador  
Дата: 27.07.07 14:35
Оценка:
Здравствуйте, dcb-BanDos, Вы писали:

DB>как не пытался, не свести мне к МНК =(


Полюбому не свести.

U=c+k*X где X=ln(1-t*exp(с3)) линейная функция, тогда (U2-U1)/(X2-X1)==(U1-U0)/(X1-X0)

(U2-U1)/(X2-X1)-(U1-U0)/(X1-X0)==0.

X=ln(1-t*exp(с3)) монотонная тоесть (X1-X0)!=0.

Тогда можно посчитать СУММА(((U2-U1)/(X2-X1)-(U1-U0)/(X1-X0))^2) функция одного переменного c3. Перебор одномерный. А возле решений уже МНК.
Re[2]: математика
От: unreg_flex  
Дата: 27.07.07 14:53
Оценка:
Здравствуйте, piAnd, Вы писали:

A>U = c1 + c2*ln(1 — t*с3)


A>U` = c2*[c3/(1 — t*c3)]


Производная найдена неправильно Дальше бред.
Re: математика
От: unreg_flex  
Дата: 27.07.07 15:16
Оценка: +1
Здравствуйте, 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 ...
Там есть все необходимое для решения подобных задач.

Простенькую реализацию метода левенберга-марквадта легко набросать самому.
Достаточно иметь процедуру которая решает линейную систему уравнений.
Re[3]: математика
От: piAnd Россия  
Дата: 27.07.07 16:55
Оценка:
Здравствуйте, unreg_flex, Вы писали:

_>Здравствуйте, piAnd, Вы писали:


A>>U = c1 + c2*ln(1 — t*с3)


A>>U` = c2*[c3/(1 — t*c3)]


_>Производная найдена неправильно Дальше бред.


Ошибка — имеете ввиду в знаке производной?
И почему дальше бред?
Конечно, есть проблема с вычислением производной, м.б. это как-то и решается, сама схема то на бред не похожа...

Вот состряпаный пример в маткаде

Re: математика
От: Нэчер  
Дата: 27.07.07 21:54
Оценка:
Здравствуйте, 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 на полученную подстановку:

U(t+1)=U(t)-c2*ln(1-t*exp(с3)) + c2*ln(1-(t+1)*exp(с3)) = U(t)+c2((ln(1-(t+1)*exp(с3))-ln(1-t*exp(с3))) =>
=> c2=(U(t+1)-U(t))/((ln(1-(t+1)*exp(с3))-ln(1-t*exp(с3)))

Всюду заменяем с2 на полученную подстановку:

с1=U(t)-(U(t+1)-U(t))/((ln(1-(t+1)*exp(с3))-ln(1-t*exp(с3)))*ln(1-t*exp(с3))

U(t+2)=U(t)-(U(t+1)-U(t))/((ln(1-(t+1)*exp(с3))-ln(1-t*exp(с3)))*ln(1-t*exp(с3))+
+(U(t+1)-U(t))/((ln(1-(t+1)*exp(с3))-ln(1-t*exp(с3)))*ln(1-(t+2)*exp(с3))

Вуаля! Простое уравнение с одной неизвестной =)

Удачи!
Re[2]: математика
От: unreg_flex  
Дата: 28.07.07 07:53
Оценка:
Здравствуйте, piAnd, Вы писали:

[skipped]

Сорри, только заметил что за c3 обозначили exp(c3).
Но тем не менее это проблему не решает, система все равно остается трансцендентной.
Мне непонятно откуда взялась матрица A в вашем примере, можно подробней если не затруднит?
Re[3]: математика
От: piAnd Россия  
Дата: 28.07.07 13:39
Оценка:
Здравствуйте, 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]

Матрицы для МНК:
    | -U`0*t0       1 |        | -U`0 |
A = | -U`1*t1       1 |    C = | -U`1 |
    |   ...       ... |        | ...  |

[A] = Nx2; [C] = Nx1
Re: математика
От: unreg_flex  
Дата: 28.07.07 14:03
Оценка:
Здравствуйте, 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]), особенно если значения содержат шум и не заданы с очень маленьким шагом.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.