首页 > 解决方案 > 给定精度的无限和

问题描述

我一直在尝试用给定的精度问题来解决这个无限和。您可以在下面的图片中看到说明

这是我到目前为止所尝试的:

import math
def infin_sum(x, eps):
    sum = float(0)
    prev = ((-1)*(x**2))/2
    i = 2
    while True:
        current = prev + ((-1)**i) * (x**(2*i)) / math.factorial(2*i) 
        if(abs(current - prev) <= eps):
            print(current)
            return current
        prev = current
        i+=1

对于给定的样本输入(x 为 0.2,精度为 0.00001),我的总和为 6.65777777777778e-05,根据他们的测试,它与正确答案不够接近

标签: python

解决方案


您应该使用 math.isclose() 而不是 abs() 来检查您的收敛性(因为这是检查结果的方式)。鉴于每次迭代都会添加或减去特定项,前一个和下一个(Si-1 vs Si)之间的增量将等于添加的最后一个项(因此您不需要跟踪以前的值)。

那个无限级数几乎是余弦的级数(如果我从零开始),所以你可以测试你的结果math.cos(x)-1。另外,我觉得奇怪的是,对预期结果的检查固定在 0.0001 的精度内,但样本输入指定的精度为 0.00001(我想更精确的将在 0.0001 内,但是验证并没有真正检查输出是否正确给定输入?)

from math import isclose
def cosMinus1(x,precision=0.00001):
    result      = 0
    numerator   = 1
    denominator = 1
    even        = 0
    while not isclose(numerator/denominator,0,abs_tol=precision): # reach precision
        numerator   *= -x*x                     # +/- for even powers of x
        even        += 2
        denominator *= even * (even-1)          # factorial of even numbers
        result      += numerator / denominator  # sum of terms            
    return result

print(cosMinus1(0.2))
# -0.019933422222222226

import math
expected = math.cos(0.2)-1

print(expected, math.isclose(expected,cosMinus1(0.2),abs_tol=0.0001))
# -0.019933422158758374 True

推荐阅读