|
|
| (40 intermediate revisions not shown) |
| Line 1: |
Line 1: |
| | + | <!-- |
| | + | |
| | {| align="right" | | {| align="right" |
| | | __TOC__ | | | __TOC__ |
| | |} | | |} |
| | | | |
| | + | == Dokumentacja == |
| | + | Dokumentacja środowiska ROOT: |
| | + | * strona główna: [https://root.cern.ch/ https://root.cern.ch/] |
| | + | * dokumentacja wersji rozwojowej (master): [https://root.cern.ch/doc/master/ https://root.cern.ch/doc/master/] |
| | + | * dokumentacja ostatniej wersji stabilnej (6.0.4): [https://root.cern.ch/root/html604/ https://root.cern.ch/root/html604/] |
| | + | * dokumentacja wersji zainstalowanej w laboratorium (5.32.00): [https://root.cern.ch/root/html532/ https://root.cern.ch/root/html532/] |
| | | | |
| | == Zadanie == | | == Zadanie == |
| - | Dana jest gęstość prawdopodobieństwa:
| + | 1. Należy napisać makro, które: |
| - | | + | * tworzy obiekt <code>fun1</code> typu <code>TF1</code> reprezentujący funkcję <code>sin(x)</code> (patrz klasa <code>TMath</code>) |
| - | [[File:Wzor_Lab03_Kadd2012.png]]
| + | * tworzy obiekt <code>fun2</code> typu <code>TF1</code> reprezentujący funkcję <code>cos(x)</code> |
| - | | + | * tworzy okno z 4 panelami (rozkład paneli 2x2) - patrz klasa <code>TCanvas</code> i metoda <code>Divide</code> |
| - | Należy dla parametrów '''m=1''' i '''n=2''': | + | * rysuje obiekt <code>fun1</code> na 1 panelu, <code>fun2</code> na 2 panelu, oraz obie funkcje jednocześnie na 3 panelu |
| - | * wyznaczyć stałą c w taki sposób aby rozkład gęstości był unormowany (1pkt) | + | * zmieni kolor linii funkcji <code>fun2</code> na niebieski - patrz metoda <code>SetLineColor</code> i klasa <code>TColor</code> |
| - | * narysować gęstość prawdopodobieństwa f(x,y) (1pkt)
| + | <br> |
| - | * wyznaczyć i narysować dystrybuante F(x,y) (1pkt) | + | 2. Wyobraźmy sobie, że rzucamy niesymetryczną sześcienną kostką do gry. Wyniki podsumowuje poniższa tabelka: |
| - | * wyznaczyć i narysować gęstość brzegową g(x) (1pkt) | + | {| class="wikitable" border="1" |
| - | * wyznaczyć i narysować gęstość brzegową h(y) (1pkt) | + | |- |
| | + | ! Ilość oczek |
| | + | | 1 |
| | + | | 2 |
| | + | | 3 |
| | + | | 4 |
| | + | | 5 |
| | + | | 6 |
| | + | |- |
| | + | ! Ilość rzutów |
| | + | | 2 |
| | + | | 1 |
| | + | | 5 |
| | + | | 4 |
| | + | | 10 |
| | + | | 12 |
| | + | |} |
| | + | Modyfikujemy dalej makro: |
| | + | * tworzymy histogram (patrz klasa <code>TH1D</code>) wypełniając kolejne biny (odpowiadające kolejnym ilościom oczek) wartościami z tabelki (ilość rzutów) - histogram należy narysować na panelu 4 |
| | + | * należy stworzyć wykres - graf (patrz klasa <code>TGraph</code>) zgodnie z wartościami z tabelki. |
| | + | * zmienić styl punktów grafu na kółko (patrz metoda <code>SetMarkerStyle</code> oraz klasa <code>TAttMarker</code>) |
| | + | * narysować graf w oddzielnym oknie |
| | | | |
| | == Uwagi == | | == Uwagi == |
| - | * Wszystkie wielkości (stałą c, dystrybuantę, gęstości brzegowe) wyznaczamy numerycznie np. wykorzystując metodę <code>Integral</code>. | + | * <b>Uwaga!</b> Aby środowisko ROOT można było uruchomić na własnym koncie użytkownika w laboratorium, należy w pliku <code>$HOME/.bashrc</code> dopisać następujące linijki (jeśli nie były dodane na zajęciach z PTI): |
| - | * Skrypt powienien być napisany w taki sposób aby wykonywał obliczenia dla dowolnego m i n.
| + | export ROOTSYS=/opt/root |
| - | * Należy oznaczyć i podpisać wszystkie osie.
| + | export PATH=$PATH:$ROOTSYS/bin |
| - | * Funkcję rozkladu gestosci (obiekt TF2) tworzymy poprzez wykorzystanie konstruktora zawierającego wskaźnik na funkcję (odpowiednio zdefiniowanej dla wszystkich wartości x i y):
| + | export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ROOTSYS/lib |
| - | double fcn(double *x, double *params)
| + | * środowisko ROOT jest zainstalowane lokalnie na każdym komputerze - nie jest dostępne na serwerze |
| - | | + | * w środowisku ROOT piszemy <b>makra</b>, które mają rozszerzenie .c, .C, .cpp, lub .cxx |
| - | TF2(const char* name, void* fcn, Double_t xmin = 0, Double_t xmax = 1, Double_t ymin = 0, Double_t ymax = 1, Int_t npar = 0)
| + | * makro zawiera w sobie kod w języku C++ interpretowany linijka po linijce |
| - | | + | * w zasadzie nie musimy załączać żadnych bibliotek |
| - | Przykład:
| + | * przykład 1: |
| - | double function(double *x, double *params)
| + | |
| | { | | { |
| - | if(x[0]>=0 && x[1]>=0)
| + | double x = 5; |
| - | return params[0]*x[0]*x[1];
| + | cout<<x<<endl; |
| - | return 0;
| + | |
| | } | | } |
| - | ...
| + | * wywołanie makra: uruchamiamy środowisko (komenda <code>root</code>), wpisujemy <code>.x macro.C</code> |
| - | double xmin = 0; | + | * makro może zawierać również <b>funkcje</b>, przykład 2: |
| - | double xmax = 10; | + | int macro() |
| - | double ymin = 0;
| + | { |
| - | double xmax = 10;
| + | double x = 5; |
| - | int nparams = 1;
| + | cout<<x<<endl; |
| - | TF2 * fun1 = new TF2("fun1",function,xmin,xmax,ymin,ymax,nparams); | + | return 1; |
| | + | } |
| | + | * nazwa makra musi być taka sama jak nazwa funkcji w makrze (by można było je uruchomić komendą <code>.x macro.C</code>) |
| | + | * w makrach może być więcej funkcji - przy standardowym uruchomieniu wywołana zawsze będzie ta funkcja, której nazwa zgadza się z nazwą makra (odpowiednik funkcji <code>main</code> w standardowym C++) |
| | | | |
| | == Wynik == | | == Wynik == |
| | Wykresy: | | Wykresy: |
| - | [[File:Zad03_KADD2012.png]] | + | * okno 1 |
| - | | + | [[File:lab1_1.png]] |
| - | Output:
| + | * okno 2 |
| - | Wspolczynnik normujacy c=6
| + | [[File:1_2.png]] |
| | + | --> |