如果在Python中有条件,则无法提供正确的结果

时间:2019-03-05 22:02:36

标签: python numpy if-statement matplotlib

这对我来说是个奇怪的问题,我不确定如何正确地称呼该问题。我有以下MWE,它仅生成坐标点(x,t)的列表,并执行一些检查以查看它们是否位于用户指定的边界上。特别是,如果x[i] == 1.0t[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")

1 个答案:

答案 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函数。