Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ROOT / CERN ROOT book.pdf
Скачиваний:
1
Добавлен:
14.12.2025
Размер:
433.58 Кб
Скачать

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;

Соседние файлы в папке ROOT