Bonjour,
je possède un algorithme qui calcule la triple intégrale à l'aide de la méthode de gauss,le programme fonctionne parfaitement, le voila:
Code:! programme principal !------------------------------------------------------------------- !implicit none external quad3d,qtrapx,qtrapy,qtrapz,y1,y2,z1,z2,func double precision qtrapx,qtrapy,qtrapz,y1,y2,z1,z2,func !double precision x1,x2,ss,pk x1=0.0 x2=100.0 call quad3d(x1,x2,ss) pk=ss write(6,*)pk end ! subroutine qui calcul une integrale triple !------------------------------------------------------------------- subroutine quad3d(x1,x2,ss) real ss,x1,x2,h external h call qgausx(h,x1,x2,ss) return end function f(zz) real f,zz,func,x,y,z common /xyz/ x,y,z z=zz f=func(x,y,z) return end function g(yy) real g,yy,x,y,z,f,z1,z2 external f common /xyz/ x,y,z y=yy call qgausz(f,z1(x,y),z2(x,y),ss) g=ss return end function h(xx) real h,xx,g,y1,y2,x,y,z external g common /xyz/ x,y,z real ss x=xx call qgausy(g,y1(x),y2(x),ss) h=ss return end ! LA fonction à integrer !--------------------------------------------------------------------- FUNCTION func(x,y,z) !func= x*(x+3*y) func=1.0 RETURN END ! LA fonction z1(x) !--------------------------------------------------------------------- FUNCTION z1(x,y) z1= 0.0 RETURN END ! LA fonction z2(x) !--------------------------------------------------------------------- FUNCTION z2(x,y) z2=100.0-x-y RETURN END ! LA fonction y1(x) !--------------------------------------------------------------------- FUNCTION y1(x) y1= 0.0 RETURN END ! LA fonction y2(x) !--------------------------------------------------------------------- FUNCTION y2(x) y2= 100.0-x RETURN END ! INTEGRATION PAR LA METHODE DE GAUSS !----------------------------------------------------------------- SUBROUTINE qgausx(func,a,b,ss) REAL a,b,ss,func EXTERNAL func INTEGER j REAL dx,xm,xr,w(5),x(5) SAVE W,x DATA w/.2955242247,.2692667193,.2190863625,.149451349,.0666713449/ DATA x/.1488743389,.433395394,.6794095682,.8650633666,.9739065285/ xm=0.5*(b+a) xr=0.5*(b-a) ss=0 do 11 j=1,5 dx=xr*x(j) ss=ss+w(j)*(func(xm+dx)+func(xm-dx)) 11 continue ss=xr*ss return END ! INTEGRATION PAR LA METHODE DE GAUSS SUBROUTINE qgausy(func,a,b,ss) REAL a,b,ss,func EXTERNAL func INTEGER j REAL dx,xm,xr,w(5),x(5) SAVE W,x DATA w/.2955242247,.2692667193,.2190863625,.149451349,.0666713449/ DATA x/.1488743389,.433395394,.6794095682,.8650633666,.9739065285/ xm=0.5*(b+a) xr=0.5*(b-a) ss=0 do 11 j=1,5 dx=xr*x(j) ss=ss+w(j)*(func(xm+dx)+func(xm-dx)) 11 continue ss=xr*ss return END ! INTEGRATION PAR LA METHODE DE GAUSS SUBROUTINE qgausz(func,a,b,ss) REAL a,b,ss,func EXTERNAL func INTEGER j REAL dx,xm,xr,w(5),x(5) SAVE W,x DATA w/.2955242247,.2692667193,.2190863625,.149451349,.0666713449/ DATA x/.1488743389,.433395394,.6794095682,.8650633666,.9739065285/ xm=0.5*(b+a) xr=0.5*(b-a) ss=0 do 11 j=1,5 dx=xr*x(j) ss=ss+w(j)*(func(xm+dx)+func(xm-dx)) 11 continue ss=xr*ss return END
j'ai voulu comprendre le mode de fonctionnement et ce que j'ai compris c'est que cette méthode s'approche à la méthode de quadrature de gauss legendre qui est applicable seulement sur un intervalle d'intégration de -1 à 1, par contre mon programme fonctionne pour des intervalles beaucoup plus grands à l'aide d'un changement de variable je suppose mais je n'ai pas compris comment cela s'est fait.
svp aidez moi à comprendre comment fonctionne cet algorithme
-----