Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I have a little problem and didn't succeed trying to solve it on my own. Situation is, I need a visualization of the function $s - 3\cdot s\cdot q + q$ as a region on p == 0 if function's value is less than zero, a region on p == 1 if the function > 0, and a contour if the function equals to zero.

What I've done:

RegionPlot3D[(s - 3q*s + q > 0 && p == 0) || (s - 3q*s + q <= 0  && p == 1), 
                      {q, 0, 1}, {s, 0, 1}, {p, 0, 1}, AxesLabel -> Automatic]

which give me this:

but what I need to add is a contour $s - 3\cdot s\cdot q + q = 0$ to this plot, but also remain able to intersect this set with others.

The contour is simple:

ContourPlot3D[s - 3 q*s + q == 0, {p, 0, 1}, {q, 0, 1}, {s, 0, 1}]

I've tried to use a little hint with inequality range

RegionPlot3D[(s - 3 q s + q > 0 && p == 0) || (s - 3 q s + q <= 0 && 
p == 1) || Abs[s - 3 q s + q] < 0.01, {q, 0, 1}, {s, 0, 1}, {p, 
0, 1}, AxesLabel -> Automatic, PlotPoint -> 100]

This is sufficiently accurate, but produces a 3d set, instead of a surface.

Any ideas how to reach my goal?

P.S. the best would be a solution to such kind of problems in general, because, sometimes the contour equation can be not that simple.

share|improve this question
add comment

2 Answers

up vote 5 down vote accepted

Solution using Show needs to rearrange the order of ranges in ContourPlot3D, e.g. :

Show[RegionPlot3D[(s - 3 q*s + q > 0 && p == 0) ||
                     (s - 3 q*s + q <= 0 && p == 1), 
                  {q, 0, 1}, {s, 0, 1}, {p, 0, 1}, AxesLabel -> Automatic], 
     ContourPlot3D[s - 3 q*s + q == 0, {q, 0, 1}, {s, 0, 1}, {p, 0, 1}]]

enter image description here

Edit

Here is another solution without Show, using only Plot3D and HeavisideTheta function :

Plot3D[ HeavisideTheta[-s + 3 q*s - q], {q, 0, 1}, {s, 0, 1}, 
        Exclusions -> None, PlotPoints -> 100, PerformanceGoal -> "Quality", 
        ColorFunction -> Function[{x, y, z}, RGBColor[x, y, 1]], 
        MeshFunctions -> {#1 &, #2 &, #3 &}, BoxRatios -> {1, 1, 2/3}]

enter image description here

share|improve this answer
    
Hi, Artes! Thanks a lot for this answer, it's very helpful. Although, would I be able to intersect the contour part with other bool sets? I mean, what if I add another condition, using other equation, would it intersect the contour part with it ass well? –  Sergey Aganezov jr Mar 19 '12 at 4:23
    
@SergeyAganezovjr You can always use Plot3D[{f1[x,y],f2[x,y],...,fn[x,y]},{x,xmin,xmax},{y,ymin,ymax},options] to plot n functions. Instead of HeavisideTheta you can use e.g. UnitStep. The latter may depend on more variables. –  Artes Mar 19 '12 at 11:24
add comment

I am not sure I understand your question. What is a "3D set" and a "3D surface"?

If you need to combine two 3D graphics, use Show[graphic1, graphic2]. Your surface can be plotted using Plot3D as well, but the quality of the discontinuous part will not be excellent:

Plot3D[Boole[s - 3 q*s + q < 0], {q, 0, 1}, {s, 0, 1}, 
 ExclusionsStyle -> Automatic, BoxRatios -> 1]

Mathematica graphics

Using Show to combine two pieces:

Show[
 ContourPlot3D[s - 3 q*s + q == 0, {q, 0.1, 1}, {s, 0.1, 1}, {p, 0, 1}],
 Plot3D[Boole[s - 3 q*s + q < 0], {q, 0, 1}, {s, 0, 1}]
 ]

Mathematica graphics

share|improve this answer
    
Congrats with your 10k. I hadn't noticed before. –  Sjoerd C. de Vries Mar 18 '12 at 21:13
    
Well, the difference is that 3D set has a range of s values with constant q, while surface doesn't. –  Sergey Aganezov jr Mar 19 '12 at 4:27
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.