- •Введение
- •Основы работы с ROOT
- •Что такое ROOT
- •Установка и запуск ROOT
- •Системные требования
- •Способы установки
- •Запуск ROOT
- •Первые шаги в ROOT
- •Интерактивная оболочка CINT
- •Создание простых объектов
- •Структура ROOT
- •Основные классы
- •Система наименований
- •Работа с гистограммами
- •Введение в гистограммы
- •Одномерные гистограммы (TH1)
- •Создание гистограммы
- •Типы гистограмм
- •Настройка внешнего вида
- •Двумерные гистограммы (TH2)
- •Операции с гистограммами
- •Арифметические операции
- •Статистические функции
- •Графики и визуализация
- •Класс TGraph
- •Создание простого графика
- •График с погрешностями
- •Многопанельные графики
- •Разделение холста
- •Функции в ROOT
- •Создание и отображение функций
- •Многомерные функции
- •Легенды и аннотации
- •Создание легенды
- •Добавление текста
- •Работа с деревьями (Trees)
- •Введение в ROOT Trees
- •Создание дерева
- •Простое дерево
- •Дерево с массивами
- •Чтение деревьев
- •Простое чтение
- •Использование TTreeReader
- •Селекция данных
- •Использование Draw с условиями
- •TEntryList для сложной селекции
- •Анализ данных и фитирование
- •Введение в фитирование
- •Фитирование гистограмм
- •Простое фитирование
- •Фитирование пользовательской функцией
- •Фитирование графиков
- •Линейная регрессия
- •Нелинейное фитирование
- •Минимизация и оптимизация
- •Использование Minuit
- •Продвинутые возможности
- •RooFit - статистическое моделирование
- •Основы RooFit
- •Генерация и фитирование данных
- •Многомерный анализ
- •Анализ главных компонент (PCA)
- •Параллельные вычисления
- •ROOT::EnableImplicitMT
- •Веб-интерфейс
- •ROOT в Jupyter
- •Практические примеры и упражнения
- •Анализ физических данных
- •Анализ распада частиц
- •Упражнения для самостоятельной работы
- •Упражнение 1: Анализ распределений
- •Упражнение 2: Корреляционный анализ
- •Упражнение 3: Работа с реальными данными
- •Проекты
- •Проект 1: Анализатор логов детектора
- •Проект 2: Статистический анализ
- •Заключение
- •Приложения
5.4. Минимизация и оптимизация |
21 |
20double slope = line->GetParameter(1);
21double r2 = line->GetChisquare() / line->GetNDF();
22
23cout << "y = " << intercept << " + " << slope << "*x" << endl;
24cout << "R² = " << r2 << endl;
5.3.2Нелинейное фитирование
1// Экспоненциальные данные
2 for(int i = 0; i < n; i++) {
3x[i] = i * 0.5;
4 y[i] = 10 * exp(-x[i]/3.0) + gRandom->Gaus(0, 0.5);
5ey[i] = 0.5;
6}
7
8TGraphErrors* gr_exp = new TGraphErrors(n, x, y, ex, ey);
9
10// Экспоненциальная функция
11TF1* expo = new TF1("expo", "[0]*exp(-x/[1])", 0, 10);
12expo->SetParameters(10, 3); // Начальные приближения
13
14 gr_exp->Fit(expo);
15
16// Расчёт доверительных интервалов
17TGraphErrors* confidence = new TGraphErrors(100);
18for(int i = 0; i < 100; i++) {
19double xx = i * 0.1;
20double yy = expo->Eval(xx);
21double err = expo->GetParError(0) * exp(-xx/expo->GetParameter(1));
22confidence->SetPoint(i, xx, yy);
23confidence->SetPointError(i, 0, err);
24}
5.4Минимизация и оптимизация
5.4.1Использование Minuit
1#include "Math/Minimizer.h"
2#include "Math/Factory.h"
3#include "Math/Functor.h"
4
5// Определение функции для минимизации
6 double chi2Function(const double *par) {
7double chi2 = 0;
8for(int i = 0; i < n; i++) {
9double theory = par[0] + par[1] * x[i];
10double residual = (y[i] - theory) / ey[i];
11chi2 += residual * residual;
12}
22 |
Глава 5. Анализ данных и фитирование |
13return chi2;
14}
15
16// Настройка минимизатора
17ROOT::Math::Minimizer* minimizer =
18ROOT::Math::Factory::CreateMinimizer("Minuit2", "Migrad");
19
20minimizer->SetMaxFunctionCalls(1000000);
21minimizer->SetTolerance(0.001);
22minimizer->SetPrintLevel(1);
23
24// Создание функтора
25ROOT::Math::Functor f(&chi2Function, 2);
26minimizer->SetFunction(f);
27
28// Установка переменных
29minimizer->SetVariable(0, "intercept", 0, 0.1);
30minimizer->SetVariable(1, "slope", 1, 0.1);
31
32// Минимизация
33minimizer->Minimize();
34
35// Получение результатов
36const double *xs = minimizer->X();
37cout << "Лучшие параметры: " << xs[0] << ", " << xs[1] << endl;
