#include #include "TRandom.h" #include "TPad.h" #include "TCanvas.h" #include "TProfile.h" #include "TFrame.h" int preda() { // Definizioni preliminari: gROOT->Reset(); TCanvas* c1 = new TCanvas("c1","Modello preda/predatore",200,10,800,800); c1->SetFillColor(18); TPad* pad1 = new TPad("pad1","Prede",0.05,0.50,0.95,0.95,21); TPad* pad2 = new TPad("pad2","Predatori",0.05,0.05,0.95,0.45,21); pad1->Draw(); pad2->Draw(); pad1->cd(); //TFile *hfile = gROOT->FindObject("output.root"); if (hfile) hfile->Close(); //hfile = new TFile("output.root","RECREATE","Conviene averlo per analisi off-line"); // Settaggi dell'utente: const int maxtime = 100; // durata dell'esperimento int nprede = 10000; // num. iniziale di prede int npredatori = 200; // num. iniziale di predatori const float prob_mangia = 0.01; // parametro che regola la probabilita' di successo di un predatore con una preda const float mort_prede = 0.20; // mortalita' naturale (cioe' non dovuta a predatori) delle prede const float mort_predatori = 0.20; // mortalita' naturale dei predatori const float natal_prede = 0.23; // natalita' delle prede const float natal_predatori = 0.20; // natalita' dei predatori int max1=nprede; int max2=npredatori; TProfile *hprede = new TProfile("hprede","N. prede in funzione del tempo",maxtime,0,maxtime,0,max1*4); TProfile *hpredatori = new TProfile("hpredatori","N. predatori in funzione del tempo",maxtime,0,maxtime,0,max2*4); //hprede->SetFillColor(48); gRandom->SetSeed(); hprede->SetXTitle("cicli"); hprede->SetYTitle("prede"); hpredatori->SetXTitle("cicli"); hpredatori->SetYTitle("predatori"); // hprede->SetMarkerSize(10); hprede->SetMarkerStyle(2); // hpredatori->SetMarkerSize(10); hpredatori->SetMarkerStyle(2); pad1->cd(); pad1->SetGridx(); pad1->SetGridy(); // pad1->GetFrame()->SetFillColor(42); pad1->GetFrame()->SetBorderMode(-1); pad1->GetFrame()->SetBorderSize(5); pad2->cd(); pad2->SetGridx(); pad2->SetGridy(); // pad2->GetFrame()->SetFillColor(42); pad2->GetFrame()->SetBorderMode(-1); pad2->GetFrame()->SetBorderSize(5); // Loop sul tempo: for ( Int_t t=0; tmax1) { max1=nprede; hprede->SetMaximum(1.25*max1); hprede->SetMinimum(-1); } if (npredatori>max2) { max2=npredatori; hpredatori->SetMaximum(1.25*max2); hpredatori->SetMinimum(-1); } // riempi gli istogrammi: hprede->Fill(t,nprede); hpredatori->Fill(t,npredatori); cout << "prede: " << nprede << ", predatori: " << npredatori << ", time: " << t << " " << maxtime << endl; // visualizzazione: pad1->cd(); hprede->Draw("hist p"); pad1->Update(); pad2->cd(); hpredatori->Draw("hist p"); pad2->Update(); // salvo i valori attuali di npredatori e nprede in variabili temporanee che posso modificare senza incasinare i loop: int nprede_new=nprede; int npredatori_new=npredatori; // Attenzione: in uno stesso ciclo tutti gli eventi vanno considerati contemporanei! Cioe': puo' capitare che lo stesso animale muoia di morte naturale o per mano di un predatore nello stesso ciclo. L'eventualita' va interpretata come un animale che viene mangiato da un predatore ma che sarebbe morto in ogni caso di li' a poco... // nascite: for ( Int_t i=0; iRndm(1); if (randomRndm(1); if (randomRndm(1); if (randomRndm(1); if (randomRndm(1); if (random