Czy kod dla całki podwójnej i potrójnej jest poprawny?
Wyniki wychodzą poprawne ale już przy całkach 2D i 3D
import random
import numpy as np
def fx(x):
return 4.0/ (1.0+x**2)
def fxy(x,y):
return x+y
def fxyz(x,y,z):
return x+y+z
def mc_calka(fx,a,b,N):
hx= float(b-a)/float(N)
arx=np.zeros(N)
for i in range(len(arx)):
arx[i]=random.uniform(a,b)
integralx=0.0
for i in arx:
integralx+= fx(i)
ans= hx*integralx
return ans
def mc_calka_double(fxy,a,b,c,d,N):
hx=float((b-a)) / float(N)
hy=float((d-c)) / float(N)
arx=np.zeros(N)
ary=np.zeros(N)
for i in range(len(arx)):
arx[i]= random.uniform(a,b)
ary[i]= random.uniform(c,d)
integralxy = 0.0
for x in arx:
for y in ary:
integralxy += fxy(x,y)
ans = hx*hy * integralxy
return ans
def calka_triple(fxyz,a,b,c,d,e,f,N):
hx=float((b-a)) / float(N)
hy=float((d-c)) / float(N)
hz=float((f-e)) / float(N)
arx=np.zeros(N)
ary=np.zeros(N)
arz=np.zeros(N)
for i in range(len(arx)):
arx[i]= random.uniform(a,b)
ary[i]= random.uniform(c,d)
arz[i]= random.uniform(e,f)
integralxyz = 0.0
for x in arx:
for y in ary:
for z in arz:
integralxyz += fxyz(x,y,z)
ans = hx*hy*hz * integralxyz
return ans
a=0
b=1
c=0
d=1
e=0
f=1
N=100
c1=mc_calka(fx,a,b,N)
print(c1)
c2=mc_calka_double(fxy,a,b,c,d,N)
print(c2)
c3=calka_triple(fxyz,a,b,c,d,e,f,N)
print(c3)