2017-10-11 7 views
-2

f(x)= sqrt(1 + x) - sqrt(1-x)のような関数では、特定の範囲のx値に対して望ましくない結果が得られます。しかし、方程式を元の方程式と新しい方程式を区分的に書き換えることができます。浮動小数点演算の不安定性

どのようにx値の範囲を調べ、これらのような質問の代わりの式を見つけることができますか? (オンラインでの研究から、関数が本質的に特定の値を「取り消す」ことを望んでいないことがわかったのですが、それはすべて私たちが探しているものですか?たとえばf(x)= e^x-

+1

この質問は書かれている限りはあまりにも広すぎます。より具体的になりますか? –

+0

f(x)= sqrt(1 + x) - sqrt(1-x)は、浮動小数点演算を使用して評価すると結果が悪くなるxの範囲を指定できますか? 「キャンセルエラー」が発生しないように、xのこれらの値に対してf(x)の代わりの式を指定します。 – Brainpower2049

+1

@ Brainpower2049:小さな 'x'は問題があります。たとえば、 'f(1e-17)'は '0.0 'を返しますが、' f(1e-16) 'は' 1.1102230246251565e-16'を返します。数値的には等価ではない式は '2 * x /(sqrt(1 + x)+ sqrt(1-x))'です。これは、ドメイン['-1.0、1.0]'全体にわたって数値的に良い結果をもたらします。 –

答えて

3

残念ながら、ここには黄金の弾丸はありません。普通の方法は、多くの実験と精巧なエラー分析です。f(x)= 0?便利なツール:

  • 高精度を使用して式を計算し、結果を通常の精度と比較するために、MPFRなどの任意の精度演算ライブラリがあります。私はジュリアを使用するのが好きです。一般的な数学演算子と関数をサポートするBigFloatタイプを提供しています。
  • interval arithmetic:エラーの保証された境界を提供します(不安定な計算が爆発する)。個人的な経験がある唯一のパッケージはValidatedNumerics.jlです(examplesを参照)。
  • herbieは、数式を自動的に書き直してより安定したものにするための巧妙なトリックを使用します。私はそれに個人的な経験はありませんが、それは涼しく見えます。 (偶然にも、彼らのホームページ上の例はあなたのものにかなり近いです)
+0

ハービーはそれが役に立つ前にはるかに洗練された(またはバギーの少ない)必要があると思う。 OPの式を入力すると、この表現がどんなドメインで役に立つかもしれないことの兆候なしで、 '1/8 x^3/+(7/128 x^5 + x)'が返されました。 –

+0

それは奇妙です:小さなウェブアプリのこと、それは質問に質問で示唆した答えを与えた: '(x + x)/(sqrt(1 + x)+ sqrt(1-x))'。 –

+0

うーん、それは奇数です。私は以前と同じ結果を得ています(テイラー級数0の周りでの展開)。しかし、アルゴリズムにはランダムな入力があるようです。多分それはそれを説明します。 –