我正在尝试编写一些代码,使用泰勒展开计算 sin(0.75) 的值,并打印每次迭代,直到使用展开计算的值与使用 Fortran 的内在 sin 函数计算的值之间的绝对差为小于1E-6。这是我的代码:
program taylor
implicit none
real :: x = 0.75
do while (x - sin(0.75) < 10**(-6))
print *, x
x = x - ((x**3)/6) + ((x**5)/120) - ((x**7)/5040)
end do
end program taylor
然而,这并没有打印出任何东西?为什么是这样?
对于大多数人来说,这看起来太明显了,所以没有人愿意回答,但应该明确地说出来
条件x - sin(0.75) < 10**(-6)
显然不正确,当x
非常不同于sin(0.75)
, 所以do while
永远不会进入循环。
另外,正如 IanH 评论的那样10**(-6)
将给出 0,因为两个整数的幂的结果又是一个整数。字面意思real
数字 10^-6 应表示为1e-6
.
如果你把它改成x - sin(0.75) > 1e-6
循环将继续,但它将永远运行,因为你的迭代是错误的。泰勒级数的工作方式不同,你应该计算
y = 0
y = y + x**1/1!
y = y - x**3/3!
y = y + x**5/5!
y = y - x**7/7!
...
等等,这是一种非常不同的循环。
试试这个:
program taylor
implicit none
real :: x = 0.75
real :: y, fact
integer :: sgn, i
fact = 1
sgn = 1
y = 0
do i = 1, 10, 2
y = y + sgn * x**i / fact
fact = fact*(i+1)*(i+2)
sgn = -sgn
end do
print *, y, sin(x)
end program taylor
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)