虽然Loop只运行一次?

时间:2014-02-24 22:29:19

标签: javascript

尽管Math.abs(v1-v2)肯定大于1E-7,但为什么我的计算导数的数值方法没有循环,这让我感到很难过:

derivative:function(f,o,x){
    var h=0.01;
    switch(o){
        case 1:
            //v1=(f(x+h)-f(x))/h;
            var v1=(-f(x+2*h)+8*f(x+h)-8*f(x-h)+f(x-2*h))/(12*h);
            while(typeof v2==='undefined' || Math.abs(v1-v2)>1E-7) {
                h-=h/2;
                //v2=(f(x+h)-f(x))/h;
                v2=(-f(x+2*h)+8*f(x+h)-8*f(x-h)+f(x-2*h))/(12*h);
                v1=v2;
            }
            return v2;

        ...

        default:
            return 0;
    }
}

虽然可能只是我有脑屁。关于如何修复它的任何想法

5 个答案:

答案 0 :(得分:4)

第一次循环运行时,它会设置v2,因此typeof v2==='undefined'不再为真。它还设置v1=v2,所以Math.abs(v1-v2)===0,所以第二个条件也是假的。因此,这两个条件都不成立,因此循环退出。

答案 1 :(得分:0)

你的while循环中的最后一件事在v1 = v2中,所以在while循环的下一次迭代中,Math.abs(v1-v2)=== 0

答案 2 :(得分:0)

好吧,v1-v2 == 0,因为v1 = v2。

答案 3 :(得分:0)

解决方案是在循环中移动v1的定义:

var h=1,v1,v2;

...

while((typeof v1==='undefined' && typeof v2==='undefined') || Math.abs(v1-v2)>1E-7) {
    //v2=(f(x+h)-f(x))/h;
    v1=(-f(x+2*h)+8*f(x+h)-8*f(x-h)+f(x-2*h))/(12*h);
    h-=h/2;
    v2=(-f(x+2*h)+8*f(x+h)-8*f(x-h)+f(x-2*h))/(12*h);
}

答案 4 :(得分:0)

问题是你在while循环中的最后一个语句。我想你想这样做:

derivative:function(f,o,x){
    var h=0.01;
    switch(o){
        case 1:
            var v1=(-f(x+2*h)+8*f(x+h)-8*f(x-h)+f(x-2*h))/(12*h);
            while(typeof v2==='undefined' || Math.abs(v1-v2)>1E-7) {
                v2=v1;
                h-=h/2;
                v1=(-f(x+2*h)+8*f(x+h)-8*f(x-h)+f(x-2*h))/(12*h);
            }
            return v1;

        ...

        default:
            return 0;
    }
}