【问题标题】:Approximating sin using the Taylor series使用泰勒级数逼近 sin
【发布时间】:2021-08-13 23:39:28
【问题描述】:

我正在尝试使用泰勒级数而不使用阶乘来计算 sin(x)

import math, time
import matplotlib.pyplot as plot

def sin3(x, i=30):
    x %= 2 * math.pi
    n = 0
    dn = x**2 / 2
    for c in range(4, 2 * i + 4, 2):
        n += dn
        dn *= -x**2 / ((c + 1) * (c + 2))
    return x - n

def draw_graph(start = -800, end = 800):
    y = [sin3(i/100) for i in range(start, end)]
    x = [i/100 for i in range(start, end)]

    y2 = [math.sin(i/100) for i in range(start, end)]
    x2 = [i/100 for i in range(start, end)]

    plot.fill_between(x, y, facecolor="none", edgecolor="red", lw=0.7)
    plot.fill_between(x2, y2, facecolor="none", edgecolor="blue", lw=0.7)
    plot.show()

当您运行draw_graph 函数时,它使用matplotlib 绘制图形,红线是我的sin3 函数的输出,蓝线是math.sin 方法的正确输出。

您可以看到曲线不太正确,它不够高或不够低(似乎在 0.5 处达到峰值),并且还具有奇怪的行为,它会在 0.25 附近产生一个小峰值,然后再次下降。如何调整我的函数以匹配 math.sin 的正确输出?

【问题讨论】:

  • 现在是学习how to debug small programsto use a debugger 的好时机,逐步检查您的代码并观察每一行代码的作用。通过将这些中间结果与预期结果进行比较,确定您的程序与您的预期有何不同。从那里向后工作以缩小问题的原因。如果您仍然对代码的行为感到困惑,请提出一个特定 问题。转储代码并期望其他人为您调试它是不行的。
  • 这个问题很具体,我在问如何在不使用阶乘的情况下使用泰勒级数生成罪孽。这不是一个具体的问题吗?
  • “我怎样才能完成这项任务”或“修复我的代码”不是具体问题。你做了什么调试?您是否写出了泰勒级数展开式并比较了您的sin3() 生成的术语?您是否尝试确定是哪个术语/哪一行代码导致了问题?
  • 我已经尝试更改 n 变量,以及在过去几个小时内多次循环开始和结束的位置,range(4, 2 * i + 4, 2) 似乎已经生成了迄今为止最准确的结果,但是它仍然来自正确的结果。
  • 如果这是一个关于数学应该如何完成的问题,而不是如何实现的问题,你最好在 math.stackexchange 或类似网站上提问

标签: python trigonometry taylor-series


【解决方案1】:

你有错误的 sin(x) 方程,而且你还有一个混乱的循环不变量。

sin(x) 的公式是x/1! - x^3/3! + x^5/5! - x^7/7!...,所以我真的不知道你为什么要将dn 初始化为涉及x^2 的东西。

您还想问自己:我的循环不变量是什么?当我到达循环开始时,dn 的值是多少。从您更新 dn 的方式可以清楚地看出,您希望它涉及x^i / i!。然而,在循环的第一次迭代中,i=4,然而dn 涉及x^2

这是你要写的:

def sin3(x, i=30):
    x %= 2 * math.pi
    n = 0
    dn = x
    for c in range(1, 2 * i + 4, 2):
        n += dn
        dn *= -x**2 / ((c + 1) * (c + 2))
    return n

【讨论】:

  • 作为一个小笨蛋。为了获得更好的准确性,您需要-π ≤ x ≤ π 而不是0 ≤ x ≤ 2π。所以第一行可能是x = (x + math.pi) % (2 * math.pi) - math.pi
猜你喜欢
  • 2021-08-12
  • 2015-11-21
  • 2022-07-10
  • 1970-01-01
  • 2020-02-25
  • 2018-06-23
  • 2019-07-11
  • 2017-06-06
  • 2021-03-19
相关资源
最近更新 更多