8  Funciones vectoriales

8.1 Ejercicios Resueltos

Para la realización de esta práctica se requieren los siguientes paquetes:

using SymPy  # Para el cálculo simbólico.
using Plots  # Para el dibujo de gráficas.
using Makie, GLMakie # Para el dibújo de gráficas en 3d.
using LaTeXStrings  # Para usar código LaTeX en los gráficos.
using LinearAlgebra # Para el módulo, producto escalar y vectorial de vectores.
using Roots # Para calcular soluciones de ecuaciones numéricamente.

Ejercicio 8.1 Representar gráficamente los vectores \(\mathbf{u}=(3,1)\), \(\mathbf{v}=(1,2)\) y \(\mathbf{u}-\mathbf{v}\) en el plano real \(\mathbb{R}^2\).

Usar la función plot del paquete Plots, añadiendo el parámetro arrow = true para dibujar flechas que representan vectores. También se puede usar la función arrows! del paquete Makie para dibujar flechas.

using Plots
using LaTeXStrings
Plots.plot([0, 3], [0, 1], arrow = true, linewidth = 2, legend = false)
annotate!(1.5, 0.4, L"$\mathbf{u}$")
Plots.plot!([0, 1], [0, 2], arrow = true, linewidth = 2)
annotate!(0.4, 1, L"$\mathbf{v}$")
Plots.plot!([3, 1], [1, 2], arrow = true, linewidth = 2)
annotate!(2.1, 1.6, L"$\mathbf{u}-\mathbf{v}$")
using GLMakie
using LaTeXStrings
o = Point2(0, 0)
u = Vec2(3, 1)
v = Vec2(1, 2)
fig = Figure()
ax = Axis(fig[1,1])
arrows!(ax, [o], [u], color = :blue)
text!(ax, 1.5, 0.4, text = L"$\mathbf{u}$")
arrows!(ax, [o], [v], color = :red)
text!(ax, 0.4, 1, text = L"$\mathbf{v}$")
arrows!(ax, [o+v], [u-v], color = :green)
text!(ax, 2.1, 1.6, text = L"$\mathbf{u}-\mathbf{v}$")
fig

Ejercicio 8.2 Sean \(\mathbf{u}=(1,2,-1)\) y \(\mathbf{v}=(3,0,2)\) dos vectores del espacio real \(\mathbb{R}^3\).

  1. Calcular el módulo (norma) de ambos vectores y construir vectores unitarios con su misma dirección.

    Usar la función norm del paquete LinearAlgebra para calular el módulo de un vector.

    using LinearAlgebra
    u = [-1, 2, -1]
    v = [-2, 0, 1]
    println("Módulo de u: $(norm(u))")
    println("Módulo de v: $(norm(v))")
    println("Vector unitario con la dirección de u $(u/norm(u))")
    println("Vector unitario con la dirección de v $(v/norm(v))")
    Módulo de u: 2.449489742783178
    Módulo de v: 2.23606797749979
    Vector unitario con la dirección de u [-0.4082482904638631, 0.8164965809277261, -0.4082482904638631]
    Vector unitario con la dirección de v [-0.8944271909999159, 0.0, 0.4472135954999579]
  2. Calcular su producto escalar.

    Usar la función dot del paquete LinearAlgebra para calcular el producto escalar de dos vectores.

    println("Producto escalar de u y v: $(dot(u, v))")
    # También se puede usar el clásico punto ⋅
    println("Producto escalar de u y v: $(u  v)")
    Producto escalar de u y v: 1
    Producto escalar de u y v: 1
  3. Calcular su producto vectorial.

    Usar la función cross del paquete LinearAlgebra para calcular el producto vectorial de dos vectores.

    println("Producto vectorial de u y v: $(cross(u, v))")
    # También se puede usar la clásica cruz × 
    println("Producto vectorial de u y v: $(u × v)")
    Producto vectorial de u y v: [2, 3, 4]
    Producto vectorial de u y v: [2, 3, 4]
  4. Dibujar \(\mathbf{u}\), \(\mathbf{v}\) y \(\mathbf{u}\times\mathbf{v}\) en el espacio real.

    using Plots
    uv = u × v
    Plots.plot([0, u[1]], [0, u[2]], [0, u[3]], arrow = true, linewidth = 2, xlabel = "X", ylabel = "Y", zlabel = "Z", legend = false)
    Plots.plot!([0, v[1]], [0, v[2]], [0, v[3]], arrow = true, linewidth = 2)
    Plots.plot!([0, uv[1]], [0, uv[2]], [0, uv[3]], arrow = true, linewidth = 2)
    using GLMakie
    fig = Figure()
    ax = Axis3(fig[1,1], azimuth = -pi/4, aspect = (1,1,1))
    O = [0, 0 ,0]
    arrows!(ax, [Point3(O)], [Vec3(u), Vec3(v), Vec3(u × v)], 
        linecolor = [:blue,:red, :green], arrowcolor = [:blue,:red, :green],
        linewidth = 0.02, arrowsize = Vec3(0.1, 0.1, 0.1))
    fig

