python - 给定精度的无限和
问题描述
我一直在尝试用给定的精度问题来解决这个无限和。您可以在下面的图片中看到说明
这是我到目前为止所尝试的:
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,根据他们的测试,它与正确答案不够接近
解决方案
您应该使用 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
推荐阅读
- swift - 如何在不同的位置更改完成的动画以用于不同的显示 Swift
- eclipse - 从 Github 导入 eclipse 时主文件夹为空
- postgresql - PK 索引在一种环境中正确使用但在另一种环境中被忽略的可能原因。(PostgreSQL)
- python - 了解列计数python
- php - 按循环内的最高数字排序
- c# - 每次将RNG种子增加1是否确保不会获得相同的连续值?
- facebook - Spark AR 你能检查两只眼睛是睁着还是闭着吗?
- passport.js - koa-router 不适用于本地护照策略
- flutter - 颤振导航
- python - 比较 2 个 csv 文件,仅使用 pandas isin 函数和 out for 循环