2009-03-06 8 views
8

Так что я функция (я пишу это в псевдо-функциональном языке, я надеюсь, что его ясно):Как я могу это реализовать более эффективно

dampen (lr : Num, x : Num) = x + lr*(1-x) 

И я хочу, чтобы применить это несколько раз к значение x. Я мог бы реализовать рекурсивно:

dampenN (0, lr, x) = dampen(lr, x) 
dampenN (n, lr, x) = dampenN(n-1, lr, dampen(x)) 

Но должно быть так, как я могу сделать это математически, не прибегая к итерационной процедуры (рекурсивной, или петли).

К сожалению, мои навыки алгебры ржавы, не веря, может ли кто-нибудь помочь?

ответ

2

Мы можем полностью исключить серию из вашей формулы.

Нам дано:

x_(n+1) = x_n + lr(1-x_n) 

Это можно сделать проще, переписав следующим образом:

x_(n+1) = (1-lr)x_n + lr 

Эффективно, мы трансформировали это в хвостовой рекурсии. (. Если вы хотите перспективы компьютерной науки)

Это означает, что:

x_n = (1-lr)^n * x_0 + ((1-lr)^(n-1) + (1-lr)^(n-2) + ... + 1)*lr 

Большой член справа представляет собой geometric series, так что может быть свернуты, а также:

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 

Отредактировано из-за небольшой ошибки в окончательных выражениях. +1 до грозы.

+0

Ваша серия не содержит (1-lr)^n ... Можете ли вы объяснить, почему? Я вижу этот термин в решении MarkusQ. – Niyaz

+0

Да. Начиная с x1 = (1-lr) x0 + r, x2 = (1 - lr) x1 + r, поэтому x2 = (1 - lr)^2 x0 + (1 - lr) * r и т. Д. –

5
x + lr*(1-x) 
= x + lr - lr*x 
= x*(1-lr)+lr 

применять его дважды дает

(x*(1-lr)+lr)*(1-lr)+lr 
= x*(1-lr)^2 + lr*(1-lr) + lr 

и три раза

(x*(1-lr)+lr)*(1-lr)^2 + lr*(1-lr) + lr 
= x*(1-lr)^3 + lr*(1-lr)^2 + lr*(1-lr) + lr 

или вообще, п раз дает

x*(1-lr)^n + lr * ((1-lr)^n + (1-lr)^(n-1)...+(1-lr) +1) 

ли это помощь?

+0

Вы можете пойти дальше и заметить, что (1-lr)^n + (1-lr)^(n-1) ... + (1 -lr) +1 - сумма геометрической прогрессии и может быть рассчитана по формуле – vava

0

Моя алгебра умение сосать, но я решил реорганизовать уравнение немного и начал исследовать некоторые из случаев, d0 и d1:

d0 = x + lr(1-x) => x + lr - lr*x => (1 - lr)x + lr 
d1 = (1 - lr)[(1 - lr)x + lr] + lr => (1 - lr)^2 x + lr(1 - lr) + lr 

В принципе, если вы начинаете видеть квадратное, вы можете начать видя кубическую форму и так далее.

В этот момент x используется только один раз, и вам просто нужно иметь дело с возведением в степень всех подпорок вида (1 - lr)^n.

1

На самом деле, сообщение MarkusQ имеет ошибку. Правильная формула:

 
x * (1-lr)^n + lr * ((1-lr)^(n-1) + (1-lr)^n-2 + ... + (1-lr) + 1) 
= x * (1-lr)^n + lr * (1 - (1-lr)^n)/(1 - (1-lr)) 
= x * (1-lr)^n + (lr/lr) * (1 - (1-lr)^n) 
= (x-1) * (1-lr)^n + 1 

Также обратите внимание, что «n» - это количество раз, когда вы применяете эту функцию.В вашем функциональном псевдокоде выше случай «n = 0» применяет функцию один раз, а не нулевое время; в соответствии с приведенной выше формулой, это должно было бы пойти:

 
dampenN (0, lr, x) = x 
dampenN (n, lr, x) = dampenN(n-1, lr, dampen(x)) 
+0

Yup; вы поймали ошибку. +1. –

Смежные вопросы