大きくて負の実数を扱うときに、次のMatlabコードで指数関数をより正確に近似する方法を知っている人はいますか?
たとえば、x = 1 の場合、コードはうまく機能し、x = -100 の場合、3.7201e-44 に近づくはずのときに 8.7364e+31 という答えを返します。
コードは次のとおりです。
s=1
a=1;
y=1;
for k=1:40
a=a/k;
y=y*x;
s=s+a*y;
end
s
どんな支援も大歓迎です、乾杯。
編集:
わかりましたので、質問は次のとおりです。
このコードが近似する数学関数はどれですか? (指数関数と言います。) x = 1 のときはうまくいきますか? (はい。)残念ながら、x = -100 のときにこれを使用すると、答えは s = 8.7364e+31 になります。あなたの同僚は、プログラムにばかげたバグがあると信じており、あなたの助けを求めています。動作を注意深く説明し、より良い結果が得られる簡単な修正を行います。[上記のコードの変更を提案するか、それを使用する必要があります。簡単な修正が機能することも確認する必要があります。]
したがって、用語間に16桁(またはそれ以上)の桁数がある場合、問題が大きな数を取り囲み、精度が失われることをある程度理解していますが、解決策はわかりません。
ありがとう
編集:
だから最後に私はこれで行きました:
s = 1;
x = -100;
a = 1;
y = 1;
x1 = 1;
for k=1:40
x1 = x/10;
a = a/k;
y = y*x1;
s = s + a*y;
end
s = s^10;
s
完全に正しいかどうかはわかりませんが、適切な近似が返されます。
exp(-100) = 3.720075976020836e-
044s = 3.722053303838800e-044
さらに分析した後 (そして残念ながら課題を提出した後)、反復回数を増やして項を増やすと、効率がさらに向上することに気付きました。実際、次の方法はさらに効率的でした。
s = 1;
x = -100;
a = 1;
y = 1;
x1 = 1;
for k=1:200
x1 = x/200;
a = a/k;
y = y*x1;
s = s + a*y;
end
s = s^200;
s
これにより、次のことが得られます。
exp(-100) = 3.720075976020836e-044
秒 = 3.720075976020701e-044