用python中的Taylor级数实现cos(x)
我必须用python中的泰勒级数实现余弦函数。我必须从下面打印它的值以及listt中所有值的绝对和相对误差。以下是我尝试过的:用python中的Taylor级数实现cos(x),python,numerical-methods,taylor-series,Python,Numerical Methods,Taylor Series,我必须用python中的泰勒级数实现余弦函数。我必须从下面打印它的值以及listt中所有值的绝对和相对误差。以下是我尝试过的: import math def expression(x, k): return (-1)**k/(math.factorial(2*k))*(x**(2*k)) pi=math.pi listt=[0, pi/6, pi/4, pi/3, pi/2, (2*pi)/3, (3*pi)/4, (5*pi)/6, pi] sum=0 for x in listt:
import math
def expression(x, k):
return (-1)**k/(math.factorial(2*k))*(x**(2*k))
pi=math.pi
listt=[0, pi/6, pi/4, pi/3, pi/2, (2*pi)/3, (3*pi)/4, (5*pi)/6, pi]
sum=0
for x in listt:
k=0
relative_error=1
while relative_error>10**(-15):
sum+=expression(x, k)
absolute_error=abs(math.cos(x)-sum)
relative_error=absolute_error/abs(math.cos(x))
k+=1
print("%.20f"%x, '\t', "%.20f"%sum, '\t', "%.20f"%math.cos(x), '\t', "%.20f"%absolute_error, '\t', "%.20f"%relative_error )
然而,这产生了一个巨大的错误。原因可能是我做了所有的减法运算。然而,我不知道如何避免它们。当计算负x的e^x时,我遇到了同样的问题,但是如果x是负的,我只计算了e^(-x),然后我可以写e^x=1/e^(-x)。这里有类似的技巧吗?另外,请注意我的while是无限的,因为相对误差总是很大。致命错误:您在测试点的循环外设置了
sum=0
。您需要为每个测试点重置它。如果将近似余弦计算作为单独的函数,则可以轻松避免此错误
用商乘以前一项,计算级数的项总是一个更好的主意。这避免了阶乘的计算和它的增长可能产生的所有困难 也就是说,项的增长与指数序列的增长相同,因此最大项是
2*k
约为|x
。对于给定的点,不应过大
更精确一点,余弦部分和的误差小于下一项,因为序列是交替的。致命错误的度数
2*k
,|x |的术语:您在测试点的循环外设置sum=0
。您需要为每个测试点重置它。如果将近似余弦计算作为单独的函数,则可以轻松避免此错误
用商乘以前一项,计算级数的项总是一个更好的主意。这避免了阶乘的计算和它的增长可能产生的所有困难
也就是说,项的增长与指数序列的增长相同,因此最大项是2*k
约为|x
。对于给定的点,不应过大
更精确一点,余弦部分和的误差小于下一项,因为序列是交替的。度的术语2*k
表示|x |您没有指定您得到的错误。你能编辑你的帖子并添加回溯吗?@AwesomeCronk By hugh error我指的是一个巨大的计算错误,即我的函数和math.cos(x)之间存在一个巨大的错误。除了Bug之外,使用相对错误可能不是最好的主意,因为余弦经过0,使相对错误在此邻域内爆炸。@YvesDaoust是的,当x=pi/2时,代码就发疯了。我求助于设置迭代次数(大约100次)并使用for循环。我找不到更好的方法。观察错误的大小作为迭代次数的函数会更明智(100是完全多余的)。您不需要指定您得到的错误。你能编辑你的帖子并添加回溯吗?@AwesomeCronk By hugh error我指的是一个巨大的计算错误,即我的函数和math.cos(x)之间存在一个巨大的错误。除了Bug之外,使用相对错误可能不是最好的主意,因为余弦经过0,使相对错误在此邻域内爆炸。@YvesDaoust是的,当x=pi/2时,代码就发疯了。我求助于设置迭代次数(大约100次)并使用for循环。我找不到更好的方法。观察错误的大小作为迭代次数的函数会更明智(100完全是多余的)。