2009-12-03 12 views
8

Tôi cần làm rõ bằng thuật toán tạo ra các giá trị ngẫu nhiên cho bộ dò tia vật nuôi của tôi.
Tôi phát ra tia từ một điểm. Và tôi có vấn đề với sự phân bố của các tia này: Tôi cần sự phân bố đồng nhất, nhưng nó không phải là ...Phân phối ngẫu nhiên (Monte-Carlo) trên quả cầu đơn

Vấn đề mà tôi phải đối mặt lúc này là sự phân bố đồng đều ban đầu không đồng nhất sau khi sự biến dạng của tôi không gian của kết quả.

Ví dụ: tôi tạo các góc r và t nếu hệ tọa độ cực. Sự phân bố không đồng đều và không thể đồng nhất: không gian gần với mỗi cực có mật độ kết quả cao hơn nhiều so với đường xích đạo. Lý do khá rõ ràng: tôi chuyển đổi các điểm phân bố đồng nhất từ ​​không gian hình trụ sang hình cầu. Và tôi bóp méo kết quả. Vấn đề tương tự là nếu tôi chuẩn hóa các điểm được tạo ngẫu nhiên trong khối lập phương. Ý tưởng của tôi bây giờ là: Tôi muốn tạo một tứ diện, chuẩn hóa các đỉnh của nó, chia từng mặt (hình tam giác) với điểm ở giữa, chuẩn hóa nó và lặp lại đệ quy cho đến khi tôi có đủ điểm. Sau đó, tôi "bóp méo" những điểm này một chút. Sau đó, tôi bình thường hóa chúng một lần nữa. Đó là nó.

Tôi hiểu rằng phương pháp này không phải là phương pháp toán học thuần túy Monte Carlo, bởi vì tôi không sử dụng phân phối ngẫu nhiên trong bất kỳ bước nào ngoại trừ bước cuối cùng. Và tôi không thích giải pháp này cho sự phức tạp này.

bất cứ ai có thể đề nghị bất cứ điều gì đơn giản hơn nhưng vẫn

  • ngẫu nhiên
  • thống nhất
  • nhanh
  • đơn giản

Cảm ơn!

CHỈNH SỬA:
Tôi cần phương pháp nhanh, không chỉ đúng phương pháp. Đó là lý do tôi hỏi về Monte-Carlo. Câu trả lời được cung cấp là chính xác, nhưng không nhanh. Phương pháp với tứ diện là nhanh, nhưng không phải là rất "ngẫu nhiên" => không chính xác.
Tôi thực sự cần một cái gì đó phù hợp hơn.

Trả lời

9

Here's một thuật toán cho phép bạn tạo ra các điểm phân phối ngẫu nhiên trên mặt cầu đơn vị.

0

Đối với một phần hình cầu tạo góc của bạn thống nhất trong phi (góc cực) và cos(theta) (đối với theta góc phương vị) giữa các giới hạn của bạn.

Trong mã giả:

phi = phi_low_limit  + rand()*(phi_high_limit  - phi_low_limit) 
ct = cos(theta_high_limit) + rand()*(cos(theta_low_limit) - cos(theta_high_limit)) 
// The order is inverted here because cos heads down for increasing theta 
theta = arccos(ct) 

Đây là một trường hợp đặc biệt của các quy tắc mà nói đảo ngược Jacobian và tạo thống nhất trong không gian của những tọa độ.

Lưu ý: Lưu ý rằng tôi đang sử dụng quy ước đối diện cho phi và theta từ dòng David Norman.

Lưu ý: Đây không phải là phương pháp nhanh nhất, mà là phương pháp minh họa nguyên tắc chung.

1

Trừ khi bạn đang chiếu tia sáng chỉ những cảnh tầm thường, thời gian hiển thị của bạn có thực sự bị chi phối bởi thời gian lấy mẫu không? Nếu không, nó có thể không có giá trị tối ưu hóa được nêu ra, mặc dù nó là giá trị đọc và hiểu các kỹ thuật lấy mẫu thống nhất đưa ra trong các câu trả lời khác.

Ngoài ra, các mẫu của bạn không cần phải rất ngẫu nhiên để tạo ước tính tốt về bất kỳ hàm nào bạn đang lấy mẫu. Bạn có thể muốn điều tra bằng cách sử dụng một chuỗi số quasirandom chẳng hạn như Halton sequence. Ý tưởng phân khu tứ diện của bạn không phải là xấu. Nó sẽ cho kết quả tốt các điểm phân phối tốt hơn các mẫu giả ngẫu nhiên đồng nhất cho hầu hết các cảnh, mặc dù có thể dẫn đến hiện vật đáng sợ trong một số trường hợp.

Dù sao thì bạn cũng nên tham khảo các diễn đàn tại ompf.org. Có một số nerds siêu hardcore trên đó.

+0

Hey, liên kết thực sự tốt đẹp! – avp

+0

Ý tôi là, ompf.org =) – avp

5

Dưới đây là một thực hiện Java Tôi đã sử dụng trong quá khứ:

public static double[] randomPointOnSphere(Random rnd) 
{ 
    double x, y, z, d2; 
    do { 
     x = rnd.nextGaussian(); 
     y = rnd.nextGaussian(); 
     z = rnd.nextGaussian(); 
     d2 = x*x + y*y + z*z; 
    } while (d2 <= Double.MIN_NORMAL); 
    double s = Math.sqrt(1.0/d2); 
    return new double[] {x*s, y*s, z*s}; 
} 
+0

@DouglasZare nếu 'd2 finnw

+0

Rất tiếc, lỗi của tôi. –

3

Bạn có thực sự cần phân phối ngẫu nhiên hoặc một phân bố trên phạm vi?

Sau đó, tôi sẽ đề xuất các góc ZCW, được phân bố đều trên toàn bộ hình cầu và tính toán nhanh. Các phương pháp khác là TheSydneyOperaHouse (SOPHE) và Repulsion. (tìm kiếm repulsion.c) Phương pháp đẩy là khá tốt nhưng chậm: Nó lặp lại phân phối điểm đồng đều trên một hình cầu. May mắn thay nó phải được thực hiện chỉ một lần.

Điều này được sử dụng trong tinh thể và NMR, bởi vì đối với các mẫu bột, việc sử dụng phân bố đều hơn so với phân phối ngẫu nhiên sẽ nhanh hơn (bạn cần ít điểm hơn).

Here là triển khai Python cho ZCW.

Thêm các chi tiết trong các giấy tờ: