gpt4 book ai didi

python - log(x) 的泰勒级数

转载 作者:行者123 更新时间:2023-12-01 23:29:50 26 4
gpt4 key购买 nike

我正在尝试计算以 Python 中的 a=1 为中心的自然对数 ln(x) 的泰勒多项式。我正在使用维基百科上给出的系列,但是当我尝试像 ln(2.7) 这样的简单计算而不是给我接近 1 的值时,它给了我一个巨大的数字。有什么明显的地方我做错了吗?

def log(x):
n=1000
s=0
for i in range(1,n):
s += ((-1)**(i+1))*((x-1)**i)/i
return s

使用泰勒级数:

enter image description here

给出结果: enter image description here

编辑:如果有人偶然发现了这个计算某个实数的自然对数的另一种方法是使用数值积分(例如黎曼和、中点法则、梯形法则、辛普森法则等)来计算经常使用的积分定义自然对数;

enter image description here

最佳答案

该系列仅在 x <= 1 时有效。对于 x>1,您将需要一个不同的系列。

例如这个(找到 here ):

def ln(x): return 2*sum(((x-1)/(x+1))**i/i for i in range(1,100,2))

输出:

ln(2.7)        # 0.9932517730102833

math.log(2.7) # 0.9932517730102834

请注意,随着 x 变大(直至变得不切实际),收敛需要超过 100 个项

您可以通过添加 x 的较小因子的对数来补偿:

def ln(x):
if x > 2: return ln(x/2) + ln(2) # ln(x) = ln(x/2 * 2) = ln(x/2) + ln(2)
return 2*sum(((x-1)/(x+1))**i/i for i in range(1,1000,2))

您也可以在基于 Taylor 的函数中执行此操作以支持 x>1:

def log(x):
if x > 1: return log(x/2) - log(0.5) # ln(2) = -ln(1/2)
n=1000
s=0
for i in range(1,n):
s += ((-1)**(i+1))*((x-1)**i)/i
return s

当 x 接近零时,这些级数也需要更多的项来收敛,因此您可能希望在另一个方向上处理它们,以保持要计算的实际值在 0.5 和 1 之间:

def log(x):
if x > 1: return log(x/2) - log(0.5) # ln(x/2 * 2) = ln(x/2) + ln(2)
if x < 0.5: return log(2*x) + log(0.5) # ln(x*2 / 2) = ln(x*2) - ln(2)
...

如果性能是个问题,您需要将 ln(2) 或 log(0.5) 存储在某处并重用它,而不是在每次调用时都计算它

例如:

ln2 = None
def ln(x):
if x <= 2:
return 2*sum(((x-1)/(x+1))**i/i for i in range(1,10000,2))
global ln2
if ln2 is None: ln2 = ln(2)
n2 = 0
while x>2: x,n2 = x/2,n2+1
return ln2*n2 + ln(x)

关于python - log(x) 的泰勒级数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66487579/

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