Загрузка данных


#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;
}