LIMESTツールを試してみる必要がありました。他のアダプティブツールと同様に、だまされる可能性がありますが、通常はかなり優れています。
fun = @(x) (exp(x) - 1)./x;
ご覧のとおり、楽しみはゼロで問題があります。
fun(0)
ans =
NaN
楽しみをゼロに近いと評価すると、1に近いことがわかります。
format long g
fun(1e-5)
ans =
1.00000500000696
LIMESTは成功し、限界の誤差推定を提供することさえできます。
[lim,err] = limest(fun,0,'methodorder',3)
lim =
1
err =
2.50668568491927e-15
LIMESTは、一連の多項式近似を適応リチャードソンの補外法と組み合わせて使用して、限界推定値とその限界の不確実性の測定値の両方を生成します。
では、どのような問題が発生していますか?あなたが見た失敗は単純な減算キャンセルエラーです。したがって、の値を見てください
exp(1e-20)
ans =
1
フォーマットがlonggの場合でも、exp(1e-20)の倍精度値は1に近すぎるため、1を引くと、結果は正確にゼロになります。これをゼロ以外の値で割ると、ゼロになります。もちろん、xが実際にゼロの場合、0/0の条件があるので、それを試したときにNaNが発生しました。
高精度で何が起こるか見てみましょう。その計算にはHPFツールを使用し、小数点以下64桁で作業します。
DefaultNumberOfDigits 64
exp(hpf('1e-20'))
ans =
1.000000000000000000010000000000000000000050000000000000000000166
1を差し引くと、1と指数値の差はeps(1)未満になるため、MATLABはゼロ値を生成する必要があります。
exp(hpf('1e-20')) - 1
ans =
1.000000000000000000005000000000000000000016666666666670000000000e-20
質問されていないのは、MATLABでその関数を正確に生成する方法を選択する方法です。明らかに、あなたはブルートフォースを使用して、私のように楽しみを定義したくありません。あなたはかなりの正確さを失うからです。おそらく、ゼロ付近の限られた領域でテイラー級数を展開し、ゼロとは大きく異なるxに対して上記のように楽しみを使用します。