1. Ejemplo - Hélice en 3D
Referencia: Steward 13.1 Ejemplo 4 p848
Trace la curva cuya ecuación vectorial es
r(t) = cos(t) \mathbf{i} + sen(t)\mathbf{j} +t \mathbf{k}
1.1 Desarrollo analítico - paso a paso
Se puede expresar las ecuaciones paramétricas de la curva para cada eje
x(t) = cos(t) y(t) = sen(t) z(t) = tSe define el intervalo t entre [0,10] para 41 muestras.
Se aumenta el número de muestras para hacer la curva mas suave.
1.2 Algoritmo en Python
Para cada eje se escribe una ecuación, que se puede integrar como una sola dependiente de la variable t que entrega un arreglo con los valores resultantes para cada eje,
# INGRESO
fx = lambda t: np.cos(t)
fy = lambda t: np.sin(t)
fz = lambda t: t
rt = lambda t: np.array([fx(t),fy(t),fz(t)],
dtype=float)
Como al final se obtiene un arreglo, se debe mantener la función respecto a t. En caso que una de las funciones sean cero, se escribe 0*t, para que el resultado continúe siendo un arreglo y sea posible realizar la gráfica.
Ejemplo: fx = lambda t: 0*t en caso que sea nula
Para la observación se añade el intervalo para la variable t, [a,b] y la cantidad de muestras a observar, de forma semejante a lo realizado para las gráficas en 2D.
# Ejercicio Steward 13.1 p848
# Funciones vectoriales y Curvas en 3D
import numpy as np
# INGRESO
fx = lambda t: np.cos(t) # 0*t en caso que sea nula
fy = lambda t: np.sin(t)
fz = lambda t: t
# función vectorial
rt = lambda t: np.array([fx(t),fy(t),fz(t)],
dtype=float)
a = 0 # intervalo t entre [a,b]
b = 10
muestras = 7
titulo = 'Funciones vectoriales - Hélice'
verdecimales = 4
# PROCEDIMIENTO
ti = np.linspace(a,b,muestras)
ri = rt(ti)
# SALIDA
np.set_printoptions(verdecimales)
print(titulo)
print('i, ti, [xi, yi, zi]')
for i in range(0,muestras,1):
print(i, np.around(ti[i],verdecimales),
ri[:,i])
# GRAFICA ---------------------
import matplotlib.pyplot as plt
# suavizar la curva
muestras_graf = 6*muestras
tk = np.linspace(a,b,muestras_graf)
rk = rt(tk)
dt = tk[1]-tk[0]
n = muestras-1 # último punto
fig3D = plt.figure()
graf3D = fig3D.add_subplot(projection='3d')
graf3D.plot(rk[0],rk[1],rk[2],label='r(t)')
graf3D.scatter(ri[0],ri[1],ri[2],
marker='o',color ='orange',
label='[x,y,z]')
# etiquetas
for i in range(0,muestras,1):
if muestras<=10: # etiquetas de tiempo
etiqueta = 't='+str(np.round(ti[i],verdecimales))
graf3D.text(ri[0,i],ri[1,i],ri[2,i],etiqueta)
# entorno gráfico
graf3D.set_title(titulo)
graf3D.set_xlabel('x')
graf3D.set_ylabel('y')
graf3D.set_zlabel('z')
graf3D.legend()
plt.tight_layout()
plt.show()
obteniendo como resultado:
Funciones vectoriales - Hélice
i, ti, [xi, yi, zi]
0 0.0 [1. 0. 0.]
1 0.25 [0.9689 0.2474 0.25 ]
2 0.5 [0.8776 0.4794 0.5 ]
3 0.75 [0.7317 0.6816 0.75 ]
4 1.0 [0.5403 0.8415 1. ]
5 1.25 [0.3153 0.949 1.25 ]
...
1.2 Gráfica con Python

# GRAFICA ---------------------
import matplotlib.pyplot as plt
# suavizar la curva
muestras_graf = 6*muestras
tk = np.linspace(a,b,muestras_graf)
rk = rt(tk)
dt = tk[1]-tk[0]
n = muestras-1 # último punto
fig3D = plt.figure()
graf3D = fig3D.add_subplot(projection='3d')
graf3D.plot(rk[0],rk[1],rk[2],label='r(t)')
graf3D.scatter(ri[0],ri[1],ri[2],
marker='o',color ='orange',
label='[x,y,z]')
# etiquetas
for i in range(0,muestras,1):
if muestras<=10: # etiquetas de tiempo
etiqueta = 't='+str(np.round(ti[i],verdecimales))
graf3D.text(ri[0,i],ri[1,i],ri[2,i],etiqueta)
# entorno gráfico
graf3D.set_title(titulo)
graf3D.set_xlabel('x')
graf3D.set_ylabel('y')
graf3D.set_zlabel('z')
graf3D.legend()
plt.tight_layout()
plt.show()
2. Ejemplo - Elipse en 3D
Referencia: Steward 13.1 Ejemplo 5 p850
Determine una función vectorial que represente la curva de intersección del cilindro
x^2 + y^2 =1y el plano: y+z=2
2.2 Desarrollo analítico - paso a paso
La proyección en el plano xy es el círculo, por lo que se escribe en función de t:
x(t) = cos(t) y(t) = sen(t) 0 \leq t \leq 2\pide la ecuación del plano se tiene: z = 2-y, por lo que se tiene:
x(t) = cos(t) y(t) = sen(t) z(t) = 2 - sen(t)con la ecuación de la curva
x(t) = cos(t) \mathbf{i} + sen(t) \mathbf{j} + (2 - sen(t)) \mathbf{k}
2.2 Algoritmo en Python
Siguiendo el ejemplo anterior, se modifica en el algoritmo el bloque de ingreso:
# INGRESO
fx = lambda t: np.cos(t)
fy = lambda t: np.sin(t)
fz = lambda t: 2-np.sin(t)
rt = lambda t: np.array([fx(t),fy(t),fz(t)]
,dtype=float)
a = 0 # intervalo t entre [a,b]
b = 2*np.pi
muestras = 7
titulo = 'Funciones vectoriales - Elipse'
verdecimales = 4
con los siguientes resultados:
Funciones vectoriales - Elipse
i, ti, [xi, yi, zi]
0 0.0 [1. 0. 2.]
1 0.1571 [0.9877 0.1564 1.8436]
2 0.3142 [0.9511 0.309 1.691 ]
3 0.4712 [0.891 0.454 1.546]
4 0.6283 [0.809 0.5878 1.4122]
5 0.7854 [0.7071 0.7071 1.2929]
...
