如何更有效地实现这一点

san*_*ity 8 algorithm math algebra

所以我有一个函数(我用伪函数语言写这个,我希望它清楚):

dampen (lr : Num, x : Num) = x + lr*(1-x)
Run Code Online (Sandbox Code Playgroud)

我希望将这n次应用于值x.我可以递归地实现它:

dampenN (0, lr, x) = dampen(lr, x)
dampenN (n, lr, x) = dampenN(n-1, lr, dampen(x))
Run Code Online (Sandbox Code Playgroud)

但是必须有一种方法可以在数学上做到这一点,而不需要求助于迭代过程(递归或循环).

不幸的是,我的代数技能已经超乎想象了,任何人都可以帮忙吗?

Mar*_*usQ 5

x + lr*(1-x) 
= x + lr - lr*x 
= x*(1-lr)+lr
Run Code Online (Sandbox Code Playgroud)

应用它两次给

(x*(1-lr)+lr)*(1-lr)+lr 
= x*(1-lr)^2 + lr*(1-lr) + lr
Run Code Online (Sandbox Code Playgroud)

和三次

(x*(1-lr)+lr)*(1-lr)^2 + lr*(1-lr) + lr 
= x*(1-lr)^3 + lr*(1-lr)^2 + lr*(1-lr) + lr
Run Code Online (Sandbox Code Playgroud)

或者一般来说,n次给出

x*(1-lr)^n + lr * ( (1-lr)^n + (1-lr)^(n-1)...+(1-lr) +1)
Run Code Online (Sandbox Code Playgroud)

这有帮助吗?


Rob*_*lan 2

我们可以从您的公式中完全消除该级数。

我们得到:

x_(n+1) = x_n + lr(1-x_n)
Run Code Online (Sandbox Code Playgroud)

这可以通过重写来变得更简单,如下所示:

x_(n+1) = (1-lr)x_n + lr
Run Code Online (Sandbox Code Playgroud)

实际上,我们已将其转换为尾递归。(如果你想要计算机科学的观点。)

这意味着:

x_n = (1-lr)^n * x_0    +   ((1-lr)^(n-1) + (1-lr)^(n-2) + ... + 1)*lr 
Run Code Online (Sandbox Code Playgroud)

右边的大项是几何级数,因此也可以折叠:

x_n = (1-lr)^n * x_0   +   lr *  (1 - (1-lr)^n) / (1- (1 -lr))
x_n = (1-lr)^n * x_0   +   1 - (1 - lr)^n
Run Code Online (Sandbox Code Playgroud)

由于最终表达式中的一个小错误而进行了编辑。即将到来的风暴+1。