Python用泰勒级数实现sin函数计算结果与预期不符求助
问题排查与修复方案
核心问题说明
你遇到的结果异常由两个关联问题共同导致:
- 三角函数的泰勒展开公式中,输入
x的单位是弧度,你代码直接传入了角度值45,没有做单位转换,计算目标本身和你的预期不符。 - 你对sin(45°)的理论值记忆有误:sin(45°)的正确值为√2/2≈0.7071,你提到的0.850904是
sin(45弧度)的理论值,你之前的代码输出37.93是因为45属于大数值,迭代1000次还未达到收敛条件,产生了计算误差。
修复方案
场景1:你需要计算的是sin(45°)
先把角度值转换为弧度值再传入自定义sin函数即可,1度对应的弧度为π/180,优化后代码如下:
import math def faktorial(z): a = 1 for x in range(1, z+1): a = a * x return a def sin(x): p = 0 # 弧度值较小时泰勒级数收敛很快,迭代20次精度已经足够 for k in range(0, 20): a = (-1) ** k b = x ** (2*k + 1) c = faktorial(2*k + 1) p += (a * b) / c return p # 角度转弧度 x_deg = 45 x_rad = x_deg * math.pi / 180 print(sin(x_rad))
运行后输出结果约为0.7071,和sin(45°)的理论值一致。
场景2:你需要计算的是sin(45弧度)
先对输入的弧度值做2π模运算,把输入折叠到[-π, π]区间内再计算,大幅提升收敛速度:
import math def faktorial(z): a = 1 for x in range(1, z+1): a = a * x return a def sin(x): # 先折叠输入到[-π, π]区间 x = x % (2 * math.pi) if x > math.pi: x -= 2 * math.pi p = 0 for k in range(0, 20): a = (-1) ** k b = x ** (2*k + 1) c = faktorial(2*k + 1) p += (a * b) / c return p x = 45 print(sin(x))
运行后输出结果约为0.8509,和你提到的预期值一致。
可选优化建议
- 现有代码每次循环都重新计算完整阶乘和高次幂,性能浪费较大,你可以改为递推计算每一项的数值,不需要重复计算历史值,运行效率会提升数倍。
- 阶乘数值增长极快,当迭代次数过高时会出现整数溢出问题,实际场景下不需要设置1000次这么高的迭代次数,20~30次已经能满足绝大多数精度要求。
内容的提问来源于stack exchange,提问作者Adhi Aryadi
相关产品推荐
相关产品推荐

