You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用泰勒多项式实现的cos(x)输出超出[-1,1]范围?

用泰勒多项式实现cos(x)的问题解决

问题背景

需要不依赖Math库,通过泰勒多项式前11项实现cos(x)函数。现有代码在x∈[1,4]时结果符合[-1,1]范围,但x=5时输出-4,更大的x会导致结果异常增大;尝试增加项数反而加剧越界,尝试利用2π周期性优化但未成功,目标是让x=42.5时结果仍处于[-1,1]区间。

问题根源

cos(x)的泰勒级数$\sum_{n=0}^{\infty} \frac{(-1)^n x{2n}}{(2n)!}$虽在全体实数收敛,但**大x值下$x{2n}$增长速度远快于前期的$(2n)!$,导致前若干项的累积误差急剧放大,甚至溢出。仅靠增加项数无法解决,必须先利用cos(x)的周期性**将x映射到小范围区间,再计算泰勒级数。

解决方案

核心思路

  1. 周期归约:cos(x)是周期为$2\pi$的偶函数,先将x归约到$[-\pi, \pi]$区间,此时x的绝对值最大约3.14,泰勒级数会快速收敛。
  2. 迭代计算泰勒项:避免手动重复计算,用循环迭代生成每一项,减少误差且易于控制项数(前11项对应n从0到10)。

实现代码

public class Cosinus {
    public static void main(String[] args) {
        // 手动定义π的近似值(无Math库依赖)
        final double PI = 3.141592653589793;
        double x = 42.5;

        // 步骤1:将x归约到[-π, π]区间
        double twoPI = 2 * PI;
        double reducedX = x % twoPI;
        if (reducedX > PI) {
            reducedX -= twoPI;
        } else if (reducedX < -PI) {
            reducedX += twoPI;
        }

        // 步骤2:迭代计算泰勒级数前11项(n从0到10)
        double result = 1.0; // n=0项:1
        double currentTerm = 1.0;
        double xSquared = reducedX * reducedX;

        for (int n = 1; n <= 10; n++) {
            // 每一项的符号交替,且x的幂次递增2
            currentTerm *= -xSquared;
            // 分母为(2n)! = (2n)*(2n-1) * (2(n-1))!,迭代更新分母
            currentTerm /= (2 * n) * (2 * n - 1);
            result += currentTerm;
        }

        // 修正浮点误差导致的微小越界
        if (result > 1.0) result = 1.0;
        if (result < -1.0) result = -1.0;

        System.out.println(result);
    }
}

关键细节说明

  • 区间归约:通过取余运算将x映射到$[0,2\pi)$,再调整到$[-\pi, \pi]$,确保reducedX的绝对值不超过π,此时泰勒级数的每一项会快速衰减,前11项足够保证精度。
  • 迭代计算:避免手动计算$x^2, x^4,...$和$2!,4!,...$,通过递推式更新当前项,减少重复计算的误差,同时轻松控制到11项。
  • 误差修正:浮点计算可能导致结果略超出[-1,1],最后做截断处理保证输出符合范围。

对之前尝试的问题解释

  • 增加项数无效:大x下$x^{2n}$的增长会让前期项的误差累积到无法挽回,必须先归约x到小范围。
  • 周期性优化失败:大概率是未正确完成区间归约(比如仅映射到$[0,2\pi]$而非$[-\pi, \pi]$,或取余运算错误),导致x仍处于泰勒级数收敛缓慢的区间。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:35:21