2009-03-06 42 views
8

Vì vậy, tôi có một chức năng (Tôi đang viết này bằng một ngôn ngữ pseudo-chức năng, tôi hy vọng rõ ràng của nó):Làm thế nào tôi có thể thực hiện điều này một cách hiệu quả hơn

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

Và tôi muốn áp dụng n này lần để một giá trị x. Tôi có thể thực hiện nó theo cách đệ quy:

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

Nhưng phải có cách tôi có thể thực hiện toán học mà không cần đến quy trình lặp lại (đệ quy hoặc vòng lặp).

Thật không may là các kỹ năng đại số của tôi bị gỉ hơn niềm tin, có ai giúp được không?

Trả lời

2

Chúng tôi có thể loại bỏ hoàn toàn chuỗi từ công thức của bạn.

Chúng tôi đang đưa ra:

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

này có thể được thực hiện đơn giản bằng cách viết lại như sau:

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

có hiệu quả, chúng tôi đã chuyển đổi này vào đuôi đệ quy. (. Nếu bạn muốn quan điểm khoa học máy tính)

Điều này có nghĩa rằng:

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

Thuật ngữ lớn trên bên phải là một geometric series, do đó có thể được sụp đổ cũng như:

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 

Đã chỉnh sửa do một lỗi nhỏ trong các biểu thức cuối cùng. +1 để phát triển.

+0

Chuỗi của bạn không chứa (1-lr)^n ... Bạn có thể giải thích tại sao không? Tôi thấy thuật ngữ đó trong giải pháp của MarkusQ. – Niyaz

+0

Có. Bắt đầu với x1 = (1-lr) x0 + r, x2 = (1 - lr) x1 + r, vì vậy x2 = (1 - lr)^2 x0 + (1 - lr) * r và cứ thế –

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

áp dụng nó hai lần cho

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

và ba lần

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

hoặc nói chung, n lần cho

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

Điều đó giúp đỡ?

+0

Bạn có thể đi xa hơn và nhận thấy rằng (1-lr)^n + (1-lr)^(n-1) ... + (1 -lr) +1 là tổng của sự tiến triển hình học và có thể được tính theo công thức – vava

0

kỹ năng đại số của tôi hút quá, nhưng tôi quyết định cấu trúc lại công thức một chút và bắt đầu kiểm tra một số trường hợp, d0 và 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 

Về cơ bản nếu bạn bắt đầu nhìn thấy những bậc hai, bạn có thể bắt đầu nhìn thấy hình khối và vân vân.

Tại thời điểm đó, x chỉ được sử dụng một lần và bạn chỉ phải đối phó với sự lũy thừa của tất cả các từ con của biểu mẫu (1 - lr)^n.

1

Thực ra, bài đăng của MarkusQ có lỗi. Công thức chính xác là:

 
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 

Ngoài ra, lưu ý rằng "n" là số lần bạn áp dụng hàm.Trong mã giả chức năng của bạn ở trên, trường hợp "n = 0" áp dụng hàm một lần, không phải 0 lần; để đối sánh công thức trên, nó sẽ phải đi:

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

Yup; bạn đã gặp lỗi. +1. –

Các vấn đề liên quan