我需要使用泰勒展开式获得 sin(x) 的近似值:
这是代码:
def factorial(number): # Factorial Function
s = 1
for k in range(1, number):
s *= k
return s
ceta = eval(input("Enter angle of sin: "))
x = (ceta * 3.14) / 360 # Change from degree to radian
n = 15
sin = x
mult = -1
for i in range(3, n+1, 2): # The 2 step will skip from 3 to 5 to 7 and so on until 15.
sin += (x ** i) / factorial(i) * mult
mult = mult * -1
print("sin of", ceta, "is", sin)
阶乘函数工作正常,问题出在for循环中,但我找不到它。
我在 RUN 中输入了 sin( 30 ),但它给了我 0.258 而不是 0.5
在def阶乘中,尝试将循环更改为:for k in range(1, number + 1)。另外,我不建议使用 3.14 作为 pi,您可以使用 math.pi 或写下更多小数。我第一次看到有人使用 eval,尝试将其更改为 floaat。
import math
def factorial(number): # Factorial Function
s = 1
for k in range(1, number + 1): # Fixed range to include 'number'
s *= k
return s
# float instead of
ceta = float(input("Enter angle of sin: "))
# math.pi instead of 3.14
x = (ceta * math.pi) / 180 # Change from degree to radian
n = 15
sin = x
mult = -1
for i in range(3, n+1, 2):
sin += (x ** i) / factorial(i) * mult
mult *= -1 # It's equivalent to 'mult = -mult'
print("sin of", ceta, "is", sin)
这里至少有两个问题:
第一个问题是阶乘函数。你没有乘以
number
这个功能可以这样修复
def factorial(number): # Factorial Function
s = number # replace 1 with number
for k in range(1, number):
s *= k
return s
另一个问题是度数到弧度的转换:弧度 = 度数 * PI / 180
所以在你的代码中我会:
x = (ceta * 3.14) / 180 # Change from degree to radian
为了获得更好的精度,您可以使用 math.pi:
从数学导入 pi x = (ceta * pi) / 180 # 从度数变为弧度
我建议的最后一件事是增加迭代的上限,因为您的步长为 2。n=15,因为上限意味着只有 7 个步长。我会选择 n=30 甚至更高。
所以结果:
from math import pi
def factorial(number): # Factorial Function
s = number
for k in range(1, number):
s *= k
return s
ceta = 30
x = (ceta * pi) / 180 # Change from degree to radian
n = 30
sin = x
mult = -1
for i in range(3, n+1, 2): # The 2 step will skip from 3 to 5 to 7 and so on until 15.
print(i)
print(factorial(i))
sin += (x ** i) / factorial(i) * mult
mult = mult * -1
print(mult)
print(sin)
print()
print("sin of", ceta, "is", sin)
~