Cómo encontrar un valor propio y un vector propio usando C ++ o php

Dado que la pregunta indica que desea implementar su propia solución, describiré el procedimiento a un alto nivel, suponiendo que sepa lo suficiente en el lenguaje relevante (C ++ o PHP) para manejar la codificación real. También haré uso gratuito de las “subrutinas” matemáticas que normalmente se aprenden antes de aprender álgebra lineal; si necesita saber cómo codificar una de estas subrutinas, puede formularla como su propia pregunta.

Por lo tanto, supongo que tiene una matriz [matemática] A [/ matemática] que es una matriz de flotantes [matemática] n \ veces n [/ matemática].

Paso 1: Calcule el polinomio característico [matemática] p_A (x) [/ matemática] de [matemática] A [/ matemática].

Matemáticamente, esto se define como el polinomio
[matemáticas] \ izquierda | A – x I_n \ right | [/ math], donde [math] x I_n [/ math] es la matriz con la variable [math] x [/ math] en la diagonal y ceros fuera de la diagonal principal, y el “absoluto valor “símbolo” significa “determinante”.

Ahora, sin un sistema de álgebra computacional, no está claro cómo escribir una subrutina que resuelva este polinomio. Si también está rodando esto por su cuenta, es posible que desee escribir una pequeña clase de aritmética polinómica, con métodos para sumar, multiplicar y encontrar raíces. Esto último es importante porque

Paso 2: Encuentre todas las raíces del polinomio que encontró en el Paso 1. Estas raíces (números [matemática] \ lambda [/ matemática] tal que [matemática] p_A (\ lambda) = 0) [/ matemática] son ​​sus valores propios.

Paso 3: Para cada número [math] \ lambda [/ math] que encontraste en el paso 2, deberás encontrar el subespacio [math] V \ subset \ mathbb {R} ^ n [/ math] de todos los vectores [math ] \ vec {v} [/ math] tal que [math] (A – \ lambda I_n) \ cdot \ vec {v} = \ vec {0} [/ math]. Como habrá infinitos, lo que realmente quieres es una base para este subespacio. Estos vectores básicos son sus vectores propios.

La forma habitual en que se les enseña a los estudiantes principiantes a seguir el paso 3 es usar la Eliminación Gauss-Jordan. El código de producción real (como LAPACK) utiliza métodos mucho más potentes y menos propensos a errores, pero son más difíciles de explicar.

Hay un algoritmo llamado algoritmo QR. Es el algoritmo de valor propio estándar. Hay muchas formas de implementarlo. [1]

Algoritmo QR sin turnos. También debe implementar el gram schmidt utilizando la factorización QR.

Notas al pie

[1] Algoritmo QR – Wikipedia