R: 如何 "fill" 带点的网格

R: How to "fill" a grid with points

我正在使用 R 编程语言。

假设我有以下功能:

# function: defined the first way

my_function_a <- function(x) {
  
  final_value = sin(x[1]) + cos(x[2]) + x[3] 
  
 
}

    #function : defined the second way
    
    my_function_b <- function(input_1, input_2, input_3) {
    
    final_value = sin(input_1) + cos(input_2) + input_3 
     
    }

目标:我想在不同的点评估这个函数,这样我就可以制作一个 3 维图。

第一次尝试:

我尝试了一种非常基本的方法来在一系列固定点(使用网格)评估此函数:

library(plotly)
library(dplyr)

#create grid and evaluate function
input_1 <- seq(0,100,1)
input_2 <- seq(0,100,1)
input_3 <- seq(0,100,1)


my_grid <- data.frame(input_1, input_2, input_3)
my_grid$final_value = sin(input_1) + cos(input_2) + input_3 

然后我尝试绘制这个函数:

#plot function

plot_ly() %>% 
        add_trace(data = my_grid,  x=my_grid$input_1, y=my_grid$input_2, z=my_grid$input_3, type='mesh3d') %>%
        add_surface(
                z = my_grid %>% as.matrix(),
                surfacecolor = my_grid,
                cauto=F,
                cmax=max(my_grid$final_value),
                cmin=min(my_grid$final_value)
        )

这个函数的情节看似“简单”:

然后我意识到这是因为我只在“均匀间隔”的点上评估了这个函数,例如:

 head(my_grid)
  input_1 input_2 input_3 final_value
1       0       0       0    1.000000
2       1       1       1    2.381773
3       2       2       2    2.493151
4       3       3       3    2.151128
5       4       4       4    2.589554
6       5       5       5    4.324738

例如,在上面的数据框中,您不会找到 (input_1 = 5, input_2 = 2, input_3 =11)

等点的组合

第二次尝试

接下来,我尝试添加一些“随机性”来决定在哪些点评估函数:

#create grid and evaluate function
input_1 <- rnorm(100,100,20)
input_2 <- rnorm(100,100,20)
input_3 <- rnorm(100,100,20)


my_grid <- data.frame(input_1, input_2, input_3)
my_grid$final_value = sin(input_1) + cos(input_2) + input_3 


#create plot
plot_ly() %>% 
        add_trace(data = my_grid,  x=my_grid$input_1, y=my_grid$input_2, z=my_grid$input_3, type='mesh3d') %>%
        add_surface(
                z = my_grid %>% as.matrix(),
                surfacecolor = my_grid,
                cauto=F,
                cmax=max(my_grid$final_value),
                cmin=min(my_grid$final_value)
        )

该图现在似乎包含更高级别的复杂性,如用于创建该图的数据所示:

head(my_grid)
    input_1   input_2   input_3 final_value
1  82.09936  65.48251 103.26060   102.78460
2  81.94343 118.69431  76.51834    77.55103
3  76.90372 115.58958 123.96159   124.16298
4 128.52814  85.52632  69.02835    68.53927
5  96.89466 121.53117 124.39381   124.32069
6  97.59012 126.80997  87.54789    87.76038

问题:是否有任何“更好”的方法来用点填充此网格,以便您可以“更好看,更真实”的情节?例如,是否可以创建这样的网格

#iterate input_1 from 1-100 AND fix input_2 and input_3 as constant
input_1 = 1, input_2 = 1, input_3 = 1 ; input_1 = 2, input_2 = 1, input_3 = 1 ; etc; input_1 = 100, input_2 = 1, input_3 = 1

#iterate input_2 from 1-100 AND fix input_1 and input_3 as constant 
input_1 = 1, input_2 = 2, input_3 = 1; input_1 = 1, input_2 = 3, input_3 = 1 , etc

是否可以使用这种网格计算“my_function_a”或“my_function_b”?

谢谢

如果我没理解错的话,问题是my_grid填写不完整造成的。

head(my_grid)
  input_1 input_2 input_3 final_value
1       0       0       0    1.000000
2       1       1       1    2.381773
3       2       2       2    2.493151
4       3       3       3    2.151128
5       4       4       4    2.589554
6       5       5       5    4.324738

同时推进所有三个输入变量,从而在三维空间中创建一条线 space。

也许,您打算使用 expand.grid() 创建三维网格:

n <- 3
my_grid <- expand.grid(i1 = 1:n, i2 = 1:n, i3 = 1:n)
my_grid$final_value = with(my_grid, sin(i1) + cos(i2) + i3)
head(my_grid)
  i1 i2 i3 final_value
1  1  1  1   2.3817733
2  2  1  1   2.4495997
3  3  1  1   1.6814223
4  1  2  1   1.4253241
5  2  2  1   1.4931506
6  3  2  1   0.7249732

现在,剧情

library(plotly)
plot_ly() %>% 
  add_trace(data = my_grid,  x=my_grid$i1, y=my_grid$i2, z=my_grid$i3, type='mesh3d') %>%
  add_surface(
    z = my_grid %>% as.matrix(),
    surfacecolor = my_grid,
    cauto=F,
    cmax=max(my_grid$final_value),
    cmin=min(my_grid$final_value)
  )

变成