我已经发布了一个关于这个问题的问题,并实现了我从答案中学到的东西。我现在处于一个点,在屏幕上打印的答案非常接近,但不正确。这是我现在的代码:
program taylor
implicit none
integer :: k = 0
real :: y = 0.75
real :: x = 0.75
do while (abs(y - sin(0.75)) > 1E-6)
k = k + 1
y = y + ((y * (-x * x)) /( 2 * k * (2 * k + 1 )))
print *, y
end do
end program taylor
我似乎无法在这里发现错误,为什么这不起作用?它打印的第一个答案是正确的,但随后似乎逐渐降低,而不是接近真实值。 (do while循环用于确保当计算和内部sin函数之间的绝对值小于1E-6时程序停止)。我可以看到程序不断减少最终输出,并且Taylor系列假设在 - 和+之间交替,那么如何在程序中编写呢?
感谢。
答案 0 :(得分:0)
泰勒系列使用x的幂数和幂。
taylor_sin(x)= sum [0-> n]([(-1 ^ n)/(2n + 1)!] * x **(2n + 1))
(抱歉我的键盘数学技巧很差......)
program taylor
implicit none
integer :: n = 0
real :: fac = 1
real :: y = 0.75
real :: x = 0.75
real :: px = 1
integer :: sgn = -1
integer :: s = 1
do while (abs(y - sin(0.75)) > 1E-6)
n = n + 1
fac = fac * (2 * n) * ((2 * n) + 1)
px = px * (x * x)
s = s * sgn
y = y + ((s /fac) * (px * x))
print *, y
end do
end program taylor
在循环中计算阶乘fac
相当简单。
要计算x **(2n + 1),计算并保持x **(2n)并添加x的额外乘法。
我使用整数来计算-1 ** n,因为使用真实的可能会随着时间的推移而失去精度。
[编辑]愚蠢的我...你可以通过在循环之前将px设置为0.75来将额外的乘法保存为x。