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:
! 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