![]() |
|
![]() ![]() ![]() |
|
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Задача на первый взгляд тривиальная, но я заткнулся. Надо найти минимум функции двух аргументов (X и Y). Проблема в том, что функция включает экспоненты. Это приводит к тому, что ее численные значения (в силу конечной машинной точности) выглядят как горизонтальная плоскость с ямкой в каком-то месте. Известные мне численные методы (типа метода Ньютона) требуют хорошего начального приближения. Т.е. если начальные значения X и Y попадают на "плоскость", результат не считается. А вот с начальным приближением-то и проблема :(
Еще одно ограничение - из-за тех же экспонент рассчет производной еще больше страдает от конечности машинной точности. Поэтому считать надо саму функцию, а не производную. Подскажите, пожалуйста, как решить проблему? Пойдет и случай для функции одной переменной - я как-нибудь разберусь. Спасибо -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
Einwill |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 21.8.2007 Репутация: нет Всего: нет |
А может достаточно будет подействовать на функцию каким-нибудь преобразованием, чтобы она перестала быть плоской ямой? Например, использовать логорифмическую шкалу по оси ординат.
|
|||
|
||||
VictorTsaregorodtsev |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 28.7.2006 Репутация: 3 Всего: 8 |
Случайный поиск, генетические алгоритмы (можно с градиентной адаптацией особей внутри эпохи - если начальная генерация особи попадет в окрестность минимума, то затем град.оптимизация утащит особь в лок. или глоб.минимум) - это если совсем уж никак не преобразовать и не дифференцировать.
Попробуйте символьную арифметику - там сколь угодно большой точности можно добиться. Ну и непонятно, как вообще задача решалась - Ваша собственная программа или что-нибудь готовое типа Mathcad, Maple и т.д. |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Einwill, логарифмировать я бы попробовал, но в функции суммы, так что не помогает.
VictorTsaregorodtsev. 1. Программа собственная. 2. Символьная арифметика это здорово, но, в моем случае, сьест слишком много процессорного времени. И так ожидается, что каждый вариант задачи будет считаться "до утра". 3. Я, к сожалению, мало знаю о генетических алгоритмах, но Ваше краткое обяснение, видимо, совпадает с тем, что я сотворил сам к данному моменту. А именно:
Это сообщение отредактировал(а) _Y_ - 23.8.2007, 12:15 -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Непонятно, почему? Добавьте просто в конце функции численное взятие логарифма и ищите минимум уже этой функции, тоже численно. |
|||
|
||||
_Y_ |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
В конце безсмысленно. Например: A1 = S + D1 A2 = S + D2 D1 <> D2 Но! И D1 и D2 меньше машинной ошибки S. Поэтому A1 == A2==S в пределах машинной ошибки, естествено, т.е. получаю плоскость. Чем мне легче, если я считаю A1 = log(S + D1) A2 = log(S + D2) ? Все равно в пределах ошибки получаю A1 == A2==log(S + D1)==log(S + D2)==log(S) -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
||||
|
|||||
HistoryEarth |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 23.8.2007 Репутация: нет Всего: нет |
Не совсем понятна задача, если честно. Существует плоскость и на ней узкая яма (если функции экспоненциальные, то будет не яма, а воронка, кстати), так? И надо найти склон по отличию значения функции?
Плоскость идеально ровная и область различимого склона очень мала? Если так, тогда либо тупо перебираем (скажем, оцениваем площадь области склона и задаем шаг сканирования чуть меньше). Либо нужно поисследовать теоретические свойства функции и поискать "дальние" признаки склона (и тогда применять все, что угодно). |
|||
|
||||
_Y_ |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Попытаюсь нарисовать двухмерную иллюстрацию ![]() В аналитическом виде функция выглядит как А. Но когда мы пытаемся посчитать ее численно, из-за машинной ошибки возникает некий шум - красная линия на В. В результате, попав в зону, обозначенную зеленым, мы не можем сказать с какой стороны от ямы мы находимся, т.к. "уклон" спрятан шумом.
-------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
||||||
|
|||||||
imageman |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 30.9.2004 Репутация: нет Всего: 1 |
||||
|
||||
_Y_ |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
А разве log(S + D2) = log(S) + log(D2) ?
Над этим надо подумать. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
||||
|
|||||
Severyanin |
|
|||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
А если экспоненты, то проще всего быдет сделать преобразование Лапласа, рассчитать в частотной области, а потом - обратное преобразование.
-------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
|||
|
||||
esperanto |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 31.5.2003 Репутация: 2 Всего: 4 |
Проще все не будет. Да и вообще утверждение если экспонента то надо Лапласа не верное Это сообщение отредактировал(а) esperanto - 3.9.2007, 22:33 --------------------
B.Sc ->M.Sc.->Microsoft SDE-> (Ph.D. student + Intel SDE + psyсhology B.A) - > Skype SDET |
|||
|
||||
Severyanin |
|
|||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
esperanto, да, не всегда это оптимальное решение, но чаще всего
-------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
|||
|
||||
esperant0 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 714 Регистрация: 20.5.2005 Репутация: 4 Всего: 14 |
Да ну, на неизмеримых множествах утверждение чаще всего не имеет смысла -------------------- Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором а затем стерто и которое он - пользователь не мог видеть. |
|||
|
||||
imageman |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 30.9.2004 Репутация: нет Всего: 1 |
не равно :( , но пропорционально.... Или нет? Может сгодится просто пропорционально? (тут уж тебе нужно подумать 7 раз) |
||||
|
|||||
Skladnoy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 13.9.2007 Репутация: нет Всего: нет |
_Y_,
Попытайтесь выделить константу из функции аналитически. Если это не удается, попробуйте разложиться по малому параметру. Функция наверняка станет проще. Может какими-то членами можно предебречь на больших расстояниях от ямы. Найти точный минимум не удастся, но хорошее начальное приближение вполне. Или используйте библиотеки для вычислений с произвольной точностью. |
|||
|
||||
pompei |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Автор! Приведите пожалуйста Вашу функцию, а то тут все в небо тыкают, а попасть не могут.
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Да, Вы правы, конечно. Функция, с которой я пытался играть - сумма из N гауссовых кривых, аппроксимирующая некоторые экспериментальные кривые. Я, соответственно, пытался что-то сделать с методом наименьших квадратов. Специфические отличия именно моей задачи заключаются в том, что характеристики гауссовых кривых не совсем независимы. Кроме того, одновременно надо обрабатывать несколько наборов данных. Уравнение у меня получилось такое: ![]() В нем C число наборов данных, I - число точек в одном наборе данных, G - число гауссовых кривых в одном наборе данных. Оптимизируются только два параметра: сигма и a. Остальное известно. Возможны и другие решения - мне совершенно не обязательно бороться именно с гауссовыми кривыми - набор любых "куполов" меня устроит. Вообще же задача несколько потеряла свою срочность - позавчера смотал в командировку - отчитался за пол-года и эта часть не вошла пока ![]() ![]() Это сообщение отредактировал(а) _Y_ - 19.10.2007, 20:54 -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
tigrik |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 5.9.2004 Репутация: нет Всего: 3 |
Есть такой метод:
http://en.wikipedia.org/wiki/Gradient_descent смысл в том что величина шага меняется в зависимости от величины производной; то есть чем ближе к яме тем меньше шаги чтобы её не проскочить проблема в том что при этом нет разницы между локальным и глобальным минимумом - если попадёт в яму то уже не выберется |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Как известно, ln(1+dX) = dX при весьма малых dX... соответственно при S >> D2 ln(S+D2) = ln(S*(1+D2/S)) = ln(S) + ln(1+D2/S) = ln(S) + D2/S -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |