フィット関数を定義したい(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が提供する数学関数(sincosexpsqrtなど)が使用できます。

カスタム関数からフィット関数を定義したい(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メソッドで設定します。

関数の最小値・最大値を求めたい(GetMinimumGetMaximum

 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値に対する関数値を計算できます。

関連メソッド

参考リンク