我们有一个半径为1的球形地球,中心1,1。 地球表面随机有斑点。 我们正在生成独立的Unif(-1,1)随机变量X,Y,Z,它们将是随机点的坐标。 将(X,Y,Z)除以√{X2 + Y2 + Z2},得到距地球中心1m的点。 **
编写一个函数sample3d,它生成一个随机向量(X,Y,Z)样本,每个向量都是地球表面均匀分布的一个点。通过命令sample3d(n)调用此函数应该生成一个n×3数组,其中每一行都是一个向量(X,Y,Z)。
我已将其设置为**但无法创建sample3d,任何帮助都将不胜感激!
答案 0 :(得分:0)
我很乐意尝试提出一些有用的东西,这就是我所得到的:
首先,我定义了一个函数norm.2
,它计算了一个向量的两个范数:
norm.2 <- function(x, na.rm){
if(length(dim(x)) != 0){
v1.logical <- ifelse(missing(na.rm), FALSE, TRUE)
return(sqrt(colSums(x^2, na.rm = v1.logical)))
}
if(length(dim(x)) == 0){
v1.logical <- ifelse(missing(na.rm), FALSE, TRUE)
return(sqrt(sum(x^2, na.rm = v1.logical)))
}
}
然后,我继续定义一个函数sample3d
,它将在3维空间中给出n个点,所有这些点都是1,即2球:
sample3d <- function(n, Boundary){
M <- ifelse(missing(Boundary), sqrt(2e+300), Boundary)
x1 <- runif(n, min = -M, max = M)
x2 <- runif(n, min = -M, max = M)
x3 <- runif(n, min = -M, max = M)
x <- t(cbind(x1,x2,x3))
p <- t(t(x)/norm.2(x))
df <- data.frame(t(p), stringsAsFactors = FALSE)
return(df)
}
以下是结果示例:
> head(sample3d(10000))
x1 x2 x3
1 0.321159709 -0.5014622 -0.8033630
2 0.488181408 0.5547003 -0.6737852
3 -0.661576495 -0.4592729 0.5927773
4 -0.333447393 0.9331249 -0.1345016
5 -0.009070263 0.4267690 0.9043152
6 -0.375122328 -0.2393661 -0.8955373
现在,使用plotly
包,我们可以将其可视化:
library(plotly)
dat <- sample3d(100000)
p <- plot_ly(dat, x = ~x1, y = ~x2, z = ~x3, color = norm.2(t(dat)), colors = c('#BF382A', '#0C4B8E')) %>%
add_markers() %>%
layout(scene = list(xaxis = list(title = 'X'),
yaxis = list(title = 'Y'),
zaxis = list(title = 'Z')))