Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Задача минимизации функции многих переменных |
Автор: DProf 14.3.2013, 16:44 |
Добрый день! В ходе написания программы на С++ понадобилось найти минимум функции девяти (!) переменных. Подскажите готовые решения (библиотеки, проги) для решения задачи минимизации. Переменные ограничены на известном интервале. Функция нелинейная (хотя может быть и получится ее линеаризовать). В Matlabe вот такие средства встроенные есть. А есть какая нибудь либа на С++ для этого? Информации в интернете по теме очень много, но тяжело найти здравое решение 'из коробки'. Хочется просто импортировать функцию минимизации и не разбираться ни капли в ее особенностях. |
Автор: borisbn 14.3.2013, 17:19 |
Думаю, сильно зависит от вида функции, от того, как она задана - таблично, в виде полинома, аналитически и т.п. |
Автор: DProf 14.3.2013, 17:47 |
Аналитически. Но это уже вопрос о методах решения. Хочется же просто мощную библиотеку на с++. Задача то вполне типичная, но что то не могу найти готового решения на си. |
Автор: borisbn 15.3.2013, 06:23 | ||
> Аналитически Т.е. я правильно понимаю, что на входе д.б. что-то типа
а на выходе вектор исков ? |
Автор: borisbn 15.3.2013, 11:20 |
http://ab-initio.mit.edu/wiki/index.php/NLopt http://www.gnu.org/software/gsl/manual/html_node/Multidimensional-Minimization.html http://devernay.free.fr/hacks/cminpack/index.html http://people.sc.fsu.edu/~jburkardt/cpp_src/toms178/toms178.html Честно говоря, ни одну не пробовал, так что на Ваш страх и риск ![]() |
Автор: DProf 15.3.2013, 12:05 | ||||
Много проще, минимизируемую функцию можно прямо в код вставить, она заранее известна. За ссылки на либы спасибо. Пробовать буду. |
Автор: math64 15.3.2013, 22:22 |
В общем случае не определишь. Например функция, почти всюду равная 0, но маленьких в окрестностях x0 равная -1. Причем, её можно сделать гладкой и бесконечно дифференцирумой (как exp(-1/x^2) вблизи 0). |
Автор: DProf 18.3.2013, 18:35 | ||||
Ну допустим я уверен что функция имеет минимум (даже не спрашивайте, почему:) ) в заданной окрестности.
Вы правы. К сожалению. Во всех этих особенностях по ходу придется глубоко копаться. Я ж не математик. Ужас. А функция - это полином второго порядка. Я вот начал подумывать тупо перебрать с мелким шагом все переменные от их возможного минимума до максимума. Скорость работы большого значения не играет. Если разбить интервал на 1 000 000 значений, то это всего то надо 1 000 000 * 9! = 362880000000 раз вычислить значение функции. |
Автор: Фантом 18.3.2013, 21:03 |
От девяти переменных? Интересно, откуда Вы извлекли такую задачу... Скорее всего, она решается аналитически (или, по крайней мере, допускает существенное уменьшение числа аргументов). Может быть, выложите выражение вместе с границами для переменных? |
Автор: W4FhLF 18.3.2013, 21:22 |
Заодно надо уточнить какой минимум нужен: локальный или глобальный? |
Автор: feodorv 18.3.2013, 22:57 | ||
Чего-то я сомневаюсь в правильности этой выкладки. 1 000 000 в 9ой степени, мне кажется, ближе к истине... |
Автор: math64 19.3.2013, 08:26 |
Для полинома наверно, можно найти. Для полинома с одной переменной решение известно - определить знаки производных от первого порядка и далее на концах отрезка и в середине. По переменам знаков определяем сколько корней имеет производная на каждой половине отрезка, выбираем нужную часть и т.д. Для полинома с девятью переменными нужно найти способ сокращения числа переменных. |