Javascript sin / cosin taylor expansion

时间:2016-09-08 10:07:21

标签: javascript math

我遇到了我写的函数的问题。我们的想法是使用cosin扩展而不是radians数学对象来计算sin和taylor值(在js上运行)。这些是方程式:

sin(x) = (x^1)/1! - (x^3)/3! + (x^5)/5! - (x^7)/7! + (x^9)/9! - (x^11)/11! + ...

cos(x) = (x^0)/0! - (x^2)/2! + (x^4)/4! - (x^6)/6! + (x^8)/8! - (x^10)/10! + ...

据我所知,当我输入类似myCos(10,2)的内容时,由于迭代次数较少,结果会不准确,但是我不明白为什么(例如)x = 10结果开始变为真实具体为iterNum = 6NaNiterNum = 80。关键是对于myCos/Sin(1-40, 5-50)(或多或少)函数的范围有效,但对于更高的数字,结果变为NaN。不确定我的解释是否可以理解,但我希望是这样,只需继续使用控制台中的功能,你会看到问题是什么
这是我的代码:

function power(a,n) {
    var result = 1;
    for (var i = 0; i < n; i++) {
        result = result * a;
    }
    return result;
}
function factorial(z) {
    var result = 1;
    for (var i = 1; i <= z; i++) {
        result = result * i;
    }
    return result;
}
function mySin(x, iterNum) {
    var sin = 0;
    var n = 1;
    for (var i = 0; i <= iterNum; i++) {
        sin = sin + (power(x,n)/factorial(n) - power(x,n+2)/factorial(n+2));
        n = n + 4;
    }
    console.log(sin + " = my function.");
    console.log(Math.sin(x)  + " math.sin");
}
function myCos(x, iterNum) {
    var cos = 0;
    var n = 0;
    for (var i = 0; i <= iterNum; i++) {
        cos = cos + (power(x,n)/factorial(n) - power(x,n+2)/factorial(n+2));
        n = n + 4;
    }
    console.log(cos + " = my function.");
    console.log(Math.cos(x) + " math.cos");
}

2 个答案:

答案 0 :(得分:1)

您遇到的问题是

> Infinity/Infinity
NaN

因此,当powerfactorial生成的值大于JavaScript的浮点数可以表示的值时,您将NaN添加到总和中,并将其传播到结果。

您应该可以使用

修复它
for (var i = 0; i <= iterNum; i++) {
    var member = power(x,n)/factorial(n) - power(x,n+2)/factorial(n+2);
    if (isNaN(member)) // maybe || member === 0
        break;
    sin += member;
    n += 4;
}

答案 1 :(得分:0)

正弦系列的项k-1和k之间的商具有很好的简单形式

-x*x / ( (2*k)*(2*k+1) )

这允许使用最少的浮点运算进行非常简单的实现:

function mySin(x, iterNum) {
    var mxx = -x*x;
    var sin = 1;
    var n = 0;
    var term = 1;
    for (var i = 1; i <= 2*iterNum; i++) {
        n = n + 2;
        term = term * mxx / ( n*(n+1) );
        sin = sin + term
    }
    sin = x*sin;
    console.log(sin + " = my function.");
    console.log(Math.sin(x)  + " math.sin");
}

由于既不计算功率也不计算因子,所以该计算中的最大值是n-0.5 <= x <= n + 1.5且大小约为exp(x)的项。这仍然可以导致值NaN,但仅高于x>705