Tôi đang xem xét khoảng cách Euclide tối thiểu dự kiến giữa các điểm thống nhất ngẫu nhiên và điểm gốc thay đổi như thế nào khi chúng ta tăng mật độ của các điểm ngẫu nhiên ( điểm trên một đơn vị hình vuông ) xung quanh gốc. Tôi đã cố gắng đưa ra một mối quan hệ giữa hai mô tả như sau:
Tôi đã nghĩ ra điều này bằng cách chạy một số mô phỏng Monte Carlo trong R và khớp một đường cong bằng tay (mã bên dưới).
Câu hỏi của tôi là : tôi có thể có được kết quả này về mặt lý thuyết chứ không phải thông qua thử nghiệm?
#Stack Overflow example
library(magrittr)
library(ggplot2)
#---------
#FUNCTIONS
#---------
#gen random points within a given radius and given density
gen_circle_points <- function(radius, density) {
#round radius up then generate points in square with side length = 2*radius
c_radius <- ceiling(radius)
coords <- data.frame(
x = runif((2 * c_radius) ^ 2 * density, -c_radius, c_radius),
y = runif((2 * c_radius) ^ 2 * density, -c_radius, c_radius)
)
return(coords[sqrt(coords$x ^ 2 + coords$y ^ 2) <= radius, ])#filter in circle
}
#Example plot
plot(gen_circle_points(radius = 1,density = 200)) #200 points around origin
points(0,0, col="red",pch=19) #colour origin
#return euclidean distances of points generated by gen_circle_points()
calculate_distances <- function(circle_points) {
return(sqrt(circle_points$x ^ 2 + circle_points$y ^ 2))
}
#find the smallest distance from output of calculate_distances()
calculate_min_value <- function(distances) {
return(min(distances))
}
#Try a range of values
density_values <- c(1:100)
expected_min_from_density <- sapply(density_values, function(density) {
#simulate each density value 1000 times and take an average as estimate for
#expected minimum distance
sapply(1:1000, function(i) {
gen_circle_points(radius=1, density=density) %>%
calculate_distances() %>%
calculate_min_value()
}) %>% mean()
})
results <- data.frame(density_values, expected_min_from_density)
#fit based off exploration
theoretical_fit <- data.frame(density = density_values,
fit = 1 / (sqrt(density_values) * 2))
#plot monte carlo (black) and fit (red dashed)
ggplot(results, aes(x = density_values, y = expected_min_from_density)) +
geom_line() +
geom_line(
data = theoretical_fit,
aes(x = density, y = fit),
color = "red",
linetype = 2
)