!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !Calcolo numerico del volume di un' ipersfera ! !d-dimensionale tramite il metodo "hit and miss" ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Program hypersphere Implicit none real,parameter :: pi = acos(-1.0) real, dimension(:), allocatable :: rnd real :: truevol, vol Integer :: i, Nmax, accept, dim,n print*,'Inserire la dimensione della sfera:' read*, dim allocate(rnd(dim)) print*,'Numero massimo di punti da generare:' read*, Nmax !volume analitico dell'ipersfera truevol = pi**(0.5*dim)/gamma(0.5*dim) + 1) Open(7, File='vol.dat', Status='Replace') write(7,*)' n, vol, exact vol, abs(error)' do n=1,Nmax accept=0 if (mod(n,100) == 0) then !metodo hit and miss Do i=1, n call random_number(rnd) rnd = (rnd - 0.5)*2.0 ! genero numero random tra -1 e 1 If (dot_product(rnd,rnd) <= 1) accept = accept + 1 end do !calcolo del volume numerico vol = (2.0**dim)*float(accept)/float(n) !salvataggio dati write(7,*) n,vol,truevol, abs(truevol - vol) end if end do Close(7) print*, 'Dati salvati in vol.dat ' print*,' volume sfera numerico e esatto:',vol, truevol End program hypersphere