%%cpp -d #include %%cpp -d Double_t RosenBrock(const TVectorD xx ) { const Double_t x = xx[0]; const Double_t y = xx[1]; const Double_t tmp1 = y-x*x; const Double_t tmp2 = 1-x; return 100*tmp1*tmp1+tmp2*tmp2; } %%cpp -d TVectorD RosenBrockGrad(const TVectorD xx ) { const Double_t x = xx[0]; const Double_t y = xx[1]; TVectorD grad(2); grad[0]=-400 * x * (y - x * x) - 2 * (1 - x); grad[1]=200 * (y - x * x); return grad; } ROOT::R::TRInterface &r=ROOT::R::TRInterface::Instance(); r["RosenBrock"]=ROOT::R::TRFunctionExport(RosenBrock); r["RosenBrockGrad"]=ROOT::R::TRFunctionExport(RosenBrockGrad); r.Execute("result <- optim( c(0.01,0.01), RosenBrock,method='BFGS',control = list(maxit = 1000000) )"); TVectorD min=r.Eval("result$par"); std::cout.precision(8); std::cout<<"-----------------------------------------"<