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


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