Ejercicio 8.3 Dibujar las trayectorias de las siguientes funciones vectoriales.

  1. \(f(t)=(\operatorname{sen}(t), \cos(t))\).

    Usar la función plot del paquete Plots o la función lines del paquete Makie para dibujar la trayectoria, pasándole cada una de las funciones componentes separadas por comas.

    using Plots
    f(t) = [sin(t), cos(t)] 
    ts = range(0, 2pi, length = 200)
    xs = [f(t)[1] for t in ts]
    ys = [f(t)[2] for t in ts]
    Plots.plot(xs, ys, aspect_ratio = :equal)
    using GLMakie
    f(t) = [sin(t), cos(t)] 
    ts = range(0, 2pi, length = 200)
    points = Point2.(f.(ts))
    fig = Figure()
    ax = Axis(fig[1,1], aspect = 1)
    lines!(ax, points, linewidth = 2, color = :blue)
    fig
  2. \(\mathbf{g}(t) = (\cos(t), \operatorname{sen}(t), t/4)\).

    g(t) = [cos(t), sin(t), t/4] 
    ts = range(0, 2pi, length = 200)
    xs = [g(t)[1] for t in ts]
    ys = [g(t)[2] for t in ts]
    zs = [g(t)[3] for t in ts]
    Plots.plot(xs, ys, zs, aspect_ratio = :equal, xlabel = "X", ylabel = "Y", zlabel = "Z", label = "")
    using GLMakie
    g(t) = [cos(t), sin(t), t/4] 
    ts = range(0, 2pi, length = 200)
    points = Point3.(g.(ts))
    fig = Figure()
    ax = Axis3(fig[1,1])
    lines!(ax, points, linewidth = 2, color = :blue)
    fig

Ejercicio 8.4 Un nudo tórico es un nudo que se forma mediante una trayectoria que gira sobre la superficie de un toro en \(\mathbb{R}^3\). La función vectorial que define este tipo de nudos sobre un toro de ecuación \((r-2)^2+z^2 = 1\) es \(\mathbf{f}(t) = ((2+\cos(qt))\cos(pt), (2+\cos(qt))\operatorname{sen}(pt), -\operatorname{sen}(qt))\), donde \(p\) y \(q\) son dos enteros primos entre si y \(t\in [0,2\pi]\).

  1. Dibujar el nudo tórico con \(p=2\) y \(q=3\).

    Usando el paquete Makie.

    using GLMakie
    # Definimos las ecuaciones paramétricas del toro.
    U = range(-pi, pi, 100)
    V = range(-pi, pi, 20)
    x1 = [2cos(u) + cos(u) * cos(v) for u in U, v in V]
    y1 = [2sin(u) + sin(u) * cos(v) for u in U, v in V]
    z1 = [sin(v) for u in U, v in V]
    # Inicializamos la figura y los ejes.
    fig = Figure()
    ax = Axis3(fig[1,1], aspect = (3, 3, 1))
    # Dibujamos el toro.
    Makie.surface!(ax, x1, y1, z1; colormap = :viridis, transparency = true, alpha = 0.5)
    # Definimos la función vectorial de nudo tórico.
    f(t) = [(2+cos(3t))cos(2t), (2+cos(3t))sin(2t), -sin(3t)] 
    # Generamos los puntos de la trayectoria del nudo tórico.
    ts = range(0, 2pi, length = 200)
    points = Point3.(f.(ts))
    # Dibujamos el nudo tórico.
    lines!(ax, points, linewidth = 3, color = :red)
    fig
  2. Definir una función para crear nudos tóricos con parámetros p y q para los enteros que definen el toro y un parámetro opcional booleano toro, para dibujar el toro o no.

    using GLMakie
    """
        nudo_torico(ax, p, q, toro)
    
    Función dibuja un nudo tórico de parámetros p, q sobre los ejes ax. Si el parámetro toro es true dibuja también el toro sobre el que se traza el nudo.
    """
    function nudo_torico(ax::Axis3, p::Int64, q::Int64, toro::Bool = true)
        if toro 
            alpha = 0.5
        else
            alpha = 0
        end
        # Definimos las ecuaciones paramétricas del toro.
        U = range(-pi, pi, 100)
        V = range(-pi, pi, 20)
        x1 = [2cos(u) + cos(u) * cos(v) for u in U, v in V]
        y1 = [2sin(u) + sin(u) * cos(v) for u in U, v in V]
        z1 = [sin(v) for u in U, v in V]
        # Dibujamos el toro en los ejes.
        Makie.surface!(ax, x1, y1, z1; colormap = :viridis, transparency = true, alpha = alpha)
        # Definimos la función vectorial de nudo tórico.
        f(t) = [(2+cos(q*t))cos(p*t), (2+cos(q*t))sin(p*t), -sin(q*t)] 
        # Generamos los puntos de la trayectoria del nudo tórico.
        ts = range(0, 2pi, length = 200)
        points = Point3.(f.(ts))
        # Dibujamos el nudo tórico.
        lines!(ax, points, linewidth = 3, color = :red)
    end
    
    fig = Figure()
    ax = Axis3(fig[1,1], aspect = (3, 3, 1))
    nudo_torico(ax, 5, 9, true)
    fig

