2013-05-24 9 views
10

साथ विमानों द्वारा वर्णित मैं एक बहुतल है, जो निम्नलिखित असमानता द्वारा वर्णित है साजिश करना चाहते हैं:आर - प्लॉट एक क्षेत्र RGL

3*x+5*y+9*z<=500 
4*x+5*z<=350 
2*y+3*z<=150 

x,y,z>=0 

यह एक रेखीय कार्यक्रम है। उद्देश्य कार्य है:

4*x+3*y+6*z 

पॉलीहेड्रॉन इस कार्यक्रम के लिए व्यवहार्य क्षेत्र है। मैं विमानों के रूप में असमानताओं को साजिश करने में सक्षम हूं, जो पॉलीहेड्रॉन का वर्णन करना चाहिए (ध्यान दें कि यह आरजीएल के साथ मेरा पहला प्रयास है, इसलिए कोड थोड़े गन्दा है। अगर आप इसे सुधारना चाहते हैं, तो कृपया ऐसा करने में संकोच न करें):

# setup 
x <- seq(0,9,length=20)*seq(0,9,length=20) 
y <- x 
t <- x 


f1 <- function(x,y){y=70-0.8*x} 
z1 <- outer(x,y,f1) 

f2 <- function(x,y){500/9-x/3-(5*y)/9} 
z2 <- outer(x,y,f2) 

f3 <- function(x,y){t=50-(2*y)/3} 
z3 <- outer(x,y,f3) 

# plot planes with rgl 
uM = matrix(c(0.72428817, 0.03278469, -0.68134511, 0, 
       -0.6786808, 0.0555667, -0.7267077, 0, 
       0.01567543, 0.99948466, 0.05903265, 0, 
       0, 0, 0, 1), 
      4, 4) 
library(rgl) 
open3d(userMatrix = uM, windowRect = c(0, 0, 400, 400)) 
rgl.pop("lights") 
light3d(diffuse='white',theta=0,phi=20) 
light3d(diffuse="gray10", specular="gray25") 
rgl.light(theta = 0, phi = 0, viewpoint.rel = TRUE, ambient = "#FFFFFF", 
      diffuse = "#FFFFFF", specular = "#FFFFFF", x=30, y=30, z=40) 
rgl.light(theta = 0, phi = 0, viewpoint.rel = TRUE, ambient = "#FFFFFF", 
      diffuse = "#FFFFFF", specular = "#FFFFFF", x=0, y=0, z=0) 
bg3d("white") 
material3d(col="white") 
persp3d(x,y,z3, 
     xlim=c(0,100), ylim=c(0,100), zlim=c(0,100), 
     xlab='x', ylab='y', zlab='z', 
     col='lightblue', 
     ltheta=100, shade=0, ticktype = "simple") 
surface3d(x, y, z2, col='orange', alpha=1) 
surface3d(t, y, z1, col='pink', alpha=1, smooth=TRUE) 

Planes

अब मैं क्षेत्र है कि

x,y,z>=0. 

साथ विमानों द्वारा वर्णित है साजिश करना चाहते हैं लेकिन मैं इसे कैसे करना है पता नहीं है। मैंने इसे ऐसा करने की कोशिश की:

x <- seq(0,9,length=20)*seq(0,9,length=20) 
y <- x 
z <- x 

f4 <- function(x,y,t){ 
    cond1 <- 3*x+5*y+9*z<=500 
    cond2 <- 4*x+5*z<=350 
    cond3 <- 2*y+3*z<=150 

    ifelse(cond1, 3*x+5*y+9*z, 
     ifelse(cond2, 4*x+5*z, 
       ifelse(cond3, 2*y+3*z,0))) 
} 

f4(x,y,z) 
z4 <- outer(x,y,z,f4) # ERROR 

लेकिन यह वह बिंदु है जहां मैं फंस गया हूं। बाहरी() केवल 2 चर के लिए परिभाषित किया गया है, लेकिन मेरे पास तीन है। मैं यहां से कैसे जा सकता हूं?

+0

क्या उत्पादन आप 'outer' से उम्मीद करते हैं? आप इसका उपयोग कैसे करना चाहते हैं - 'surface3d' पर कॉल में? कृपया विस्तार से बताएं। – krlmlr

+0

हाँ, मैं एक समारोह की सतह बनाने के लिए बाहरी का उपयोग करना चाहता था। – cjena

उत्तर

5

आप (क्योंकि अन्य असमानताओं के चौराहों में से कुछ बहुतल के बाहर हैं,: आप उन की जाँच करने के लिए है) एक समय पर विमानों 3 अन्तर्विभाजक द्वारा बहुतल के कोने की गणना कर सकते हैं।

एक बार आपके पास शिखर हो जाने के बाद, आप उन्हें कनेक्ट करने का प्रयास कर सकते हैं। सीमा पर कौन सी पहचान है, आप सेगमेंट के बीच, ले सकते हैं और जांच सकते हैं कि कोई असमानता समानता के रूप में संतुष्ट है या नहीं।

# Write the inequalities as: planes %*% c(x,y,z,1) <= 0 
planes <- matrix(c(
    3, 5, 9, -500, 
    4, 0, 5, -350, 
    0, 2, 3, -150, 
    -1, 0, 0, 0, 
    0, -1, 0, 0, 
    0, 0, -1, 0 
), nc = 4, byrow = TRUE) 

# Compute the vertices 
n <- nrow(planes) 
vertices <- NULL 
for(i in 1:n) 
    for(j in 1:n) 
    for(k in 1:n) 
     if(i < j && j < k) try({ 
     # Intersection of the planes i, j, k 
     vertex <- solve(planes[c(i,j,k),-4], -planes[c(i,j,k),4]) 
     # Check that it is indeed in the polyhedron 
     if(all(planes %*% c(vertex,1) <= 1e-6)) { 
      print(vertex) 
      vertices <- rbind(vertices, vertex) 
     } 
     }) 

# For each pair of points, check if the segment is on the boundary, and draw it 
library(rgl) 
open3d() 
m <- nrow(vertices) 
for(i in 1:m) 
    for(j in 1:m) 
    if(i < j) { 
     # Middle of the segment 
     p <- .5 * vertices[i,] + .5 * vertices[j,] 
     # Check if it is at the intersection of two planes 
     if(sum(abs(planes %*% c(p,1)) < 1e-6) >= 2) 
     segments3d(vertices[c(i,j),]) 
    } 

polyhedron wireframe

+0

यह वास्तव में एक सुंदर समाधान है! आपका बहुत बहुत धन्यवाद। – cjena

संबंधित मुद्दे