2

次のような関数があるとします

F = lambda x: sin(x)/x

評価F(0.0)するとゼロ除算の警告が発生し、 の期待される結果が得られません1.0fix_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] )

1つの可能な実装は

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
4

6 に答える 6

7

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]
于 2011-04-05T19:08:49.353 に答える
2

一般に、想像できるように単純な修正デコレータを作成することはできません。たとえば、この特定の例のように、一般的な関数は特異点で有限の制限値を持つ必要はありません。

通常は、ケースバイケースで特別な処理を実装します。

于 2011-04-05T18:59:03.970 に答える
1

これを試してみます

>>> 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
于 2011-04-05T19:04:07.750 に答える
0

これがあなたの正確な目的で機能するかどうかはわかりませんが、かなりの量のCalculusタイプの状況を処理できるsageと呼ばれるPythonライブラリがあります。

于 2011-04-05T18:59:50.600 に答える
0

sympy(symbolic python)は制限を行うことができると私は信じています。これはあなたが本当に求めていることです(その解決策は制限としてのみ真です)。とにかく、あなたはそれをチェックするべきです。

于 2011-04-05T19:07:55.700 に答える