フィット関数を定義したい(TF1)
1#include <TF1.h>
2#include <cmath>
3
4TF1 *f = new TF1("f", "sin(x)*cos(x)", 0, 2*M_PI);
5
6// 関数を描画
7f->Draw();
TF1クラスで数学関数を定義し、描画やフィットに使用できます。
関数は数式文字列、C++関数、またはラムダ式で指定できます。
1import ROOT
2import math
3
4f = ROOT.TF1("f", "sin(x)*cos(x)", 0, 2*math.pi)
5
6# 関数を描画
7f.Draw()
メソッドのシグネチャ
1TF1(const char* name,
2 const char* formula,
3 Double_t xmin,
4 Double_t xmax)
5
6TF1(const char* name,
7 Double_t (*fcn)(Double_t*),
8 Double_t xmin,
9 Double_t xmax)
引数と戻り値
引数:
name - 関数の名前
formula - 数式文字列(
sin(x)、x*x+2*x+1など)または関数ポインターxmin - 関数の定義域下限
xmax - 関数の定義域上限
戻り値:
TF1オブジェクト
数式からフィット関数を定義したい(TF1)
1#include <TF1.h>
2#include <TCanvas.h>
3#include <cmath>
4
5TF1 *f1 = new TF1("f1", "sin(x)", 0, 2*M_PI);
6TF1 *f2 = new TF1("f2", "x*x", -5, 5);
7TF1 *f3 = new TF1("f3", "exp(-x*x/2)", -3, 3);
8
9TCanvas *c = new TCanvas("c", "Functions", 900, 300);
10c->Divide(3, 1);
11
12c->cd(1);
13f1->Draw();
14
15c->cd(2);
16f2->Draw();
17
18c->cd(3);
19f3->Draw();
数式の文字列でフィット関数を定義できます。
ROOTが提供する数学関数(sin、cos、exp、sqrtなど)が使用できます。
カスタム関数からフィット関数を定義したい(TF1)
1#include <TF1.h>
2
3Double_t myFunc(Double_t *x, Double_t *par) {
4 // x[0]は独立変数、par[0]以降はパラメータ
5 return par[0] * sin(x[0]) + par[1];
6}
7
8TF1 *f = new TF1("f", myFunc, 0, 2*M_PI, 2);
9
10// パラメータを初期化
11f->SetParameter(0, 1.0); // 振幅
12f->SetParameter(1, 0.0); // オフセット
13
14f->Draw();
カスタム関数で複雑なフィット関数を定義できます。 パラメーターを持つ関数も定義できます。
ラムダ式からフィット関数を定義したい(TF1)
1#include <TF1.h>
2
3auto lambda = [](double *x, double *p) {
4 return p[0] * exp(-0.5 * pow((x[0] - p[1]) / p[2], 2));
5};
6
7TF1 *f = new TF1("gauss", lambda, 0, 10, 3);
8f->SetParameter(0, 1.0); // 振幅
9f->SetParameter(1, 5.0); // 平均値
10f->SetParameter(2, 1.0); // 標準偏差
11
12f->Draw();
ラムダ式を使用して、関数をコンパクトに定義できます。
パラメーターを持つフィット関数を定義したい(SetParameter)
1#include <TF1.h>
2#include <TCanvas.h>
3
4TF1 *f = new TF1("f", "[0]*sin([1]*x+[2])", 0, 2*M_PI);
5
6// パラメータを設定: [0]=振幅、[1]=周波数、[2]=位相
7f->SetParameter(0, 1.0);
8f->SetParameter(1, 1.0);
9f->SetParameter(2, 0.0);
10
11f->SetLineColor(2);
12f->SetLineWidth(2);
13f->Draw();
14
15// パラメータを変更して再度描画
16f->SetParameter(0, 2.0);
17f->SetParameter(1, 0.5);
18f->DrawCopy("same");
"[0]*sin([1]*x+[2])"のように数式に[0]、[1]などの記号を使用してパラメーターを指定できます。
パラメーターの初期値はSetParameterメソッドで設定します。
関数の最小値・最大値を求めたい(GetMinimum、GetMaximum)
1#include <TF1.h>
2#include <iostream>
3
4TF1 *f = new TF1("f", "x*x-4*x+3", -1, 5);
5
6Double_t xmin = f->GetMinimumX(0, 5);
7Double_t ymin = f->GetMinimum(0, 5);
8
9Double_t xmax = f->GetMaximumX(0, 5);
10Double_t ymax = f->GetMaximum(0, 5);
11
12std::cout << "Minimum: (" << xmin << ", " << ymin << ")" << std::endl;
13std::cout << "Maximum: (" << xmax << ", " << ymax << ")" << std::endl;
関数の最小値と最大値、およびそれらの位置を求めることができます。
関数を評価したい(Eval)
1#include <TF1.h>
2#include <iostream>
3
4TF1 *f = new TF1("f", "sin(x)*cos(x)", 0, 2*M_PI);
5
6// x=1.0での関数値を計算
7Double_t y = f->Eval(1.0);
8
9std::cout << "f(1.0) = " << y << std::endl;
Eval()で指定したx値に対する関数値を計算できます。
関連メソッド
SetParameter - パラメーターを設定
SetLineColor - 線の色を設定
Draw - 関数を描画
Fit - ヒストグラムにフィット