const double var_x[5] = {0.000, 1.000, 2.000, 3.000, 4.000}; const double var_y[5] = {1.951, 1.995, 3.088, 4.220, 6.553}; const double cov_y[5][5] = { {1.000, 0.020, 0.000, 0.000, 0.000}, {0.020, 0.485, 0.103, 0.000, 0.000}, {0.000, 0.103, 0.740, 0.170, 0.000}, {0.000, 0.000, 0.170, 0.316, 0.214}, {0.000, 0.000, 0.000, 0.214, 0.520} }; double model(double x, double a, double b) { return a*x + b; } double chisq(double a, double b) { TVectorD vec(5); for (int r=0; r<5; r++) { double func = model(var_x[r],a,b); vec(r) = func-var_y[r]; } TMatrixD cov(5,5); for (int r=0; r<5; r++) { for(int c=0;c<5;c++) { cov(r,c) = cov_y[r][c]; } } return cov.Invert()*vec*vec; } void example_01() { TH2D *Q2 = new TH2D("Q2","chisqure(a,b)",20,0.,2.,20,0.,2.); for (int j=0; j<20; j++) { for (int i=0; i<20; i++) { double a = (double)i*0.1+0.05; double b = (double)j*0.1+0.05; Q2->SetBinContent(i+1,j+1,chisq(a,b)); } } Q2->GetXaxis()->SetTitle("a"); Q2->GetYaxis()->SetTitle("b"); Q2->SetStats(false); Q2->SetContour(64); Q2->Draw("colz"); }