gpt4 book ai didi

用于逼近指数函数的 Matlab 代码

转载 作者:太空宇宙 更新时间:2023-11-03 19:49:39 26 4
gpt4 key购买 nike

有谁知道在处理大实数和负实数时,如何使下面的 Matlab 代码更准确地逼近指数函数?

例如,当 x = 1 时,代码运行良好,当 x = -100 时,它返回 8.7364e+31 的答案,而它应该更接近 3.7201e-44。

代码如下:

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

最佳答案

正如 John 在评论中指出的那样,您在循环中遇到了错误。 y = y*k 行不满足您的需要。更仔细地查看 exp(x) 系列中的项。

无论如何,我认为这就是为什么要给您布置此家庭作业的原因,以了解像这样的级数对于大值不会很好地收敛。相反,您应该考虑如何缩小范围。

比如你能不能用身份

exp(x+y) = exp(x)*exp(y)

对你有利?假设您存储 exp(1) = 2.7182818284590452353 的值...

现在,如果我要你计算 exp(1.3) 的值,你会如何使用上述信息?

exp(1.3) = exp(1)*exp(0.3)

但是我们已经知道 exp(1) 的值了。事实上,稍微考虑一下,这将使您可以将指数的范围缩小到需要级数仅在 abs(x) <= 0.5 时快速收敛。

编辑:还有第二种方法可以使用相同身份的变体来缩小范围。

exp(x) = exp(x/2)*exp(x/2) = exp(x/2)^2

因此,假设您希望计算大数的指数,例如 12.8。让它以可接受的速度收敛将需要简单级数中的许多项,并且会发生大量减法抵消,因此无论如何您都不会获得良好的准确性。但是,如果我们认识到这一点

12.8 = 2*6.4 = 2*2*3.2 = ... = 16*0.8

那么如果您可以有效地计算 0.8 的指数,那么所需的值很容易恢复,也许可以通过重复平方来恢复。

exp(12.8)
ans =
362217.449611248

a = exp(0.8)
a =
2.22554092849247
a = a*a;
a = a*a;
a = a*a;
a = a*a
362217.449611249

exp(0.8)^16
ans =
362217.449611249

请注意,无论何时使用此类方法进行范围缩减,虽然由于需要进行额外的计算,您可能会遇到数值问题,但由于级数的收敛性大大增强,您通常会领先一步。

关于用于逼近指数函数的 Matlab 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10281150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com