尽管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;
}
}
虽然可能只是我有脑屁。关于如何修复它的任何想法?
答案 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;
}
}