Python: 使用泰勒级数逼近ln(x)

3

我正在尝试构建一个精度为十位数字的ln(1.9)的近似值(即0.641853861)。

我使用了一个简单的函数,该函数是从ln[(1 + x)/(1 - x)]构建而来的。

以下是我的代码:

# function for ln[(1 + x)/(1 - x)]

def taylor_two(r, n):
    x = 0.9 / 2.9
    i = 1
    taySum = 0
    while i <= n:
        taySum += (pow(x,i))/(i)
        i += 2
    return 2 * taySum

print taylor_two(x, 12)

print taylor_two(x, 17)

现在我需要重新格式化它,以便告诉我近似ln(1.9)所需的术语数到以上10位数,显示该系列给出的值,并显示误差。
我假设我需要将我的函数构建成一个for循环,但是我如何让它在达到所需的10位数后停止迭代呢?
谢谢您的帮助!

请注意,函数定义中使用的“r”从未被使用。另外,在两个“print taylor_two(x,12)”行上都会出现错误,因为x尚未声明。如果要在所有n次尝试之前返回函数,则必须提交一个较低(可能是上限)的数字,以将计算出的数字与.6418538 < taySum * 2 <.6418539进行比较,例如。 - user4171906
嗨,乔,谢谢你的评论。我现在看到x没有被声明存在的问题。你能否给出一个编码示例,说明你所说的较低和较高数字是什么?我不太明白你的意思。 - BigD4J
我在之前的帖子中放置了一个if语句。浮点数可能不是100%准确的,因此您必须将“相等”定义为较低和较高的数字,并且介于两者之间的任何内容都是“相等”的。 - user4171906
1个回答

5
原则如下:
  • 观察每次迭代对结果的增量。
  • 当差异小于1e-10时停止。

你正在使用以下公式,对吧:

ln formula

(请注意有效范围!)
def taylor_two():
    x = 1.9 - 1
    i = 1
    taySum = 0
    while True:
        addition = pow(-1,i+1)*pow(x,i)/i
        if abs(addition) < 1e-10:
            break
        taySum += addition
        # print('value: {}, addition: {}'.format(taySum, addition))
        i += 1
    return taySum

测试:

In [2]: print(taylor_two())
0.6418538862240631

In [3]: print('{:.10f}'.format(taylor_two()))
0.6418538862

谢谢您的回复,Roland。实际上我正在使用2*sum k=1 to infinity for (x^(2k - 1))/(2k - 1)来进行近似计算。我尝试了您的代码,但它并不是我想要的。也许我表达问题的方式不太对。我需要系统在达到所需值并且精度达到10位数字时停止运行,然后给我那个值。您给出的代码需要我自己输入值。这样说您明白吗? - BigD4J
我假设需要一种while循环,它会迭代直到ln(1.9)与结果值之间的差异非常小。我只是不确定如何构建它。 - BigD4J
@BigD4J 请查看更新的答案。该算法运行直到下一步的加法小于1e-10。如果您想查看它的工作原理,请在循环中取消注释print() - Roland Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接