Skip to content Skip to sidebar Skip to footer

Generating A Cylindrical Surface With Np.outer

I was able to previously generate and plot a spherical surface using np.outer: u = np.linspace(0, 2*np.pi, 100) v = np.linspace(0, np.pi, 100) x = R * np.outer(np.cos(u), np.sin(v

Solution 1:

Try this:

u = np.linspace(0,  2*np.pi, 100)
h = 5x = R * np.outer(np.ones(np.size(u)), np.cos(u))                                     
y = R * np.outer(np.ones(np.size(u)), np.sin(u))                                     
z = np.outer(np.linspace(0, h, np.size(u)), np.ones(np.size(u)))

Also, check the docs on np.outer if you are unsure what it does. It simply take the outer product of two vectors and produces a matrix.

Solution 2:

Given you example you can create a plot in the following fashion:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

R = 2
u = np.linspace(0,  2*np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = R * np.outer(np.cos(u), np.sin(v))
y = R * np.outer(np.sin(u), np.sin(v))
z = R * np.outer(np.ones(np.size(u)), np.cos(v))

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x,y,z)
fig.show()

This produces the following figure, basically the same as what you show in your edit: enter image description here

The second and third bits of code are actually producing what appears to be a minimal representation of a cylinder. I will skip the code, but both produce the following: enter image description here

It is important to note however, that the second bit of code produces x, y, and z with shapes (100,) while the third bit produces shapes (100,100), but the entries on the second dimension are all just repeats and equal to the values from the second bit of code. For example:

u = np.linspace(0,  2*np.pi, 100)
h = 5
x = R * np.cos(u)                 
y = R * np.sin(u)                 
z = np.linspace(0, h, np.size(u))  

u2 = np.linspace(0,  2*np.pi, 100)
h2 = 5
x2 = R * np.outer(np.ones(np.size(u)), np.cos(u))                                     
y2 = R * np.outer(np.ones(np.size(u)), np.sin(u))                                     
z2 = np.linspace(0, h, np.size(u)) * np.outer(np.ones(np.size(u)), np.ones(np.size(u)))

print(np.all(x2 == x))
True
print(np.all(y2 == y))
True
print(np.all(z2 == z))
True

So it would seem that the problem is that you are not correctly constructing the surface. When I am constructing a surface I do so withnumpy.meshgrid. For your example I would do the following:

u = np.linspace(0,  2*np.pi, 100)
h = 5
R = 2
z = np.linspace(0, h, np.size(u))
us, zs = np.meshgrid(u, z)
xs = R * np.cos(us)
ys = R * np.cos(us)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(xs,ys,zs)

You will get the following figure:

enter image description here

The difference between the two methods rests only in the values of z and zs. You will find that taking the transpose of z is equal to zs so to fix you code just change:

z = np.linspace(0, h, np.size(u)) * np.outer(np.ones(np.size(u)), np.ones(np.size(u)))

to:

z = (np.linspace(0, h, np.size(u)) * np.outer(np.ones(np.size(u)), np.ones(np.size(u)))).T

And all should be well.

Post a Comment for "Generating A Cylindrical Surface With Np.outer"