Python: gráfico 3D de una botella de Klein

Así que estoy aprendiendo python y actualmente estoy haciendo planos 3D de cosas. Para mantener las cosas interesantes, quiero hacer una ttwig de Klein Bottle , pero de alguna manera no funciona en absoluto. Y probé dos parametrizaciones de la superficie (una en Wolfram y otra en un sitio web aleatorio) que dieron una figura de torus-ish.

Así que me preguntaba si tal vez mi código es incorrecto. ¿Podría alguien echar un vistazo y decirme si lo estoy haciendo bien (y si conoce la parametrización de una botella de Klein, entonces eso también es bienvenido: P)

from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from matplotlib import cm import numpy as np def surf(u, v): X = (3+(1+np.sin(v)) + 2*(1 - np.cos(v)/2)*np.cos(u))*np.cos(v) Y = (4+2*(1 - np.cos(v)/2) * np.cos(u))*np.sin(v) Z = -2*(1-np.cos(v)/2)*np.sin(u) return X,Y,Z ux, vx = np.meshgrid(np.linspace(0, 2*np.pi, 20), np.linspace(0, 2*np.pi, 20)) x,y,z = surf(ux, vx) fig = plt.figure() ax = fig.gca(projection="3d") plot = ax.plot_surface(x,y,z, rstride=1, cstride=1, cmap=cm.jet, linewidth=0, antialiased=False) plt.show() 

Su código Python tiene la forma correcta, pero parece que puede haber algún error en la parametrización. Aquí está la botella de Klein producida por una parametrización diferente :

 import mpl_toolkits.mplot3d.axes3d as axes3d import matplotlib.pyplot as plt import numpy as np cos = np.cos sin = np.sin sqrt = np.sqrt pi = np.pi def surf(u, v): """ http://paulbourke.net/geometry/klein/ """ half = (0 <= u) & (u < pi) r = 4*(1 - cos(u)/2) x = 6*cos(u)*(1 + sin(u)) + r*cos(v + pi) x[half] = ( (6*cos(u)*(1 + sin(u)) + r*cos(u)*cos(v))[half]) y = 16 * sin(u) y[half] = (16*sin(u) + r*sin(u)*cos(v))[half] z = r * sin(v) return x, y, z u, v = np.linspace(0, 2*pi, 40), np.linspace(0, 2*pi, 40) ux, vx = np.meshgrid(u,v) x, y, z = surf(ux, vx) fig = plt.figure() ax = fig.gca(projection = '3d') plot = ax.plot_surface(x, y, z, rstride = 1, cstride = 1, cmap = plt.get_cmap('jet'), linewidth = 0, antialiased = False) plt.show() 

introduzca la descripción de la imagen aquí