【问题标题】:Fixing the singularity of a function修复函数的奇异性
【发布时间】:2011-07-30 05:44:55
【问题描述】:

假设你有一个类似

的函数
F = lambda x: sin(x)/x

评估F(0.0) 会导致除以零警告,并且不会给出1.0 的预期结果。是否可以编写另一个函数fix_singularity,在应用于上述函数时会给出所需的结果,以便

fix_singularity(F)(0.0) == 1.0

或者正式的fix_singularity应该通过以下测试:

import numpy as np

def test_fix_singularity():

    F = lambda x: np.sin(x)/x

    x = np.array((0.0, pi))

    np.testing.assert_array_almost_equal( F(x), [nan, 0] )

    np.testing.assert_array_almost_equal( fix_singularity(F)(x), [1, 0] )

一种可能的实现是

def fix_singularity(F):
    """ Fix the singularity of function F(x) """

    def L(x):
        f = F(x)
        i = np.isnan(f)
        f[i] = F(x[i] + 1e-16)
        return f

    return L

有更好的方法吗?

编辑: 另外我怎样才能抑制警告:

Warning: invalid value encountered in divide

【问题讨论】:

    标签: python numpy nan singular


    【解决方案1】:

    numpy 有一个 sinc() 函数,这是你的函数的规范化形式,即

    F = lambda x: sin(pi*x) / (pi*x)
    

    它正确处理x == 0.0 的情况,

    In [16]: x = numpy.linspace(-1,1,11)
    
    In [17]: print x
    [-1.  -0.8 -0.6 -0.4 -0.2  0.   0.2  0.4  0.6  0.8  1. ]
    

    要“非规范化”,

    In [22]: s = numpy.sinc(x/numpy.pi)
    
    In [23]: print s.round(2)
    [ 0.84  0.9   0.94  0.97  0.99  1.    0.99  0.97  0.94  0.9   0.84]
    

    【讨论】:

    • +1:我实际上认为这是针对 OP 特定情况的最佳答案。我以前没有遇到过这种方法。干得好。
    【解决方案2】:

    如果你已经在使用 numpy,那么:

    a = np.linspace(0.0,2*np.pi,100)
    b = np.sin(a)/a
    

    将在b[0] 中留下NaN 值而不会出错。如果您想这样处理,您可以将其替换为以下内容:

    b[np.isnan(b)] = 1.0
    

    更新要取消警告,请尝试:

    np.seterr(divide='ignore') # Or possibly np.seterr(invalid='ignore')
    

    【讨论】:

    • 我不明白你提到的谬误。 OP 指的是 sin(x)/x -> 1 as x -> 0
    • @David:是的,在我回答之前应该申请 L'Hospital。已更正。
    【解决方案3】:

    我相信 sympy (symbolic python) 可以做限制,这就是你真正要问的(该解决方案仅在 limit 时才是正确的)。无论如何,您应该检查一下。

    【讨论】:

      【解决方案4】:

      我会试试这个

      >>> def fix_singularity(F):
      ...     def L(x):
      ...         x1 = max(x,1e-16) if x >=0 else min(x,-1e-16)
      ...         return F(x1)
      ...     return L
      ...
      >>> FS = fix_singularity(F)
      >>> FS(0.0)
      1.0
      >>> FS(-1e-17)
      1.0
      

      【讨论】:

        【解决方案5】:

        我不知道这是否适合您的确切目的,但有一个名为 sage 的 python 库可以处理相当多的微积分类型的情况。

        【讨论】:

          【解决方案6】:

          一般来说,你不能像想象的那样编写一个简单的 fix 装饰器。例如,一般函数不需要像这个特定示例那样在奇点处具有有限极限值。

          通常的做法是根据具体情况实施特殊处理。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-07-05
            • 2019-10-20
            • 1970-01-01
            • 1970-01-01
            • 2019-03-12
            • 2012-07-20
            • 1970-01-01
            相关资源
            最近更新 更多