문제

그래서 나는 기능이 있습니다 (나는 이것을 의사 기능 언어로 작성하고 있습니다. 분명하기를 바랍니다).

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))

그러나 반복적 인 절차 (재귀 또는 루프)에 의지하지 않고 수학적으로 할 수있는 방법이 있어야합니다.

불행히도 내 대수 기술은 믿음을 넘어 서신으로 녹슬 었습니다. 누구든지 도울 수 있습니까?

도움이 되었습니까?

해결책

우리는 당신의 공식에서 시리즈를 완전히 제거 할 수 있습니다.

우리는 주어진다 :

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 

오른쪽의 큰 용어는 a 기하학적 시리즈, 또한 붕괴 될 수 있습니다.

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.

다른 팁

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

또는 일반적으로 N 시간이 제공됩니다

x*(1-lr)^n + lr * ( (1-lr)^n + (1-lr)^(n-1)...+(1-lr) +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 시간이 아닌 함수를 한 번에 적용합니다. 위의 공식과 일치하려면 다음과 같습니다.

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

내 대수 기술도 빨라지지만 방정식을 약간 리팩터링하기로 결정하고 일부 사례 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

기본적으로 2 차를보기 시작하면 입방 형태 등을보기 시작할 수 있습니다.

그 시점에서 x는 한 번만 사용되며 양식 (1 -lr)^n의 모든 하위 항의 지수를 다루어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top