【问题标题】:How to deal with truncation in inequations?如何处理不等式中的截断?
【发布时间】:2020-04-28 17:44:31
【问题描述】:

我有一个由 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.25h = 0.1。中间区间p - h/2 &lt;= x &lt;= p + h/2 可以重写为0.2 &lt;= x &lt;= 0.3。这意味着y 数组的第三和第四个元素应该是10。但是当应用这个时,结果是

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

我认为这是由于p + h/2 操作中python 的截断。这样对吗?如果是,我该如何处理?

【问题讨论】:

  • 按照您的建议,看起来是一个舍入错误。 from decimal import Decimal 和你的号码是:Decimal(p+h/2) = Decimal('0.299999999999999988897769753748434595763683319091796875')Decimal(x[3]) = Decimal('0.3000000000000000444089209850062616169452667236328125') 因此错误。
  • 有没有办法纠正这个问题?
  • 出于兴趣,它看起来也与 numpy 相关:0.3 &lt;= p+h/2 &gt;&gt;&gt; Truex[3] &lt;= p+h/2 &gt;&gt;&gt; False。还有np.float(0.3) &lt;= p+h/2 &gt;&gt;&gt; True,所以看起来linspace有一些舍入错误。

标签: python numpy truncation piecewise


【解决方案1】:

为了快速解决您的问题,我建议在相等运算符中添加一个小的浮点偏移量,以确保您的值包含在范围内:

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 旨在处理这个问题,但我还没有设法让它们处理比较器,即。 &lt;=。我很想知道解决方案。

【讨论】:

  • 这为您提供了中间条件的正确布尔结果:np.logical_or(x&gt;=p-h/2, np.isclose(x, p-h/2)) * np.logical_or(x&lt;=p+h/2, np.isclose(x, p+h/2)) &gt;&gt;&gt; array([False, False, True, True, False, False, False, False, False, False, False]),唯一的问题是x[3] 的最终条件仍然满足,所以我认为piecewise 覆盖了结果,所以整体y 仍然不正确。有趣的问题。
猜你喜欢
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多