2016-09-03 2 views
1

数値安定性がゼロ付近で、xが非常に正または負であるとき、xe^x /(e^x-1)をどのように評価するのですか?私はnumpyscipyのすべての通常の数学関数にアクセスできます。Pythonで数値安定性を持つxe^x /(e^x-1)をどのように評価するのですか?

+0

scipy.special.exprelが見つかりました。これは動作します。私はtheanoまたはtensorflow上で自分のコードの作業をする必要があるので、より基本的なソリューションが良いでしょう。 –

+0

「np.expm1」は大きな入力に対して 'inf'ではなく' nan'を与えるように思われます。それは 'if'や' where'のようなものを避けることを難しくします。 – user2357112

+0

これはまだオープンしている[プラットフォームに依存するバグ](https://github.com/numpy/numpy/issues/6818)のようです。 – user2357112

答えて

2
def f(x): 
    if abs(x) > 0.1: return x*exp(x)/(exp(x)-1) 
    else: return 1/(1.-x/2.+x**2/6.-x**3/24.) 

最後の行の拡大は、より精度が要求される場合に明らかな方法で拡張することができ、再フレーズによって高速化することができます。それが立てば、1e-6ほどの間違いがあります。

+2

'x * exp(x)-1')の真の値が 'x>に非常に近いので、' x> z 'それを簡単に計算するとオーバーフローとナノが発生します。 – Leon

+0

良い点、@レオン。この可能性に対処するためには、 'x> 0.1'と' x <-0.1 'の場合を別々に扱うべきです。 'x> 0.1'なら' x /(1-exp(-x)) 'を返します。 'x <-0.1'の場合、' x * exp(x)/(exp(x)-1) 'を返します。それ以外の場合は多項式近似を使用します。 –

関連する問題