Как бороться с усечением в неравенствах? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть кусочный массив, сгенерированный массивом x

x = np.linspace(0, 1, 11) # = array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
y = np.piecewise(x,
                [x < p - h/2, (x >= p - h/2)&(x <= p + h/2), x > p + h/2],
                [     0     ,              10             ,      0     ])

С p = 0.25 и h = 0.1. Средний интервал p - h/2 <= x <= p + h/2 можно переписать как 0.2 <= x <= 0.3. Это означает, что 3-й и 4-й элементы массива y должны быть 10. Но при применении этого было получено

array([ 0.,  0., 10.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

Я думаю, что это связано с усечением python в операции p + h/2. Это правильно? Если это так, как я могу справиться с этим?

1 Ответ

1 голос
/ 28 апреля 2020

Чтобы быстро решить вашу проблему, я предлагаю добавить небольшое смещение с плавающей точкой к операторам равенства, чтобы убедиться, что ваши значения включены в диапазон:

import numpy as np
p = 0.25
h = 0.1
delta = 1e-10 # add small float offset to account for rounding error

x = np.arange(0, 1.1, 0.1)
y = np.piecewise(x,
                [x<p-h/2-delta, (x>=p-h/2-delta)*(x<=p+h/2+delta), x>p+h/2+delta],
                [     0       ,              10                  ,      0       ])

y
>>> array([ 0.,  0., 10., 10.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

Есть также функции np.isclose, которые предназначены для справиться с этим, но мне пока не удалось понять, как заставить их иметь дело с компараторами, ie. <=. Мне было бы интересно узнать решение этой проблемы.

...