Algo de álgebra con Nx — parte 2
Siguiendo con el tema del álgebra y Elixir, en esta oportunidad me he topado con un inconveniente.
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