A solid of revolution of a function y = x**2
around the y-axis can be plotted using the code below:
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d
from matplotlib import cm
np.seterr(divide='ignore', invalid='ignore')
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ll, ul = 0, 1
u = np.linspace(ll, ul, 60)
v = np.linspace(0, 2*np.pi, 60)
U, V = np.meshgrid(u, v)
Z = U
X = np.sqrt(Z)*np.cos(V)
Y = np.sqrt(Z)*np.sin(V)
ax.set_xlabel('Y axis')
ax.set_ylabel('X axis')
ax.set_zlabel('Z axis')
ax.plot_surface(X, Y, Z, cmap=plt.cm.YlGnBu_r)
plt.show()
This code just plots the solid of revolution of the function x = sqrt(y)
which is the inverse of y = x**2
. But how to draw the solid of revolution for a function as:
y = x**5 + x**4 + x**3 + x**2 + x
?
The mapping from (U,V)
parameter space to (X,Y,Z)
coordinates can be very flexible.
Often U
is chosen to be something like np.linspace(ll, ul, 100)
and is taken to be equal to Y
(if y
is the axis of rotation). But you don't have to use U
that way.
Instead U
could represent the radius:
ll, ul = 0, 1
u = np.linspace(ll, ul, 100)
v = np.linspace(0, 2*np.pi, 60)
U, V = np.meshgrid(u, v)
and then X
, Y
, Z
can be defined in terms of the radius, U
:
Y = U**5 + U**4 + U**3 + U**2 + U
X = U*np.cos(V)
Z = U*np.sin(V)
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d
from matplotlib import cm
np.seterr(divide='ignore', invalid='ignore')
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ll, ul = 0, 1
u = np.linspace(ll, ul, 100)
v = np.linspace(0, 2*np.pi, 60)
U, V = np.meshgrid(u, v)
Y = U**5 + U**4 + U**3 + U**2 + U
X = U*np.cos(V)
Z = U*np.sin(V)
ax.set_xlabel('Y axis')
ax.set_ylabel('X axis')
ax.set_zlabel('Z axis')
ax.plot_surface(X, Y, Z, cmap=plt.cm.YlGnBu_r)
plt.show()