2009-03-06 2 views
8

그래서 내가 함수했다 (나는 의사 함수형 언어에서 이것을 쓰고 있어요, 나는 그것의 명확한 희망) 구현할 수있는 방법 :나는이보다 효율적으로

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

내가이 n 배를 적용 할 값 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 

3 배

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

또는 일반적으로

을 제공합니다 적용, n 번이

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

가 도움이됩니까 준다?

+0

당신은 더 나아가 그 (1-LR)을 알 수 + (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"의 경우는 0 번이 아닌 한 번만 함수를 적용합니다.^N

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

예; 당신은 오류를 잡았습니다. +1. –