You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用NumPy实现级数计算?请帮忙排查我的正弦近似代码问题

修复你的正弦泰勒级数实现代码

首先得说,你的代码现在有几个关键问题,导致它没法正确计算正弦的泰勒级数:

  • 循环逻辑完全混乱:你一开始用np.arange(k,N+1)生成了k的数组,但循环里直接把arr重新赋值成np.sum(i),这直接把数组变成了标量,后续循环根本没法正常执行。
  • 运算符优先级踩坑-1**(k-1)会先算1**(k-1)再取负,这和我们需要的交替正负项(-1)^(k-1)完全不符,符号全错了。
  • 没用到NumPy的核心特性:你用了显式for循环,既不符合NumPy向量化的最佳实践,也没用到提示里的np.multiply.accumulate
  • 无用的异常抛出raise NotImplementedError()放在return之后,永远不会被执行,完全没必要留着。

接下来我结合提示里的函数,给你写两个正确的实现,贴合NumPy的使用习惯:

实现方式一:直接向量化计算每一项

import numpy as np

def mysin(x, N):
    # 生成k从1到N的数组
    k = np.arange(1, N+1)
    # 计算交替符号项:(-1)^(k-1)
    signs = (-1) ** (k - 1)
    # 计算x的奇次幂:x^(2k-1)
    x_pows = x ** (2 * k - 1)
    # 用np.multiply.accumulate递推计算(2k-1)!:1, 1*3, 1*3*5,..., (2N-1)!
    factorials = np.multiply.accumulate(np.arange(1, 2*N, 2))
    # 计算每一项的值并求和
    return np.sum(signs * x_pows / factorials)

实现方式二:递推式计算(更高效,避免大数值运算)

正弦泰勒级数的递推公式是:$a_{k+1} = a_k \times \frac{-x^2}{(2k)(2k+1)}$,其中第一项$a_1=x$,用这个递推逻辑可以避免计算超大幂和阶乘,效率更高:

import numpy as np

def mysin(x, N):
    if N == 0:
        return 0.0
    # 初始化第一项和总和
    current_term = x
    total = current_term
    # 生成递推系数数组
    k_arr = np.arange(1, N)
    coefficients = (-x**2) / ((2*k_arr) * (2*k_arr + 1))
    # 用multiply.accumulate一次性算出所有后续项
    subsequent_terms = current_term * np.multiply.accumulate(coefficients)
    # 累加所有项得到结果
    total += np.sum(subsequent_terms)
    return total

你可以测试一下,比如mysin(np.pi/2, 5)应该接近1,mysin(np.pi, 10)应该接近0,验证结果是否符合预期。

内容的提问来源于stack exchange,提问作者jsl5703

火山引擎 最新活动