有谁知道在处理大实数和负实数时如何使以下 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-044
s = 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
s = 3.720075976020701e-044