Mide siete veces: corta una vez o usa el dicho en la práctica

Me senté en el curso de Coursera. El curso estaba dirigido a principiantes en Java, y en uno de los tutoriales en video se planteó el tema 7 Pasos para resolver problemas .

Yo, con la conciencia tranquila, escuché el video tutorial, pensé para mí mismo, este negocio ha ido lejos y durante mucho tiempo.

El resto del curso fue fácil, relajado. Pero, en una de las asignaturas de la universidad, es decir, en la llamada "Programación científica", apareció la siguiente tarea:
Resolver un sistema de ecuaciones lineales. Ax=busando la siguiente expansión de matriz A:

A=LU,

Dónde LEs la matriz triangular inferior, y UEs la matriz triangular superior.

El tema del álgebra lineal, que tomamos en el 1er curso. Francamente, recordé los principios generales de las operaciones con matrices, vectores y el lugar santísimo: el método de Gauss. Si lo piensas bien con el cerebro, entonces no estudiamos ninguna descomposición de LU, pero el método de Google siempre ayuda. Rescatado, hasta este punto.

Encontré un algoritmo general para encontrar matrices Ly U, pero a las tres y media de la mañana ningún café me dio la oportunidad de implementarlo adecuadamente (dado que codificamos allí en Octave). Como resultado, me asusté y decidí escuchar el inteligente proverbio.

1. Describe el problema a mano


Todo lo que te falta en la vida es entender cuál es realmente el problema. Tomemos un ejemplo del problema anterior y escríbalo en una hoja de papel. En el buen sentido, deben cumplirse las siguientes condiciones para la existencia de matricesL y U:

- la matriz inversa debe existirA, Quiero decir A1;
- todos los menores mayores no deben ser degenerados, es decirΔ(1,...,n)0

Bueno, es por eso que al menos necesitamos una "prueba tonta", porque seguramente hay personas inteligentes que quieren usar la matriz que no es adecuada para nosotros. Pero por ahora, vamos a omitirlo.

El problema es claro para nosotros: encontrar matricesL y Ueso caerá bajo las condiciones anteriores. Después de haber tratado de buscar en Google los métodos de solución, es poco probable que pueda implementar correctamente el algoritmo la primera vez (si no es bueno en álgebra lineal). Después de pasar por muchos intentos, lo más probable es que desarrollemos una secuencia de acciones para resolver nuestro problema, y ​​luego procedemos al paso 2.

2. Describe lo que hiciste


Toma la matriz como ejemplo

A=(123024110).



Ahora aplicamos nuestro método de Gauss y eliminamos los elementos adicionales en la línea 3, restando la primera línea, multiplicada por la relación del primer elemento de 3 líneas al primer elemento de 1 línea:

a3=a3a1a31a11.



Ahora, deshazte del segundo elemento de la línea 3 con una acción similar:

a3=a3a2a32a22.



Como resultado, obtenemos la matriz

A=(123024000)=U.



Y ahora, los coeficientes que encontramos (el resultado de la relación de elementos aijajj) tomar los valores de la matriz L, y obten

L=(1000101121).



Mirando a través de la plantilla, ¿no es así?

3. Encontrar patrones


En esta etapa, lo más probable es que regrese a los pasos 1 y 2, porque la plantilla que no siempre encontró será verdadera para todos los casos. Pero nada, ya que no funcionó, sucederá después.

Entonces, en base a un ejemplo, podemos formular la siguiente plantilla de algoritmo / solución:

1. Definir una matriz cuadradaA,norden
2. Establecer la matrizL=Idónde I- matriz de identidad norden
3. Establecer la matrizU=A;
4. Aplicamos las siguientes transformaciones sucesivas a las matrices, siempre que{i=2,,nj=1,,i

lij=uijujjui=uiujlij,



A n=3obtenemos:

L=(100l2110l31l321),U=(u11u12u130u22u2300u33)



4. Comprobación de la plantilla / algoritmo


Hay un algoritmo: ¡hay millones de matrices para probarlo! No puede preocuparse por esta plantilla, es obviamente cierto (probado personalmente en las matrices más no degeneradas posibles). Pero recuerda: date prisa, haces reír a la gente . Así que siempre verifique las plantillas que creó para que no continúe saltando como un demonio desde el principio.

5. Traducción del algoritmo a código


El paso obvio, todo lo que necesitas a menudo ya está en la sintaxis del lenguaje, y si no, nadie te molesta para crear clases y funciones para resolver este problema, entonces tienes un algoritmo. Como implementé este algoritmo como parte de un programa universitario educativo, solo pude usar Octave para la implementación, por lo que todo el código que les presento está en su sintaxis (es muy similar a Python, por lo que usaré su resaltado para formatear):

A = input("Enter the matrix A: ")
numOfRows = size(A, 1)
numOfCols = size(A, 2)

if numOfRows ~= numOfCols
    disp("Wrong matrix.")
else
    n = numOfCols
    disp("----------------")
    L = eye(3)
    disp("Making U = A")
    U = A
    disp("----------------")

    for i=2:n
        disp("Step "), disp(i-1)
        for j=1:i-1
            L(i,j) = U(i,j)/U(j,j)
            U(i,:) = U(i,:) - U(j,:)*L(i,j)
        end
        disp("----------------")
    end

    disp("Check the answer of L*U: "), disp(L*U)
end

6. Búsqueda de pruebas fallidas


Siempre debe tratar de "romper" su código. Aquí (obviamente) no existe una completa "protección contra el tonto", pero tomé como base el supuesto de que se introducirá la matriz inicialmente correcta.

En este paso, debe encontrar todos los posibles errores, inexactitudes en su código, como resultado de lo cual también se puede revelar el sesgo del algoritmo construido. Por lo tanto, aquí debe probar tantas omisiones que se podrían haber hecho.

7. Depurar pruebas fallidas


El más lógico, y probablemente esperado de los pasos. El código debe estar sesgado y el algoritmo corregido. No hay nada más que agregar aquí.

Conclusión


Puedo decir que es poco probable que alguna vez tome en serio este enfoque para resolver problemas, si no fuera por mi estado de sueño. Pero vale la pena prestar atención a este método: es breve y toda su laboriosidad consiste solo en el hecho de que debe usarse.

Nota


Gracias a los libros de texto de álgebra lineal por el material para resolver el problema.

All Articles