Ejercicio 8.5  

  1. Calcular las ecuaciones de la rectas tangente y normal a la trayectoria \(\mathbf{f}(t) = (\operatorname{sen}(2t), \cos(t))\) en el punto correspondiente a \(t=\pi/2\) y dibujarlas.

    La ecuación de la recta tangente a la trayectoria de la función vectorial \(\mathbf{f}(t)\) en el instante \(t=a\) es \(\mathbf{f}(a)+\mathbf{f}'(a)t\).

    La ecuación de la recta normal a la trayectoria de la función vectorial \(\mathbf{f}(t)\) en el instante \(t=a\) es \(\mathbf{f}(a)+\mathbf{N}(a)t\), donde \(\mathbf{N}(a)\) es un vector normal a \(f'(a)\), como por ejemplo \(\mathbf{N}(a) = (f'(a)_2, -f'(a)_1)\).

    using SymPy, Plots
    @syms t::real
    # Definimos la función vectorial.
    f(t) = [sin(2t), cos(t)]
    # Instante 
    a = pi/2
    # Dibujamos la trayectoria.
    Plots.plot(f(t)..., 0, 2pi, aspect_ratio = :equal, label = "f(t)=(sen(t), cos(t))")
    # Dibujamos el punto de tangencia.
    Plots.scatter!([f(a)[1]],[f(a)[2]], label = "")
    # Calculamos la función derivada.
    df = lambdify(diff.(f(t)))
    # Calculamos la ecuación de la recta tangente.
    tl(t) = f(a) + df(a) * t
    # Dibujamos la recta tangente.
    Plots.plot!(tl(t)..., -1, 1, label = "Tangente")
    # Calculamos la ecuación de la recta normal.
    nl(t) = f(a) - [df(a)[2],-df(a)[1]] * t
    Plots.plot!(nl(t)..., -0.6, 0.6, label = "Normal")
    using SymPy, GLMakie
    @syms t::real
    # Definimos la función vectorial.
    f(t) = [sin(2t), cos(t)]
    # Instante
    a = pi/2
    # Dibujamos la trayectoria.
    ts = range(0, 2pi, 200)
    points = Point2.(f.(ts))
    fig = Figure()
    ax = Axis(fig[1,1], aspect = DataAspect())
    lines!(ax, points)
    # Dibujamos el punto de tangencia.
    Makie.scatter!(Point2(f(a)), color = :red)
    # Calculamos la función derivada.
    df = lambdify(diff.(f(t)))
    # Calculamos la ecuación de la recta tangente.
    tl(t) = f(a) + df(a) * t
    # Dibujamos la recta tangente.
    pointstl = Point2.(tl.(range(-1, 1, 2)))
    lines!(ax, pointstl)    
    # Calculamos la ecuación de la recta normal
    nl(t) = f(a) - [df(a)[2],-df(a)[1]] * t
    pointsnl = Point2.(nl.(range(-0.6, 0.6, 2)))
    lines!(ax, pointsnl)
    fig
  2. Calcular las ecuaciones de las recta tangente y el plano normal a la trayectoria \(\mathbf{g}(t) = (\cos(t), \operatorname{sen}(t), \sqrt{t})\) en punto correspondiente a \(t=\pi/2\) y dibujarlas.

    using SymPy, LinearAlgebra, GLMakie
    @syms x, y, z, t
    # Definimos la función vectorial.
    g(t) = [cos(t), sin(t), sqrt(t)]
    # Instante 
    a = pi/2
    # Dibujamos la trayectoria.
    ts = range(0, 2pi, 200)
    points = Point3.(g.(ts))
    fig = Figure()
    ax = Axis3(fig[1,1], title = "Recta tangente y plano normal a una trayectoria", aspect = :equal)
    lines!(ax, points)
    # Dibujamos el punto de tangencia.
    Makie.scatter!(Point3(g(a)), color = :red)
    # Calculamos la derivada en el punto.
    dg = lambdify(diff.(g(t)))
    # Calculamos la ecuación de la recta tangente.
    tl(t) = g(a) + dg(a) * t
    # Dibujamos la recta tangente.
    pointstl = Point3.(tl.(range(-pi, pi, 2)))
    lines!(ax, pointstl)
    # Calculamos la ecuación del plano normal
    np = lambdify(solve(dot(([x, y, z] - g(a)), dg(a)), z)[1])
    xs = range(-1, 1, 2)
    ys = range(0, 2, 2)
    zs = [np(x,y) for x in xs, y in ys]
    Makie.surface!(ax, xs, ys, zs, colormap = ["red"], alpha = 0.5, transparency = true)
    fig

Ejercicio 8.6 Dada una función vectorial \(\mathbf{f}(t)\) en \(\mathbb{R}^3\), el plano osculador de la trayectoria de \(\mathbf{f}(t)\) en \(t=a\) es el plano definido por los vectores tangente \(\mathbf{T}(a)\) y normal \(\mathbf{N}(a)\).

Calcular y dibujar el plano osculador de la función vectorial del nudo tórico del apartado a del ejercicio Ejercicio 8.4 en el punto correspondiente a \(t=\pi/2\).

Usando el paquete Makie.

using SymPy, LinearAlgebra, GLMakie
@syms x, y, z, t::real
# Definimos las ecuaciones paramétricas del toro.
U = range(-pi, pi, 100)
V = range(-pi, pi, 20)
x1 = [2cos(u) + cos(u) * cos(v) for u in U, v in V]
y1 = [2sin(u) + sin(u) * cos(v) for u in U, v in V]
z1 = [sin(v) for u in U, v in V]
# Inicializamos la figura y los ejes.
fig = Figure()
ax = Axis3(fig[1,1], aspect = (3, 3, 1))
# Dibujamos el toro.
Makie.surface!(ax, x1, y1, z1; colormap = :viridis, shading = false, transparency = true, alpha = 0.5)
# Definimos la función vectorial de nudo tórico.
f(t) = [(2+cos(3t))cos(2t), (2+cos(3t))sin(2t), -sin(3t)] 
# Generamos los puntos de la trayectoria del nudo tórico.
ts = range(0, 2pi, length = 200)
points = Point3.(f.(ts))
# Dibujamos el nudo tórico.
lines!(ax, points, linewidth = 3, color = :red)
# Punto
a = pi/2
# Dibujamos el punto.
Makie.scatter!(ax, Point3(f(a)))
# Vector tangente unitario.
Tan = lambdify(diff.(f(t)) / norm(diff.(f(t))))
# Vector normal unitario.
Norm = lambdify(diff.(Tan(t)) / norm(diff.(Tan(t))))
# Calculamos la ecuación del plano osculador.
po = lambdify(solve(dot(([x, y, z] - f(a)), cross(Tan(a), Norm(a))), z)[1])
xs = range(-3, -1, 2)
ys = range(-1, 1, 2)
zs = [po(x,y) for x in xs, y in ys]
Makie.surface!(ax, xs, ys, zs, colormap = ["magenta"], alpha = 0.8, transparency = true)
fig
┌ Warning: `shading = false` is not valid. Use `Makie.automatic`, `NoShading`, `FastShading` or `MultiLightShading`. Defaulting to `NoShading`.
└ @ Makie ~/.julia/packages/Makie/YkotL/src/lighting.jl:243

Ejercicio 8.7 Para construir un cuaderno de 30 cm de altura se utiliza una espiral de alambre con radio 1 cm y una distancia entre cada dos vueltas consecutivas \(\pi/4\) cm. Dibujar la espiral y calcular la cantidad de alambre necesaria para cada cuaderno.