这是我第一次来这里。抱歉,我对 python 很陌生。作为我的大学课程的一部分,我正在尝试使用蒙特卡罗方法来计算 8D 中的积分。但是,当我运行程序时,当我定义 x0[i] 时,我得到了在线标题中描述的错误。它似乎只允许我最多运行 2,但我想调查错误,因为 N 是变化的,所以我需要能够使用 N>2。任何帮助将不胜感激
杰克
a=0 #Defining Limits of Integration
b=np.pi/8
N=4 #Number of random numbers generated in each dimension
for i in range(N):
x0rand[i]=((np.pi)/8)*np.random.uniform(0,1) #Generates N random numbers 8D between 0 and pi/8
x1rand[i]=((np.pi/8))*np.random.uniform(0,1)
x2rand[i]=((np.pi/8))*np.random.uniform(0,1)
x3rand[i]=((np.pi/8))*np.random.uniform(0,1)
x4rand[i]=((np.pi/8))*np.random.uniform(0,1)
x5rand[i]=((np.pi/8))*np.random.uniform(0,1)
x6rand[i]=((np.pi/8))*np.random.uniform(0,1)
x7rand[i]=((np.pi/8))*np.random.uniform(0,1)
def func(x0,x1,x2,x3,x4,x5,x6,x7): #Defining the integrand
return (10**6)*np.sin(x0+x1+x2+x3+x4+x5+x6+x7)
integral = 0.0
for i in range(N):
integral += func(x0rand[i],x1rand[i],x2rand[i],x3rand[i],x4rand[i],x5rand[i],x6rand[i],x7rand[i])
answer=(((b-a)**8)/N)*integral
print ('The Integral is:', answer)
IndexError Traceback (most recent call last)
<ipython-input-141-1a3483405a4d> in <module>()
4
5 for i in range(N):
----> 6 x0rand[i]=((np.pi)/8)*np.random.uniform(0,1) #Generates N random numbers 8D between 0 and pi/8
7 x1rand[i]=((np.pi/8))*np.random.uniform(0,1)
8 x2rand[i]=((np.pi/8))*np.random.uniform(0,1)
IndexError: index 2 is out of bounds for axis 0 with size 2
答案 0 :(得分:0)
发布的程序不是已运行的完整代码,否则您会收到消息 NameError: name 'x0rand' is not defined
。您之前必须定义和标注 x0rand
,并且尺寸为 2 而不是 N。
为了(重新)定义 x0rand
等,你可以把
x0rand, x1rand, x2rand, x3rand, x4rand, x5rand, x6rand, x7rand = np.zeros((8, N))
在循环之前。
答案 1 :(得分:0)
不幸的是这段代码不起作用,无论如何我建议使用 numpy 的力量:
一些命中
for i in range(N):
x0rand[i]=((np.pi)/8)*np.random.uniform(0,1) #Generates N random numbers 8D between 0 and pi/8
x1rand[i]=((np.pi/8))*np.random.uniform(0,1)
x2rand[i]=((np.pi/8))*np.random.uniform(0,1)
x3rand[i]=((np.pi/8))*np.random.uniform(0,1)
x4rand[i]=((np.pi/8))*np.random.uniform(0,1)
x5rand[i]=((np.pi/8))*np.random.uniform(0,1)
x6rand[i]=((np.pi/8))*np.random.uniform(0,1)
x7rand[i]=((np.pi/8))*np.random.uniform(0,1)
可以在向量模式下初始化,可以看到size参数。
xrand = np.random.uniform(0,1,size=(N,))
函数本身可以变得更有效率。 调用它会更具可读性。
def func(arr): #Defining the integrand
return (10**6)*np.sin(arr.sum())
func(xrand)