Funciones vectorials y Curvas en 3D con Python

1. Ejercicio - 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)

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
import numpy as np

# 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)
a = 0 # intervalo t entre [a,b]
b = 10
muestras = 41
verdigitos = 4
titulo = 'Funciones vectoriales - Hélice'

# PROCEDIMIENTO
ti = np.linspace(a,b,muestras)
ri = rt(ti)

# SALIDA
np.set_printoptions(verdigitos)
print(titulo)
print('i, ti, [xi, yi, zi]')
for i in range(0,muestras,1):
    print(i, np.around(ti[i],verdigitos),
          ri[:,i])

# GRAFICA ---------------------
import matplotlib.pyplot as plt

fig3D = plt.figure()
graf3D = fig3D.add_subplot(111, projection='3d')
 
graf3D.plot(ri[0],ri[1],ri[2],
            color ='blue',label='[x,y,z]')

graf3D.scatter(ri[0,0],ri[1,0],ri[2,0],
               c = 'red',marker='o', label = 'x0,y0,z0')
graf3D.scatter(ri[0,muestras-1],ri[1,muestras-1],ri[2,muestras-1],
               c = 'green',marker='o', label = 'xn,yn,zn')
# entorno gráfico
graf3D.set_title(titulo)
graf3D.set_xlabel('x')
graf3D.set_ylabel('y')
graf3D.set_zlabel('z')
graf3D.legend()

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

2. Ejercicio - 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 = 41
verdigitos = 4
titulo = 'Funciones vectoriales - Elipse'

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