← Back to list

Algo de álgebra con Nx — parte 2

Siguiendo con el tema del álgebra y Elixir, en esta oportunidad me he topado con un inconveniente.

Elixir para mí · 2026-02-07 17:08 · 0 claps · 2.6 min read
#elixir #erlang #livebook #linear-algebra #matemática
Open on Medium ↗
Wiki topics: 📐 · Mathematics

Algo de álgebra con Nx— parte 2

Siguiendo con el tema del álgebra y Elixir, en esta oportunidad me he topado con un inconveniente. Para los que están familiarizados con el álgebra, sabrán que el tema de los eigenvectores y los eigenvalores, también conocidos como vectores propios y valores propios, constituyen un tema fundamental en esta área.

Basándonos en la guía de la entrada anterior, y revisando el ejercicio del punto 3, vemos el paso a paso para hallar los valores y vectores propios de una matriz:

Y aquí viene el inconveniente.

En Nx hay una función llamada Nx.LinAlg.eigh() la cual permite generar tanto los eigenvalues como los eigenvectores, el problema es que sólo aplica a matrices simétricas, la matriz "A" del ejemplo no es una de ellas.

De esta manera, si yo uso la fórmula tendré un resultado diferente al esperado. Los valores propios concuerdan, pero no los vectores.

Nota: matriz simétrica significa que su matriz traspuesta es igual.

Pedido a la IA

Le pedí a Claude que me ayudará con un código (usando Nx) para efectuar el ejercicio en cuestión. El resultado es el siguiente:


defmodule Eigen do

  # Calcular eigenvalores resolviendo det(A - λI) = 0
  # Para matriz 2x2: [[a, b], [c, d]]
  # Ecuación característica: λ² - (a+d)λ + (ad-bc) = 0
  def eigenvalues_2x2(matrix) do
    [[a, b], [c, d]] = Nx.to_list(matrix)

    # Coeficientes de la ecuación cuadrática
    # λ² - traza*λ + determinante = 0
    traza = a + d
    det = a * d - b * c

    # Fórmula cuadrática: λ = (traza ± sqrt(traza² - 4*det)) / 2
    discriminante = traza * traza - 4 * det
    sqrt_disc = :math.sqrt(discriminante)

    lambda1 = (traza + sqrt_disc) / 2
    lambda2 = (traza - sqrt_disc) / 2

    {lambda1, lambda2}
  end

  # Calcular eigenvector para un eigenvalor dado
  # Resolviendo (A - λI)v = 0
  def eigenvector_2x2(matrix, lambda) do
    [[a, b], [c, d]] = Nx.to_list(matrix)

    # Matriz (A - λI)
    a_lambda = a - lambda
    d_lambda = d - lambda

    # Para [[a-λ, b], [c, d-λ]]
    # Si la primera fila no es cero, usamos: (a-λ)v1 + b*v2 = 0
    # Entonces v1 = -b, v2 = a-λ (o normalizamos)

    cond do
      abs(b) > 1.0e-10 ->
        # v1/v2 = -b/(a-λ)
        v1 = -b
        v2 = a_lambda
        normalize([v1, v2])

      abs(c) > 1.0e-10 ->
        # Usar la segunda fila: c*v1 + (d-λ)v2 = 0
        v1 = -(d_lambda)
        v2 = c
        normalize([v1, v2])

      true ->
        # Caso degenerado
        [1.0, 0.0]
    end
  end

  defp normalize([v1, v2]) do
    norm = :math.sqrt(v1 * v1 + v2 * v2)
    [v1 / norm, v2 / norm]
  end
end

Nótese que este código solo sirve para una matriz 2x2, si se requiere que el código reciba cualquier otro tipo de matriz se torna más complejo el ejercicio.

Opciones

La mejor sería integrar Python (que en livebook ya se puede hacer fácilmente) o hacer el cálculo manual como nos arrojó la IA.

Sin nada más que añadir, hasta la próxima.

Leonardo Linares

Ad gloriam Dei


메타데이터
post_id
6f74bbee1d21
slug
algo-de-álgebra-con-nx-parte-2-6f74bbee1d21
url
https://medium.com/@elixirparami/algo-de-%C3%A1lgebra-con-nx-parte-2-6f74bbee1d21
canonical_url
https://medium.com/@elixirparami/algo-de-%C3%A1lgebra-con-nx-parte-2-6f74bbee1d21
author_url
https://medium.com/@elixirparami
status
ok
fetched_at
2026-06-23 17:05:31