Úvod do praktické fyziky NOFY055
Programování pro statistiku a zpracování měření v příkladech
Mgr. Jan Matoušek, Ph.D.
Výběr jazyka/prostředí:
python root
Zpět na hlavní stránku
Hello world program
Co je potřeba udělat, abych dostal nejjednoduší možný funkční program?
Vytvořím soubor test.cc, obsahující:
void test()
{
printf("Hello world!\n");
}
Program spustím z příkazového řádku:
user@machine:~$ root test.cc
root [0] Hello world!
Prostředí ROOTu opustím příkazem
root [1] .q
Proměnné, podmínka
Definice proměnných, jednoduchá operace, vypsání výsledku:
void variables()
{
int n = 2;
double x = 3.5;
printf("n = %i, x = %f\n", n, x);
double y = n * x + 4;
if (y >= 0)
{
double z = sqrt(y);
printf("y = %f, z = sqrt(y) = %f\n", y, z);
}
else
printf("y = %f, z = sqrt(y) není definováno.\n",y);
}
Generování náhodných čísel
Generujeme 100 čísel s rovnoměrným rozdělením v intervalu (0,1):
void rndm()
{
TRandom3* random = new TRandom3();
for (int i = 0; i < 100; i++)
{
double x = random->Rndm();
printf("%f\n",x);
}
}
Generování čísel do pole:
void rndm_array()
{
const int N = 100;
double x[N];
TRandom3* random = new TRandom3();
for (int i = 0; i < N; i++)
x[i] = random->Rndm();
for (int i = 0; i < N; i++)
printf("%i\t%f\n", i, x[i]);
}
Graf
Jednoduchý graf funkce sin(2x):
void graph()
{
int N = 100;
double xMin = -TMath::Pi();
double xMax = TMath::Pi();
double dx = (xMax - xMin) / N;
TGraph* graph = new TGraph(N);
for (int i = 0; i < N; i++)
{
double x = xMin + i * dx;
graph->SetPoint(i, x, sin(2*x));
}
graph->SetTitle("");
graph->GetXaxis()->SetTitle("x");
graph->GetYaxis()->SetTitle("y");
graph->SetMarkerStyle(2);
graph->Draw("PA");
TF1* func = new TF1("func","cos(2*x)",xMin,xMax);
func->Draw("SAME");
}
Histogram
Histogram reprezentuje distribuci nějaké numerické veličiny. Je to typ grafu, kde vertikální osa vyjadřuje četnost výskytu sledované veličiny v intervalech (binech) znázorněných na horizontální ose. Histogram uděláme následovně: Nejdřív rozdělíme rozsah dané veličiny na biny. Potom sledujeme danou veličinu v nějakém počtu případů a zaznamenáme, kolikrát leží ve kterém binu. Příklad vytvoření histogramu a jeho naplnění exponenciálně rozdělenou náhodnou veličinou:
void histo()
{
int N = 100;
double tau = 1;
TRandom3* random = new TRandom3();
int nBins = 10;
double xmin = 0;
double xmax = -1;
TH1D* hist = new TH1D("hist", "", nBins, xmin, xmax);
hist->GetXaxis()->SetTitle("x");
for (int i = 0; i < N; i++)
hist->Fill(random->Exp(tau));
hist->Draw();
printf("underflow: %f, overflow: %f\n",
hist->GetBinContent(0),
hist->GetBinContent(nBins+1));
for (int i = 1; i <= nBins; i++)
printf("bin [%f, %f], případů: %f\n", hist->GetBinLowEdge(i),
hist->GetBinContent(i), hist->GetBinLowEdge(i+1));
}
![Ukázka histogramu](prog/histo.cc.png)
Volby zobrazení histogramu:
https://root.cern.ch/doc/master/classTHistPainter.html
Zápis do souboru
Zapíšeme do souboru dvojice náhodných čísel:
void out()
{
FILE* file = fopen("data.txt","w");
TRandom3* random = new TRandom3();
for (int i = 0; i < 10; i++)
{
double x = random->Gaus(0,0.5);
double y = random->Gaus(2.5,1);
fprintf(file,"%f\t%f\n", x, y);
}
fclose(file);
}
Čtení ze souboru
Následující program přečte textový soubor vytvořený v předchozím příkladě a spočítá průměr každého sloupce (odhad střední hodnoty rozdělení).
void in()
{
FILE* file = fopen("data.txt","r");
double mx = 0;
double my = 0;
double x, y;
int n = 0;
while(fscanf(file,"%lf%lf", &x, &y) == 2)
{
printf("přečteno: %f\t%f\n", x, y);
mx += x;
my += y;
n++;
}
fclose(file);
mx /= n;
my /= n;
printf("---------------------------------\n");
printf("průměrné x = %f, průměrné y = %f\n", mx, my);
}
Výběr jazyka/prostředí:
python root
Zpět na hlavní stránku