1.3 Funciones vectoriales y Curvas en 3D con Python



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}
Funciones Vectoriales hélice gráfica 01

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) = t

Se 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

Funciones Vectoriales hélice gráfica 01
# 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 =1

y 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\pi

de 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]
...
Funciones Vectoriales Elipse gráfico 01



Unidades FP