#define _USE_MATH_DEFINES // Для константы M_PI в Visual Studio
#include <iostream>
#include <cmath>
#include <fstream>
#include <iomanip>
using namespace std;
// Наша заданная функция
double f(double x) {
if (x <= 0) return NAN; // Защита от выхода за область определения
return log(M_PI * x) * x * exp(-x);
}
int main() {
setlocale(LC_ALL, "ru_RU.UTF-8");
// Заданные параметры
double a = 0.001; // Сдвигаем a=0, так как ln(0) не существует
double b = 1.0;
double eps = 0.001; // Требуемая погрешность
double delta = eps / 2.1; // Шаг отклонения (должен быть строго меньше eps/2)
double left = a;
double right = b;
// --- Поиск экстремума (минимума) методом дихотомии ---
// Условие остановки: длина отрезка стала меньше или равна погрешности
while ((right - left) > eps) {
double mid = (left + right) / 2.0;
double x1 = mid - delta;
double x2 = mid + delta;
// Ищем минимум. Если f(x1) < f(x2), значит минимум левее x2.
if (f(x1) < f(x2)) {
right = x2;
} else {
left = x1;
}
}
// Точка экстремума - середина финального узкого отрезка
double x_min = (left + right) / 2.0;
double y_min = f(x_min);
cout << "========================================\n";
cout << "РЕЗУЛЬТАТЫ ИССЛЕДОВАНИЯ ФУНКЦИИ\n";
cout << "========================================\n";
cout << "Метод: Дихотомия (без использования производных)\n";
cout << "Погрешность: " << eps << "\n\n";
cout << fixed << setprecision(5);
cout << "Экстремум (локальный минимум) найден в точке:\n";
cout << "x = " << x_min << "\n";
cout << "Значение функции в этой точке:\n";
cout << "f(x) = " << y_min << "\n\n";
// --- Подготовка данных для графика ---
ofstream dataFile("graph_data.csv");
dataFile << "x,y\n";
for (double x = a; x <= b; x += 0.005) {
dataFile << x << "," << f(x) << "\n";
}
dataFile.close();
// --- Генерация скрипта для отрисовки графика ---
ofstream plotScript("plot.py");
plotScript << "import matplotlib.pyplot as plt\n"
<< "import pandas as pd\n\n"
<< "try:\n"
<< " data = pd.read_csv('graph_data.csv')\n"
<< " plt.figure(figsize=(8, 5))\n"
<< " plt.plot(data['x'], data['y'], label='f(x) = ln(πx) * x * e^{-x}', color='blue')\n"
<< " # Отмечаем точку экстремума\n"
<< " plt.scatter([" << x_min << "], [" << y_min << "], color='red', zorder=5, label='Минимум (" << x_min << ", " << y_min << ")')\n"
<< " plt.axvline(x=" << x_min << ", color='red', linestyle='--', alpha=0.5)\n"
<< " plt.title('Исследование функции f(x) методом дихотомии')\n"
<< " plt.xlabel('Ось X')\n"
<< " plt.ylabel('Ось Y')\n"
<< " plt.grid(True)\n"
<< " plt.legend()\n"
<< " plt.show()\n"
<< "except Exception as e:\n"
<< " print('Ошибка при построении графика:', e)\n";
plotScript.close();
cout << "Файл данных 'graph_data.csv' и скрипт графика 'plot.py' успешно созданы.\n";
// Запуск Python скрипта (раскомментируйте строку ниже, если у вас установлен Python)
// system("python plot.py");
return 0;
}