2014-02-24 5 views
-1

Вид в тупик, почему мой метод численного вычисления производных не зацикливание, несмотря 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

Какие качества вы передаёте? – Bergi

ответ

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

При первом запуске цикла он устанавливает v2, поэтому typeof v2==='undefined' больше не относится к действительности. Он также устанавливает v1=v2, поэтому Math.abs(v1-v2)===0, поэтому второе условие является ложным, а также. Таким образом, ни одно условие не является истинным, поэтому цикл выходит.

0

Последнее, что в цикле в то время как в v1 = v2, так на следующей итерации цикла в то время, Math.abs (v1-v2) === 0

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; 
    } 
} 
Смежные вопросы