Для того, чтобы найти минимум или максимум функции на заданном интервале [a,b] с точностью eps можно воспользоваться методом "золотого сечения" или комбинированным методом: double goldenRatioMin ( double a, double b, const MathFunc1 & func, double eps ); double goldenRatioMax ( double a, double b, const MathFunc1 & func, double eps ); double fmin ( double a, double b, const MathFunc1 & func, double eps ); double fmax ( double a, double b, const MathFunc1 & func, double eps ); Алгоритм fmin я взял из книги "Машинные методы математических вычислений" (Дж.Форсайт, М.Малькольм, К.Моулер) и переписал с небольшими изменениями с FORTRANа на С++. Он представляет собой комбинацию метода "золотого сечения" и параболической интерполяции. Аналогично был сделан алгоритм fmax. В моих тестах этот алгоритм в среднем делал в 2 раза меньше запросов вычисления значений функции, чем метод "золотого сечения". Для разных функций этот показатель у меня колебался от 10 до 90%. Следующая функция находит минимакс на множестве парабол вида x*x + a*x + b: Def<double> getMinMaxParabola1d ( CArrRef<Set2<double> > arr );Описание шаблона классов Def находится здесь. Описание шаблона классов Set2 находится здесь. Описание шаблона классов CArrRef находится здесь. Исходники находятся в файле opti1d.cpp. Наверх |