如何从两个变量依赖关系的值创建一个3D矩阵 - 动能

问题描述 投票:0回答:2

我正在尝试创建一个3D矩阵,其中包含与质量和速度相关的x,y值,以及与两者之间的能量相关的z值。

使用E = 1/2 * m * v ^ 2

但是,我得到的围绕3D矩阵的所有帖子和帮助页面都是一组固定的行和列,其中包含相关的Z值。

我试图使用Plotly绘制一个3d表面,主要显示质量,速度与能量的关系。

这是我最初的3个变量:

m <- seq(1,100,0.5)
v <- seq(1,10,0.05)
E <- .5 * m * v^2

mat <- matrix(data=E, nrow=m, ncol=v)
plot_ly(z=~mat) %>% add_surface()

然而,当我创建一个矩阵并尝试绘制它。这是行不通的。

我也尝试了这个并且它是绘图,但不正确:

df <- data.frame(m=m, v=v, E=E)
plot_ly(z=~data.matrix(df)) %>% add_surface()

有人可以帮我这个吗?谢谢

我基本上寻找一个看起来像这样的矩阵:

      [1,  ] [2,] # mass
[,0.5] E1   E2 # energy
[,1  ] E3   E4 # values
#velocity

我正在寻找的最终目标将是一个表面3D图,其中x是质量,y是速度,Z是计算的能量。它应显示趋于平滑的表面,质量和速度都会增加。

r matrix physics
2个回答
1
投票

上面的代码实际上是在感兴趣的空间内计算单行。 E的第一个元素对应于m = 1且v = 1,E的第二个元素对应于m = 1.5和v = 1.05,但是对于m = 1和v = 1.05或其他组合,您不计算E的任何位置绘图功能需要显示一个表面。

相反,您应该使用像expand.grid这样的函数来计算m和v值的网格,然后使用或者可能使用outer函数来计算矩阵。


1
投票

就像Greg Snow提到的那样但是带有代码。

有两种方法可以在图中完成,一种是使用曲面图,另一种是使用mesh3d:

mesh3d:

library(plotly)

制作m和v值的网格(我使它有点稀疏):

z <- expand.grid(m = seq(1,100,1),
                 v = seq(1,10,0.1))

计算能量

z$E <- with(z, .5 * m * v^2)

绘制一个mash3d

plot_ly(data = z, x = ~m, y = ~v, z = ~E, type = 'mesh3d') 

enter image description here

曲面图接受一个值矩阵,因此需要重新排列网格:

library(tidyverse)
z <- expand.grid(m = seq(1,100,1),
                 v = seq(1,10,0.1))   

 z %>%
      mutate(E = .5 * m * v^2) %>%
      spread(key = v, value = E) %>%
      as.matrix() -> mat

在这里,您需要进行手动轴标记,因为它将假设网格为1:n,其中n是行数和列数

plot_ly() %>%
  add_surface(z = mat, x = unique(z$m), y = unique(z$v)) %>%
  layout(scene = list(xaxis = list(title = "m"),
                      yaxis = list(title = "v"),
                      zaxis = list(title = "E")))

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.