Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ploting solid of revolution in Python 3 (matplotlib maybe)

Greetings the problem:

R is a region in the xy plane bounded by the parabola y=x^2+1 and line y=x+3. A solid of revolution is formed by rotating R around the x axis. I need to plot parabola and line in 2D and solid revolution 3D, How do it? I have installed anaconda.

like image 335
Robby Avatar asked Apr 07 '16 01:04

Robby


1 Answers

You could use plot_surface:

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')

u = np.linspace(-1, 2, 60)
v = np.linspace(0, 2*np.pi, 60)
U, V = np.meshgrid(u, v)

X = U
Y1 = (U**2 + 1)*np.cos(V)
Z1 = (U**2 + 1)*np.sin(V)

Y2 = (U + 3)*np.cos(V)
Z2 = (U + 3)*np.sin(V)

ax.plot_surface(X, Y1, Z1, alpha=0.3, color='red', rstride=6, cstride=12)
ax.plot_surface(X, Y2, Z2, alpha=0.3, color='blue', rstride=6, cstride=12)
plt.show()

enter image description here

To plot a surface using plot_surface you begin by identifying two 1-dimensional parameters, u and v:

u = np.linspace(-1, 2, 60)
v = np.linspace(0, 2*np.pi, 60)

such that x, y, z are functions of the parameters u and v:

x = x(u, v)
y = y(u, v)
z = z(u, v)

The thing to notice about ax.plot_surface is that its first three arguments must be 2D arrays. So we use np.meshgrid to create coordinate matrices (U and V) out of coordinate vectors (u and v), and define 2D arrays X, Y, Z to be functions of U and V:

X = U
Y1 = (U**2 + 1)*np.cos(V)
Z1 = (U**2 + 1)*np.sin(V)

For each location on the coordinate matrices U and V, there is a corresponding value for X and Y and Z. This creates a map from 2-dimensional uv-space to 3-dimensional xyz-space. For every rectangle in uv-space there is a face on our surface in xyz-space. The curved surface drawn by plot_surface is composed of these flat faces.

like image 72
unutbu Avatar answered Oct 13 '22 05:10

unutbu