这对我来说是个奇怪的问题,我不确定如何正确地称呼该问题。我有以下MWE,它仅生成坐标点(x,t)
的列表,并执行一些检查以查看它们是否位于用户指定的边界上。特别是,如果x[i] == 1.0
和t[i] != 0.0
,则程序应打印一条声明。我似乎无法弄清楚为什么从未在这里输入if
条件。我已打印出值对x[i]
和t[i]
的对,以验证确实存在满足条件的对。
#Load Modules
import numpy as np
import math, random
from pylab import meshgrid
# Create the arrays x and t on an evenly spaced cartesian grid
N = 10
xa = -1.0;
xb = 1.0;
ta = 0.0;
tb = 0.4;
xin = np.arange(xa, xb+0.00001, (xb-xa)/N).reshape((N+1,1))
tin = np.arange(ta, tb+0.00001, (tb-ta)/N).reshape((N+1,1))
X_tmp,T_tmp = meshgrid(xin,tin)
x = np.reshape(X_tmp,((N+1)**2,1))
t = np.reshape(T_tmp,((N+1)**2,1))
# create boundary flags
for i in range(0,(N+1)**2):
if (x[i] == xb and t[i] != ta):
print("We are on the right-side boundary")
答案 0 :(得分:4)
我认为您遇到了浮点精度问题。因此,尽管x[i]
很近,但它并不完全等于xb
。完美的相等性测试使用浮点数会引起类似的麻烦。您想要测试这些值之间的差异是否很小。试试这个:
ep = 1e-5 # choose this value based on how close you decide is reasonable
for i in range(0,(N+1)**2):
if (abs(x[i] - xb) < ep and abs(t[i] - ta) > ep):
print("We are on the right-side boundary")
我还刚刚学习到Python 3.5添加了isclose
函数,在这种情况下非常有用!
有关更多讨论,请参见this question/answer。还要注意,如果要对数组执行此操作,则NumPy提供allclose
函数。