[英]Implementing cos(x) by its Taylor series in python
我必须使用其泰勒级数在 python 中实现余弦 function。 我必须从下面打印它的值以及 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
。 您需要为每个测试点重置它。 如果您将近似余弦计算作为单独的 function 进行,则可以轻松避免此错误。
通过乘以前一项的商来计算级数的项总是一个更好的主意。 这避免了阶乘的计算及其增长可能产生的所有困难。
也就是说,项的增长与指数级数的增长相同,因此最大项是2*k
约为|x|
. 对于不应过大的给定点。
更准确地说,余弦部分和的误差小于下一项,因为级数是交替的。 |x|<=4
的2*k
度项具有近似界,使用斯特林的阶乘公式,
4^(4*k)/(4*k/e)^(4*k) = (e/k)^(4*k) < (3/k)^(4*k)
对于k=6
,其上限为2^(-24) ~ 10^(-7)
。 因此,测试值不应该有灾难性的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.