Javascript 循环中的赋值乘法运算符作为数学函数

Javascript assignment multiplication operators in a loop as a Math function

我正在循环执行以下计算:

https://jsfiddle.net/0xLvxjar/

var i = 0;
var times = 200;
var friction = 0.9925;
var velocity = 10;
var position = 100;

for (; i < times; i += 1) {
    velocity *= friction;
    position += velocity;
}

console.log(velocity) // 2.218723008169958 
console.log(position) // 1129.722321918849

我想将其重写为数学函数,并尽可能消除循环。

查看 JavaScript 数学对象:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math 我没有看到可以处理此问题的方法。

是否有更好的方法使用数学公式得出最终结果?

用数学求解:

// v_1 = v_0 * f
// p_1 = p_0 + v_1
// 
// p_2 = p_1 + v_1 * f
//     = p_0 + v_1 + v_1 * f
//     = p_0 + v_0 * f + v_0 * f * f
//     = p_0 + v_0 * (f + f^2)

此时您可能会看到 p_n = p_0 + v_0 * (f + f^2 + f^3 + ... + f^n).

根据您的处方集,您可能知道这是真的:

因此p_n = p_0 + v_0 * f * (1 - f^n) / (1 - f).

转移到JavaScript你得到这个:

var n = 200;
var friction = 0.9925;
var velocity_0 = 10.0;
var position_0 = 100.0;

var velocity_n = velocity_0 * Math.pow(friction, n);
var position_n = position_0 + velocity_0 * friction * (1 - Math.pow(friction, n)) / (1 - friction);


alert(velocity_n);
alert(position_n);

变量'velocity'是等比级数的项(参见http://en.wikipedia.org/wiki/Geometric_progression),而'position'是等比级数项的总和,所以你可以替换for 在你的代码中循环:

var power = Math.pow(friction, times);
position += velocity * (1 - power) * friction / (1 - friction);
velocity *= power;

但是,我不清楚删除 for 循环是否真的会产生更好的效率或精度。实际上,这取决于 Math.pow 实现细节,而这又应该使用一些循环。