計算


13

関数の近くに有する特異点X = 0。以下のため:かかわらず、その特異性は、持ち上げることができる、X = 1、一つは持つべきであるF X = 1をので、 E 、X = Σ K = 0 のx Kf:x(ex1)/xx=0x=1f(x)=1 したがって ex1/x=k=1x k 1

ex=k=0xkk!
ただし、形式ex1/xx=0で定義されていないだけでなく、その点の近くで数値的に不安定です。非常に小さいxのfxを評価するため
(ex1)/x=k=1xk1k!
(ex1)/xx=0f(x)x数値的するには、Taylor展開、つまり前述のべき級数の切り捨てを使用できます。

Q:関数には名前がありますか?つまり、これは一般的な問題ですか?f

Q:この状況をうまく処理するC / C ++ライブラリを知っている人はいますか。つまり、0に近い適切な次数のテイラー展開と、ゼロから離れた他の表現を使用していますか。

回答:


19

おそらく、C99標準の一部である関数から始めて、x = 0の近くで正確にe x1を計算できますexpm1ex1x=0


17

これはキャンセルエラーのインスタンスです。C標準ライブラリ(C99現在)には、expm1この問題を回避するための関数が含まれています。のexpm1(x) / x代わりに使用する場合(exp(x) - 1.0) / x、この問題は発生しません(下のグラフを参照)。 <code> fabs(expm1(x)/ x-(exp(x)-1.0)/ x)</ code>

この特定の問題の詳細と解決策は精度と数値アルゴリズムの安定性のセクション1.14.1で長々と議論します。同じ解決策は、W。Kahanの論文 『浮動小数点計算における丸めの無意味な評価とはどのように無駄なのか?』の19ページでも説明されていますexpm1GNU Cライブラリでの実際の実装は、上記の参考文献で説明されているアプローチとは異なり、ソースコードで完全に文書化されています


1
ありがとう、それは私が必要なものだけです!残念ながら、私は1つの答えしか受け入れられません
匿名

もちろん!問題ありません:-)
フアンM.ベロリバス

3

最初の質問に答えるために、いいえ、関数には名前がありません(少なくとも広く知られている名前はありません)。

他の人が述べたように、関数を計算する最良の方法はいくつかの特別な場合を扱うことです。これは、ライブラリが関数を計算する方法です。

  1. ケース0:x = 0、1を返します。
  2. |x|<δ1+x/2δdouble2e-85e-4
  3. それ以外の場合:リターンexpm1(x)/x

切り捨てられたテイラー級数を使用すると、より洗練された特別なケースになりますが、おそらくそれだけの価値はありません。実際、k1が指摘したように、キャンセルは安全であるため、ケース1を個別に処理する必要があることは完全には明らかではありません。ただし、それを個別に処理することで、それについてより自信を持つことができます。


2

この質問はこのサイトで以前に質問されたことを思い出しますが、驚くべきことに、正確な等値性がゼロになるように特別に設定する必要があるだけです。エラーはゼロ近くで相殺されます。リンクがありません。

ええ、この答えは完全に間違っていました。なぜそれがそれほど支持されたのか、私はよくわかりません。私が念頭に置いていたリンクを見つけました。scicompスタック交換はなく、ここの数学スタック交換にありました。expm1フリーエラー解除式JMによって回答に与えられ、使用されるu = exp(x)変換を。


バツdバツedバツ1/dバツ1+dバツ1/dバツ1

1
dバツ1+dバツ=1

0

最初の質問に答え、2番目の(おそらく数値的に非効率な)方法を提供するために、これはベルヌーイ数の生成関数の逆であることに注意してください。


それは興味深いつながりです。それを指摘してくれてありがとう。残念ながら、トリプルサムはこれを非常に高価にすると信じています。さらに、希望する精度を得るために各合計をどこで切り捨てるかはすぐにはわかりません。
匿名

@anonymous:あなたはどのトリプルの額を意味しますか?ベルヌーイ多項式は不要で、ベルヌーイ数のみが必要です。事前にリストすることができます。しかし、はい、それはまだテイラーシリーズよりも良くないことです。
ニコライK

ただし、入力のみに固定の有限数のみが必要なことが明らかな場合は、事前に計算できます。
匿名

@anonymous:ええ、ええ、テイラー係数を事前にリストするのと同じです。
ニコライK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.