I offer a TikZ solution. I think that for this figure it's easier to draw in 2d, so I did it this way.
I'm not posting the maths, because it will be tedious without MathJax or something similar. But the key here is to find the envelope of the family of ellipses (circles in 3d) that are obtained cutting the paraboloid by horizontal planes.
Making the drawing in this way all the calculations are exact (as far as TikZ goes) and all the curves are TikZ path
s, I'm not using plot
(see the update 1 below).
The code:
\documentclass[tikz,border=2mm]{standalone}
\tikzset
{%
axes/.style={thick,-latex},
paraboloid front/.style={right color=red!80,left color=white,fill opacity=0.6},
paraboloid back/.style={left color=red!80,fill opacity=0.6},
plane/.style={blue,fill=blue!50,fill opacity=0.8},
}
\begin{document}
\begin{tikzpicture}[line cap=round,line join=round]
% axes x,y
\draw[axes] (30:4) -- (210:4) node [left] {$x$};
\draw[axes] (150:4) -- (330:4) node [right] {$y$};
\draw[thick] (0,0) -- (0,2.25);
% paraboloid, bottom, back
\draw[paraboloid back] ({0.25*sqrt(51)},2) parabola bend (0,-0.125) ({-0.25*sqrt(51)},2)
arc ({180+atan(1/sqrt(17))}:{-atan(1/sqrt(17))}:{0.75*sqrt(6)} and {0.75*sqrt(2)});
% paraboloid, bottom, front
\draw[paraboloid front] ({0.25*sqrt(51)},2) parabola bend (0,-0.125) ({-0.25*sqrt(51)},2)
arc ({180+atan(1/sqrt(17))}:{360-atan(1/sqrt(17))}:{0.75*sqrt(6)} and {0.75*sqrt(2)});
% horizontal plane
\draw[plane] (210:3) ++ (0,2.25) ++ (330:3.5) --++ (30:6) --++ (150:7) --++ (210:6) -- cycle;
% paraboloid, top, back
\draw[paraboloid back] ({0.25*sqrt(93)},3.75) parabola bend (0,-0.125) ({0.25*sqrt(51)},2)
arc ({-atan(1/sqrt(17))}:{180+atan(1/sqrt(17))}:{0.75*sqrt(6)} and {0.75*sqrt(2)})
parabola bend (0,-0.125) ({-0.25*sqrt(93)},3.75)
arc ({180+atan(1/sqrt(31))}:{-atan(1/sqrt(31))}:{sqrt(6)} and {sqrt(2)});
% axis z
\draw[axes] (0,2.25) -- (0,6) node [above] {$z$};
% paraboloid, top, front
\draw[paraboloid front] ({0.25*sqrt(93)},3.75) parabola bend (0,-0.125) ({0.25*sqrt(51)},2)
arc ({-atan(1/sqrt(17))}:{-180+atan(1/sqrt(17))}:{0.75*sqrt(6)} and {0.75*sqrt(2)})
parabola bend (0,-0.125) ({-0.25*sqrt(93)},3.75)
arc ({180+atan(1/sqrt(31))}:{360-atan(1/sqrt(31))}:{sqrt(6)} and {sqrt(2)});
\end{tikzpicture}
\end{document}
Update 1: I didn't it see at first, but the above code doesn't get the visibility right. This is because the parabola bend
path draws the parabola to the vertex despite the last point specified is before this vertex. So I don't think parabola
is the right way to do it after all. I could do a clip, but it will not be easy to find the appropriate path. Perhaps spath3
library will do the trick, I'll take a look at it in the future (see update 2 below).
Meanwhile, the same drawing with plot
s:
\documentclass[tikz,border=2mm]{standalone}
\tikzset
{%
axes/.style={thick,-latex},
paraboloid front/.style={right color=red!80,left color=white,fill opacity=0.6},
paraboloid back/.style={left color=red!80,fill opacity=0.6},
plane/.style={blue,fill=blue!50,fill opacity=0.8},
}
\newcommand{\myparabola}[2]{-- plot [domain={#1}:{#2},samples=40] (\x,2/3*\x*\x-0.125)}
\begin{document}
\begin{tikzpicture}[line cap=round,line join=round]
% dimensions
\pgfmathsetmacro\angTC{atan(1/sqrt(31))} % angles, top circle
\pgfmathsetmacro\angBC{atan(1/sqrt(17))} % angles, bottom circle
\pgfmathsetmacro\TTx {0.25*sqrt(93)} % tangent point x, top circle
\pgfmathsetmacro\TBx {0.25*sqrt(51)} % tangent point x, bottom circle
% axes x,y
\draw[axes] (30:4) -- (210:4) node [left] {$x$};
\draw[axes] (150:4) -- (330:4) node [right] {$y$};
\draw[thick] (0,0) -- (0,2.25);
% paraboloid, bottom, back
\draw[paraboloid back] (-\TBx,2)
arc (180+\angBC:-\angBC:{0.75*sqrt(6)} and {0.75*sqrt(2)}) \myparabola{\TBx}{-\TBx};
% paraboloid, bottom, front
\draw[paraboloid front] (-\TBx,2)
arc (180+\angBC:360-\angBC:{0.75*sqrt(6)} and {0.75*sqrt(2)}) \myparabola{\TBx}{-\TBx};
% horizontal plane
\draw[plane] (210:3) ++ (0,2.25) ++ (330:3.5) --++ (30:6) --++ (150:7) --++ (210:6) -- cycle;
% paraboloid, top, back
\draw[paraboloid back] (\TBx,2)
arc (-\angBC:180+\angBC:{0.75*sqrt(6)} and {0.75*sqrt(2)}) \myparabola{-\TBx}{-\TTx}
arc (180+\angTC:-\angTC:{sqrt(6)} and {sqrt(2)}) \myparabola{\TTx}{\TBx};
% axis z
\draw[axes] (0,2.25) -- (0,6) node [above] {$z$};
% paraboloid, top, front
\draw[paraboloid front] (\TBx,2)
arc (-\angBC:-180+\angBC:{0.75*sqrt(6)} and {0.75*sqrt(2)}) \myparabola{-\TBx}{-\TTx}
arc (180+\angTC:360-\angBC:{sqrt(6)} and {sqrt(2)}) \myparabola{\TTx}{\TBx};
\end{tikzpicture}
\end{document}
And the drawing (with the right visibility):

Update 2: This is my first attempt at Andrew Stacey's spath3
library. I'm don't know if I know what I'm doing, so use it at your own risk!! (It needs TL2021, I don't know about other LaTeX distros).
I'm following Andrew's excellent answer here (the second one) step by step. In fact the comments about spath3
are all his (I changed a word or two). And , of course, the errors are all mine.
The new code:
\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{intersections,spath3}
\tikzset
{%
axes/.style={thick,-latex},
paraboloid front/.style={right color=red!80,left color=white,fill opacity=0.6},
paraboloid back/.style={left color=red!80,fill opacity=0.6},
plane/.style={blue,fill=blue!50,fill opacity=0.8},
}
\begin{document}
\begin{tikzpicture}[line cap=round,line join=round]
% creating the paths: parabola, two ellipses and two lines (for cutting)
\path[spath/save=P] ({-0.25*sqrt(93)},3.75) parabola bend (0,-0.125) ({0.25*sqrt(93)},3.75);
\path[spath/save=EB] (0,2.25) ellipse ({0.75*sqrt(6)} and {0.75*sqrt(2)}); % ellipse, bottom
\path[spath/save=ET] (0,4) ellipse ({sqrt(6)} and {sqrt(2)}); % ellipse, top
\path[spath/save=LB] (-3,2) -- (3,2); % line, bottom
\path[spath/save=LT] (-3,3.75) -- (3,3.75); % line, top
% spath3 operations
\tikzset
{% Ellipses have an "empty" component at the start which
% moves from the centre to the rim; it can be irritating
% when trying to count components later so this removes
% any empty components
spath/remove empty components={EB},
spath/remove empty components={ET},
% Now split each path where it intersects with the lines
spath/split at intersections={P}{LB},
spath/split at intersections={EB}{LB},
spath/split at intersections={ET}{LT},
% Each path is now a collection of components; to work
% with them individually we split them into a list of
% separate paths which is stored in a macro
spath/get components of={P}\Pcpts,
spath/get components of={EB}\Bcpts,
spath/get components of={ET}\Tcpts,
}
% axes x,y
\draw[axes] (30:4) -- (210:4) node [left] {$x$};
\draw[axes] (150:4) -- (330:4) node [right] {$y$};
\draw[thick] (0,0) -- (0,2.25);
% paraboloid, bottom, back
\draw[paraboloid back,
spath/use=\getComponentOf\Pcpts{2},
spath/use={\getComponentOf\Bcpts{2},weld},
];
% paraboloid, bottom, front
\draw[paraboloid front,
spath/use=\getComponentOf\Pcpts{2},
spath/use={\getComponentOf\Bcpts{1},reverse,weld}
];
% horizontal plane
\draw[plane] (210:3) ++ (0,2.25) ++ (330:3.5) --++ (30:6) --++ (150:7) --++ (210:6) -- cycle;
% paraboloid, top, back
\draw[paraboloid back,
spath/use=\getComponentOf\Pcpts{1},
spath/use={\getComponentOf\Bcpts{2},reverse,weld},
spath/use={\getComponentOf\Pcpts{3},weld},
spath/use={\getComponentOf\Tcpts{2},weld}
];
% axis z
\draw[axes] (0,2.25) -- (0,6) node [above] {$z$};
% paraboloid, top, front
\draw[paraboloid front,
spath/use=\getComponentOf\Pcpts{1},
spath/use={\getComponentOf\Bcpts{1},weld},
spath/use={\getComponentOf\Pcpts{3},weld},
spath/use={\getComponentOf\Tcpts{1},reverse,weld}
];
\end{tikzpicture}
\end{document}
The output is the same as above.