泰勒级数-比尔盖茨汇编实现的以泰勒公式计算逼近正弦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);
}
网友评论