#include <iostream>
#include <cmath>
#include <iomanip>
// Заданная функция f(x) = ln(πx) * x * e^(-x)
double f(double x) {
return log(M_PI * x) * x * exp(-x);
}
// ПРАВИЛЬНАЯ производная функции f(x)
// Получена по правилу дифференцирования произведения:
// f'(x) = e^(-x) * (1 + (1 - x) * ln(πx))
double df(double x) {
return exp(-x) * (1.0 + (1.0 - x) * log(M_PI * x));
}
// Метод дихотомии для поиска экстремума
double dichotomy(double a, double b, double epsilon) {
double mid;
// Пока отрезок больше заданной точности
while ((b - a) > epsilon) {
mid = (a + b) / 2.0;
// Если производная на концах [a, mid] имеет разные знаки,
// значит корень (минимум) в левой половине
if (df(a) * df(mid) < 0) {
b = mid;
} else {
// Иначе — в правой
a = mid;
}
}
// Возвращаем середину последнего интервала как приближенное значение x
return (a + b) / 2.0;
}
int main() {
// Начальные параметры
double a = 0.001; // Начало интервала (чуть больше 0, чтобы log(πx) существовал)
double b = 1.0; // Конец интервала
double epsilon = 0.001; // Заданная погрешность
// Поиск экстремума
double extremumX = dichotomy(a, b, epsilon);
double extremumY = f(extremumX);
// Вывод результатов с высокой точностью
std::cout << std::fixed << std::setprecision(6);
std::cout << "=== Исследование функции f(x) ===" << std::endl;
std::cout << "Экстремум (минимум) найден в точке x = " << extremumX << std::endl;
std::cout << "Значение функции в этой точке f(x) = " << extremumY << std::endl;
return 0;
}