我有下面的代码,我只写了最后一部分。出于某些原因,我们使用random.normal值。很明显,func函数有三个变量。
我的问题是:计算的步骤是101,准确地说,输出中的每个参数都有100值。我应该如何告诉Python,如果您看到Wo[i]>0和Omo[i]<0重新计算该步骤(这将使用另一个随机数),直到得到正确的答案(Wo[i]<0 and Omo[i]>0为止。
我们必须这样做,因为__,如果我们打印输出,然后删除那些不满足我们条件的值,例如,我们有60个值,而不是100个。我知道我们可以使用while loop,但我不知道如何使用。
N=101
for i in range (1,N):
R=np.random.uniform(0,1)
Omn[i] = Omo[i-1] + 0.05 * np.random.normal()
Wn[i] = Wo[i-1] + 0.05 * np.random.normal()
Mn[i] = Mo[i-1] + 0.1 * np.random.normal()
L = exp(-0.5 * ( func(Omn[i], Wn[i], Mn[i] ) - func( Omo[i-1], Wo[i-1], Mo[i-1] )))
if L>R:
Wo[i]=Wn[i]
Mo[i]=Mn[i]
Omo[i]=Omn[i]
else:
Wo[i]=Wo[i-1]
Mo[i]=Mo[i-1]
Omo[i]=Omo[i-1]
print(Wo[i],Mo[i],Omo[i])发布于 2018-04-19 08:40:11
您可以使用普通的while循环,并在计算后检查条件,例如:
for i in range (1,N):
R=np.random.uniform(0,1)
while True:
Omn[i] = Omo[i-1] + 0.05 * np.random.normal()
Wn[i] = Wo[i-1] + 0.05 * np.random.normal()
Mn[i] = Mo[i-1] + 0.1 * np.random.normal()
if Wo[i] <= 0 and Omo[i] >= 0:
break
# rest of code发布于 2018-04-19 08:42:49
插入while循环以重复所需的计算。
当L > R、Wo和Omo用Omn和Wn值更新时。因此,如果这个值是Omn<0或Wn>0,则需要重新计算它们。当L <= R、Wo和Omo从上一次迭代中计算出来时。由于上一次迭代已经是Wo[i]<=0和Omo[i]>=0,所以不需要重复这些计算。
因此,如下面的代码所示,您只需要重新计算Omn和Wn变量:
Omo[0] = 0.24
Wo[0] = -0.2
Mo[0] = 1.0
N = 101
for i in range (1,N):
is_valid = False
if __debug__:
print "Calculating position " + str(i)
while (not is_valid):
Omn[i] = Omo[i-1] + 0.05 * np.random.normal()
Wn[i] = Wo[i-1] + 0.05 * np.random.normal()
Mn[i] = Mo[i-1] + 0.1 * np.random.normal()
if __debug__:
print "- is_valid iteration values: " + str(Wn[i]) + " " + str(Omn[i])
print "- is_valid previous values: " + str(Wo[i-1]) + " " + str(Omo[i-1])
is_valid = Omn[i] >= 0 and Wn[i] <= 0
R = np.random.uniform(0,1)
L = exp(-0.5 * ( func(Omn[i], Wn[i], Mn[i] ) - func( Omo[i-1], Wo[i-1], Mo[i-1] )))
if L > R:
Omo[i] = Omn[i]
Wo[i] = Wn[i]
Mo[i] = Mn[i]
else:
Omo[i] = Omo[i-1]
Wo[i] = Wo[i-1]
Mo[i] = Mo[i-1]
print(Wo[i], Mo[i], Omo[i])https://stackoverflow.com/questions/49916212
复制相似问题