在 R 中直接绘制数学函数
Directly Plotting Mathematical Functions in R
我正在使用 R 编程语言。
在我之前提出的问题 ( and ) 中,我学会了如何绘制数学函数,方法是首先评估不同点的数学函数,然后在 3D 网格上绘制这些点,最后“在这些点上插值”一个 3D 表面:
# set seed for reproducibility
#load libraries
set.seed(123)
library(dplyr)
library(plotly)
#create more data
n <- 50
my_grid <- expand.grid(i1 = 1:n, i2 = 1:n)
my_grid$final_value = with(my_grid, sin(i1) + cos(i2) )
#make plot
plot_ly(data = my_grid, x=~i1, y=~i2, z=~final_value, type='mesh3d', intensity = ~final_value, colors = colorRamp(c("blue", "grey", "red")))
我正在尝试使用相同的方法绘制以下函数 (https://en.wikipedia.org/w/index.php?title=Test_functions_for_optimization&oldid=1030693803, https://en.wikipedia.org/w/index.php?title=Test_functions_for_optimization&oldid=1030693803#/media/File:ConstrTestFunc03.png) :
我先定义函数:
my_function <- function(x,y) {
final_value = (1 - x)^2 + 100*((y - x^2)^2)
}
然后,我定义了“网格”:
input_1 <- seq(-1.5, 1.5,0.1)
input_2 <- seq(-1.5, 1.5,0.1)
my_grid <- data.frame(input_1, input_2)
my_grid$final_value = (1 - input_1)^2 + 100*((input_2 - input_1^2)^2)
然后,我尝试绘制这个函数:
x <- my_grid$input_1
y <- my_grid$input_2
z <- matrix(my_grid$final_value, nrow = length(x), ncol = length(y)) # proper matrix & dimensions
plot_ly(x = x, y = y, z = z) %>% add_surface()
我的问题:最终结果看起来与维基百科页面的结果不相似:
有人可以告诉我我做错了什么吗?有更简单的方法吗?
谢谢!
你的问题是你实际上并没有创建一个网格,你正在创建一个 x, y 点相等的向量并且 运行 将你的公式放在上面,所以你的矩阵是错误的(每一列都会由于重复而相同)。最简单的修复是 运行 outer
在你的函数上评估它在每一对输入 1 和输入 2:
z <- outer(input_1, input_2, my_function)
plot_ly(x = input_1, y = input_2, z = z) %>% add_surface()
我正在使用 R 编程语言。
在我之前提出的问题 (
# set seed for reproducibility
#load libraries
set.seed(123)
library(dplyr)
library(plotly)
#create more data
n <- 50
my_grid <- expand.grid(i1 = 1:n, i2 = 1:n)
my_grid$final_value = with(my_grid, sin(i1) + cos(i2) )
#make plot
plot_ly(data = my_grid, x=~i1, y=~i2, z=~final_value, type='mesh3d', intensity = ~final_value, colors = colorRamp(c("blue", "grey", "red")))
我正在尝试使用相同的方法绘制以下函数 (https://en.wikipedia.org/w/index.php?title=Test_functions_for_optimization&oldid=1030693803, https://en.wikipedia.org/w/index.php?title=Test_functions_for_optimization&oldid=1030693803#/media/File:ConstrTestFunc03.png) :
我先定义函数:
my_function <- function(x,y) {
final_value = (1 - x)^2 + 100*((y - x^2)^2)
}
然后,我定义了“网格”:
input_1 <- seq(-1.5, 1.5,0.1)
input_2 <- seq(-1.5, 1.5,0.1)
my_grid <- data.frame(input_1, input_2)
my_grid$final_value = (1 - input_1)^2 + 100*((input_2 - input_1^2)^2)
然后,我尝试绘制这个函数:
x <- my_grid$input_1
y <- my_grid$input_2
z <- matrix(my_grid$final_value, nrow = length(x), ncol = length(y)) # proper matrix & dimensions
plot_ly(x = x, y = y, z = z) %>% add_surface()
我的问题:最终结果看起来与维基百科页面的结果不相似:
有人可以告诉我我做错了什么吗?有更简单的方法吗?
谢谢!
你的问题是你实际上并没有创建一个网格,你正在创建一个 x, y 点相等的向量并且 运行 将你的公式放在上面,所以你的矩阵是错误的(每一列都会由于重复而相同)。最简单的修复是 运行 outer
在你的函数上评估它在每一对输入 1 和输入 2:
z <- outer(input_1, input_2, my_function)
plot_ly(x = input_1, y = input_2, z = z) %>% add_surface()