我的函数接收f
,这是以下形式的另一个函数:
// function f
mgf:function(p,n){
return function(t){
return Math.pow(1-p+p*Math.exp(t),n);
};
}
包含数字p
和n
。然后,它会根据此f
函数生成不同的函数,并根据h
生成变量值x
和o
(订单1
,2
,3
或4
)并运行while循环,直到v1
和v2
基本相等,然后最终返回此值:
derivative:function(f,o,x){
var h=0.01,v1,v2;
switch(o){
case 1:
while((typeof v1==='undefined' && typeof v2==='undefined') || Math.abs(v1-v2)>1E-5) {
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);
}
return v2;
case 2:
while((typeof v1==='undefined' && typeof v2==='undefined') || Math.abs(v1-v2)>1E-5) {
v1=(-f(x+2*h)+16*f(x+h)-30*f(x)+16*f(x-h)-f(x-2*h))/(12*Math.pow(h,2));
h-=h/2;
v2=(-f(x+2*h)+16*f(x+h)-30*f(x)+16*f(x-h)-f(x-2*h))/(12*Math.pow(h,2));
}
return v2;
case 3:
while((typeof v1==='undefined' && typeof v2==='undefined') || Math.abs(v1-v2)>1E-5) {
v1=(f(x+2*h)-2*f(x+h)+2*f(x-h)-f(x-2*h))/(2*Math.pow(h,3));
h-=h/2;
v2=(f(x+2*h)-2*f(x+h)+2*f(x-h)-f(x-2*h))/(2*Math.pow(h,3));
}
return v2;
case 4:
while((typeof v1==='undefined' && typeof v2==='undefined') || Math.abs(v1-v2)>1E-5) {
v1=(f(x+2*h)-4*f(x+h)+6*f(x)-4*f(x-h)+f(x-2*h))/Math.pow(h,4);
h-=h/2;
v2=(f(x+2*h)-4*f(x+h)+6*f(x)-4*f(x-h)+f(x-2*h))/Math.pow(h,4);
}
return v2;
}
}
正如您所看到的,此代码非常庞大且重复。每个案例执行完全相同的功能,但具有原始f
功能的不同功能。如何优化此代码并将其重写为更具可读性?我可以提取一般算法:
while(x) {
v1=y;
h-=h/2;
v2=y;
}
return v2;
并以某种方式有一个参数,它是f
的函数? IE浏览器。 (-f(x+2*h)+8*f(x+h)-8*f(x-h)+f(x-2*h))/(12*h)
答案 0 :(得分:0)
根据epascarello的评论,解决方案很简单:
derivative:function(f,o,x){
var h=0.01,v1,v2,f1;
switch(o){
case 1:
f1=function(x,h){ return (-f(x+2*h)+8*f(x+h)-8*f(x-h)+f(x-2*h))/(12*h); };
break;
case 2:
f1=function(x,h){ return (-f(x+2*h)+16*f(x+h)-30*f(x)+16*f(x-h)-f(x-2*h))/(12*Math.pow(h,2)); };
break;
case 3:
f1=function(x,h){ return (f(x+2*h)-2*f(x+h)+2*f(x-h)-f(x-2*h))/(2*Math.pow(h,3)); };
break;
case 4:
f1=function(x,h){ return (f(x+2*h)-4*f(x+h)+6*f(x)-4*f(x-h)+f(x-2*h))/Math.pow(h,4); };
break;
}
while((typeof v1==='undefined' && typeof v2==='undefined') || Math.abs(v1-v2)>1E-5) {
v1=f1(x,h);
h-=h/2;
v2=f1(x,h);
}
return v2;
}