3
$\begingroup$

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.

$\endgroup$
0

2 Answers 2

5
$\begingroup$

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

$\endgroup$
2
  • $\begingroup$ 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? $\endgroup$ Mar 19, 2012 at 4:23
  • $\begingroup$ @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. $\endgroup$
    – Artes
    Mar 19, 2012 at 11:24
1
$\begingroup$

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

$\endgroup$
2
  • $\begingroup$ Congrats with your 10k. I hadn't noticed before. $\endgroup$ Mar 18, 2012 at 21:13
  • $\begingroup$ Well, the difference is that 3D set has a range of s values with constant q, while surface doesn't. $\endgroup$ Mar 19, 2012 at 4:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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