//makro do narysowania napięcia (U) w funkcji natężenia (I) //dodatkowo dopasowanie funkcji y=ax { gROOT->Reset(); //deklarujemy tablice danych: //x - natężenie //y - napięcie //ex, ey - odpowiednie niepewności tych wartości //17 - oznacza ile będzie takich par xy TCanvas *c1 = new TCanvas("c1","",500,10,600,600); //definiujemy nowy obszar (płótno) na rysunek o rozmiarze 600 na 600 //*c1 to wskaźnik do obiektu klasy TCanvas c1->SetBottomMargin(0.2); c1->SetLeftMargin(0.15); c1->SetFillColor(0); c1->SetHighLightColor(0); //obwódka rysunku //rysujemy ramkę żeby zdefiniować zakres osi TH1F *hr = c1->DrawFrame(0, 0, 37, 15); //xmin, ymin, xmax, ymax hr->SetXTitle("I (mA)"); //w tym przykładzie osie opisujemy tu hr->SetYTitle("U (V)"); c1->GetFrame()->SetFillColor(0); //kolor tła wewnętrznego hr->GetXaxis()->SetLabelSize(0.04); //rozmiary liczb na osi hr->GetXaxis()->SetTitleOffset(1.4); //odleglość opisu od osi hr->GetYaxis()->SetLabelSize(0.04); hr->GetYaxis()->SetTitleOffset(1.4); hr->GetXaxis()->SetTitleSize(0.045); //rozmiar tytułu osi hr->GetYaxis()->SetTitleSize(0.045); //hr->SetTitle("prawo Ohma"); //hr->GetXaxis()->SetNdivisions(8, kTRUE); //podziałka osi (około 8) //hr->GetYaxis()->SetNdivisions(8, kTRUE); //ale kTRUE - sam dobiera double x[17]={34.0, 32.3, 29.6, 26.6, 25.8, 24.1, 21.8, 16.75, 14.65, 12.33, 10.66, 7.83, 6.35, 4.99, 3.32, 1.283, 0.619}; double y[17]={13.0, 12.5, 11.5, 10.5, 10.0, 9.5, 8.4, 6.4, 5.6, 4.8, 4.2, 3.0, 2.4, 1.9, 1.25, 0.48, 0.24}; double ex[17]={0.2933, 0.2815, 0.2628, 0.2420, 0.2365, 0.2247, 0.2088, 0.0541, 0.0481, 0.0414, 0.0365, 0.0284, 0.0241, 0.0202, 0.0154, 0.0043, 0.0024}; double ey[17]={0.2255, 0.2255, 0.2255, 0.2255, 0.2255, 0.2255, 0.0816, 0.0816, 0.0816, 0.0816, 0.0816, 0.0816, 0.0225, 0.0225, 0.0225, 0.0082, 0.0082}; //deklarujemy wskaźnik do obiektu klasy TGraphErrors TGraphErrors *gr = new TGraphErrors(17,x,y,ex,ey); //teraz opcje żeby rysunek ładniej wyglądał gr->SetMarkerColor(596); //kolor markera gr->SetMarkerStyle(8); //typ punktów gr->SetMarkerSize(1); //rozmiar punktów (powinny być tu większe ale zupełnie nie będzie wtedy widać niepewności) //gr->SetLineColor(1); //ewentualny kolor linii gr->Draw("P"); //bez opcji "A" bo zakres osi dobieramy wyżej sami //teraz dopasowujemy krzywą o równaniu: //U(I)=R*I //deklarujemy funkcję o jednym parametrze: [0] //i zakresie od 0 do 35: TF1 *fun = new TF1("fun","[0]*x",0,35); fun->SetParameter(0,1.00); //ustawiamy startową wartość parametru wolnego [0] //fun->SetParameter(1,1.00); //jeśli byłby więcej niż jeden parametr np. "[0]*x+[1]" //można też zrobić ładniejszą krzywą: fun->SetLineColor(414); fun->SetLineStyle(1); fun->SetLineWidth(3); gr->Fit("fun","N",""); //tą komendą dopasowujemy funkcję fun //do punktów zawartych w gr //"N" oznacza brak rysowania wyników dopasowania na płótnie (funkcja dopasowania zostanie wykonana, ale krzywa dopasowania nie będzie automatycznie rysowana na wykresie) //narysujemy funkcję oddzielnie poniżej tak, żeby najpierw była krzywa (prosta) a następnie na niej (na wierzchu) punkty //parametr dopasowania (p0) wypisuje się na ekranie //ale można wypisać dodatkowo: cout<<"a (opór w kilo Ohmach) = "<GetParameter(0)<<" oraz niepewność (k Ohm): "<GetParError(0)<GetParError(0)*1000.0<Draw("P"); //jeszcze raz rysujemy tu punkty (żeby krzywa ich nie przecinała) TLegend *legend = new TLegend(0.2, 0.75, 0.5, 0.87); //od lewej, od dołu, od prawej, od góry legend->SetBorderSize(0); legend->SetTextSize(0.04); legend->SetFillColor(0); legend->AddEntry(gr,"dane (CLF)","P"); legend->AddEntry(fun,"y=ax","L"); legend->Draw(); }