在 PYTHON 中使用泰勒级数逼近 Sin(x)

问题描述 投票:0回答:2

我需要使用泰勒展开式获得 sin(x) 的近似值:

Taylor Expansion Image

这是代码:

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

python python-3.x math pycharm
2个回答
0
投票

在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)

0
投票

这里至少有两个问题:

第一个问题是阶乘函数。你没有乘以

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)
                                                                                  

~

© www.soinside.com 2019 - 2024. All rights reserved.