2017-01-15 3 views
3

У меня есть два вектора x и y одинаковой длины;Создание 3D-графика в R

x <- c(12,14,14,15,16,18) 
y <- c(25,36,32,30,36,42) 

и функция е

f <- function(a,b) { 
sum((y - a - b*x)^2) 
} 

Если б два вектора таким образом, что:

a <- seq(from=-5,to=5, by=.1) 
b <- seq(from=-2.5, to=7.5, by=.1) 

мне нужно оценить f для каждого и каждой возможной пары a и b так что я мог бы сделать 3D-график для a, b, and z=f(a,b).

Я нашел outer функция, но это не работает. Можете ли вы предложить мне альтернативу, чтобы я мог достичь желаемых результатов?

Благодаря

ответ

2

В двух разделенных частей, вы можете использовать plot3D пакет:

library(plot3D) 

(1) вычислить z = f (a, b) для каждого a, b

### Compute z = f(a, b) 
a <- seq(from=-5,to=5, by=.1) 
b <- seq(from=-2.5, to=7.5, by=.1) 

X <- c(12,14,14,15,16,18) 
Y <- c(25,36,32,30,36,42) 

f <- function(a,b) { 
    sum((Y - a - b*X)^2) 
} 

m <- expand.grid(a, b) 
z <- mapply(f, m$Var1, m$Var2) 

(2) Объявить сетку и сюжет результат на него:

### Plot3D 
M <- mesh(a, b) 
x.plot <- M$x 
y.plot <- M$y 

z.plot <- matrix(z, nrow=nrow(x)) 

persp3D(x.plot, y.plot, z.plot) 

И это порождает:

persp3D plot

Результаты должны быть перепроверить хотя

1
xy = expand.grid(a, b) 
#  z = f(xy[,1], xy[,2]) 
mapply(f, xy$Var1, xy$Var2) # see comment below 

Первый делает декартово произведение a и b:

a = 1:3 
b = 4:5 
expand.grid(a, b) 
# prints (I'm not sure about the row order) 
# 1 4 
# 1 5 
# 2 4 
# 2 5 
# 3 4 
# 3 5 
+1

Это не работает, как это. Вам нужно применить функцию к 'xy', т. Е.' Mapply (f, xy $ Var1, xy $ Var2) ' – Sotos

+0

, вы правы, я изменил код, как было предложено –

1

Вот очень простое решение, используя curve3d от emdbook пакет,

curve3d(f(x,y), from=c(-5,-2.5), to=c(5,7.5), sys3d="persp", theta=90, phi=45) 

дает

curve3dpersp