比尔盖茨汇编实现泰勒级数

2021-12-17  本文已影响0人  杰_6343

泰勒级数-比尔盖茨汇编实现的以泰勒公式计算逼近正弦sin函数的方法

编程珠玑

发现越往后,越精确,但是代价就是计算量越大。而往往我们直接舍去后面的高阶无穷小,仅需要前三四项即可满足我们的要求。

具体步骤为:

1),先让函数值相同,也即 得到:  2),再让一阶导数相等

得到: ......

最后让n阶导数数相等 (  的  阶导数仍是  )

得到: 最后得出:

当  不断增大的时候,小明惊奇地发现在固定区间内,两者几乎完美地融合在了一起

泰勒级数的几何意义

三个面积相加,也就是

上面这个式子不正是泰勒级数展开的二次多项式

当无限逼近  ,那么我们完全可以用  来近似  ,也就是说省略掉后面的矩形与三角形,只剩下一项。而实际上我们省略了后面的高阶无穷小,在一般情况下,精度已经够高了。

这便是泰勒级数在几何上面的解释。

通过C语言翻译实现

#include <math.h>
// 多项式求值,c[0] + c[1] * x + c[2] * x^2 + ... + c[n-1] * x^(n-1)
float poly(float x, int n, const float* c) {
    float sum = 0;
    for(int i = 0; i < n; ++i) {
        sum *= x;
        sum += c[i];
    }
    return sum;
}
// 多项式求值,c[0] * x + c[1] * x^3 + c[2] * x^5 + ... + c[n-1] * x^(2n-1)
float polyx(float x, int n, const float* c) { return poly(x * x, n, c) * x; }
// 泰勒展开的系数,(2PI)^n / n! (n = 9, 7, 5, 3, 1)
const float SIN_TABLE[] = {39.710899, -76.574956, 81.602231, -41.341677, 6.2831853};
float basic_sin(float x) {
    // 应用三角函数的周期性,变换输入 [0, 2PI) / [0, 1)
    x /= 3.1415926 * 2;
    x -= floor(x);
    // 将输入进一步变换到 [-PI/2, PI/2] / [-1/4, 1/4]
    x = 0.25 - x;
    int sign = x <= 0;
    if(sign) {
        // 第二、三、四象限
        x += 0.5;
        if(x > 0) {
            // 第二、三象限
            x = -x;
        }
    } else {
        // 第一象限
        x = -x;
    }
    x += 0.25;
    if(sign) x = -x;
    // 这一步完成之后:
    // 第一象限 [0, 1/4) -> [0, 1/4):x -> x
    // 第二象限 [1/4, 2/4) -> (0, 1/4]:x -> 0.5 - x
    // 第三象限 [2/4, 3/4) -> (-1/4, 0]:x -> 0.5 - x
    // 第四象限 [3/4, 1) -> [-1/4, 0):x -> x - 1
    // 然后就是泰勒展开
    return polyx(x, 5, SIN_TABLE);
}
上一篇 下一篇

猜你喜欢

热点阅读