Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Задача минимизации функции многих переменных


Автор: DProf 14.3.2013, 16:44
Добрый день!
В ходе написания программы на С++ понадобилось найти минимум функции девяти (!) переменных. Подскажите готовые решения (библиотеки, проги) для решения задачи минимизации. Переменные ограничены на известном интервале. Функция нелинейная (хотя может быть и получится ее линеаризовать). В Matlabe вот такие средства встроенные есть. А есть какая нибудь либа на С++ для этого? Информации в интернете по теме очень много, но тяжело найти здравое решение 'из коробки'. Хочется просто импортировать функцию минимизации и не разбираться ни капли в ее особенностях.

Автор: borisbn 14.3.2013, 17:19
Думаю, сильно зависит от вида функции, от того, как она задана - таблично, в виде полинома, аналитически и т.п.

Автор: DProf 14.3.2013, 17:47
Аналитически. Но это уже вопрос о методах решения. Хочется же просто мощную библиотеку на с++. Задача то вполне типичная, но что то не могу найти готового решения на си. 

Автор: volatile 15.3.2013, 00:02
Цитата(DProf @  14.3.2013,  16:44 Найти цитируемый пост)
Хочется просто импортировать функцию ... не разбираться ни капли в ее особенностях.

 smile 
я тоже так всегда хочу, но почти никогда так не получаецца. 

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


Автор: borisbn 15.3.2013, 06:23
> Аналитически
Т.е. я правильно понимаю, что на входе д.б. что-то типа
Код
std:: string f = "sin(x0) + atan(x1/x2) - x3*x4^2 = 0";

а на выходе вектор исков ?

Автор: 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

Честно говоря, ни одну не пробовал, так что на Ваш страх и риск  smile 

Автор: DProf 15.3.2013, 12:05
Цитата(borisbn @ 15.3.2013,  06:23)
> Аналитически
Т.е. я правильно понимаю, что на входе д.б. что-то типа
Код
std:: string f = "sin(x0) + atan(x1/x2) - x3*x4^2 = 0";

а на выходе вектор исков ?

Много проще, минимизируемую функцию можно прямо в код вставить, она заранее известна.
За ссылки на либы спасибо. Пробовать буду.

Автор: math64 15.3.2013, 22:22
В общем случае не определишь.
Например функция, почти всюду равная 0, но маленьких в окрестностях x0 равная -1. Причем, её можно сделать гладкой и бесконечно дифференцирумой (как exp(-1/x^2) вблизи 0).

Автор: DProf 18.3.2013, 18:35
Цитата

В общем случае не определишь

Ну допустим я уверен что функция имеет минимум (даже не спрашивайте, почему:) ) в заданной окрестности.
Цитата(volatile @ 15.3.2013,  00:02)
я тоже так всегда хочу, но почти никогда так не получаецца. 

Вы правы. К сожалению. 
Во всех этих особенностях по ходу придется глубоко копаться. Я ж не математик. Ужас.

А функция - это полином второго порядка. Я вот начал подумывать тупо перебрать с мелким шагом все переменные от их возможного минимума до максимума. Скорость работы большого значения не играет. Если разбить интервал на 1 000 000 значений, то это всего то надо
1 000 000 * 9! = 362880000000 раз вычислить значение функции.

Автор: Фантом 18.3.2013, 21:03
Цитата(DProf @  18.3.2013,  19:35 Найти цитируемый пост)

А функция - это полином второго порядка.

От девяти переменных? Интересно, откуда Вы извлекли такую задачу...

Скорее всего, она решается аналитически (или, по крайней мере, допускает существенное уменьшение числа аргументов). Может быть, выложите выражение вместе с границами для переменных?

 

Автор: W4FhLF 18.3.2013, 21:22
Заодно надо уточнить какой минимум нужен: локальный или глобальный?

Автор: feodorv 18.3.2013, 22:57
Цитата(DProf @  18.3.2013,  19:35 Найти цитируемый пост)
то это всего то надо
1 000 000 * 9! = 362880000000 раз вычислить значение функции

Чего-то я сомневаюсь в правильности этой выкладки. 
1 000 000 в 9ой степени, мне кажется, ближе к истине...

Автор: math64 19.3.2013, 08:26
Для полинома наверно, можно найти.
Для полинома с одной переменной решение известно - определить знаки производных от первого порядка и далее на концах отрезка и в середине.
По переменам знаков определяем сколько корней имеет производная на каждой половине отрезка, выбираем нужную часть и т.д.

Для полинома с  девятью переменными нужно найти способ сокращения числа переменных.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)