inttm_romberg(f,a,b,epsi):={ local lt0,lt1,lm0,lm1,puis,puiss2,k,j,st,sm,s1,test; //initialisation on a 1 intervalle st:=evalf((f(a)+f(b))/2); sm:=evalf(f((a+b)/2)); puiss2:=1; lt0:=[st*(b-a)]; lm0:=[sm*(b-a)]; k:=1; test:=1; while (test>epsi) { //calcul de la methode des trapezes avec 2^k intervalles st:=st+sm; //calcul de la methode des milieux avec 2^k intervalles puiss2:=2*puiss2; s1:=0.0; for (j:=0;j<puiss2;j++) { s1:=s1+f(a+(2*j+1)*(b-a)/(2*puiss2)); } sm:=s1; lm1:=[sm*(b-a)/puiss2]; lt1:=[st*(b-a)/puiss2]; //debut de l'acceleration de Romberg //calcul des T_{k,j} (j=1..k) dans lt1 //calcul des M_{k,j} (j=1..k) dans lm1 j:=1; while ((test>epsi) and (j<=k)) { puis:=2^(2*j); lt1[j]:=(puis*lt1[j-1]-lt0[j-1])/(puis-1); lm1[j]:=(puis*lm1[j-1]-lm0[j-1])/(puis-1); test:=abs(lt1[j]-lm1[j]); j:=j+1; } lt0:=lt1; lm0:=lm1; k:=k+1; } return [k-1,j-1,lt1[j-1],lm1[j-1]]; }