Por supuesto, es muy difícil contar en detalle sobre todos los métodos, pero este tema me parece interesante y extremadamente importante, ya que todos se enfrentan con el problema de encontrar una solución con bastante frecuencia. En el primer artículo
¿Por qué Gauss? Se describió el método de Gauss (incluso con modificaciones) y algunos métodos iterativos. Sin embargo, dada la crítica de
Sinn3r , decidí describir también otros métodos.
Empezar de nuevo
Entonces, de nuevo necesitamos resolver un sistema de ecuaciones de orden algebraicas lineales
. Uno de los métodos numéricos más llamativos es un método que utiliza
-descomposición de la matriz.
Este método intuitivo es el siguiente. Supongamos que tenemos un sistema de ecuaciones algebraicas lineales (escritas en forma de vector):
donde
- una matriz
no degenerada terrible y confusa. Lo representamos como el producto de otras dos matrices:
Es una matriz triangular inferior, y
Es la matriz triangular superior. Entonces, obviamente, el sistema toma la forma:
Si designado
, entonces la solución para el sistema original se encuentra a partir de la solución de otros dos sistemas:
La ventaja de este método es que las soluciones de dos sistemas auxiliares son muy simples (debido al hecho de que las matrices
y
- triangular). ¿Pero es fácil encontrar estas matrices? Entonces, la tarea de resolver el sistema se reduce a la tarea de construir
-descomposiciones para la matriz.
Descripción del algoritmo que aplica
-descomposición se describe con suficiente detalle
aquí . Mientras tanto, veremos otro método.
Método de raíz cuadrada
Imponemos condiciones adicionales en la matriz.
. Requerimos que sea simétrico, es decir
o
. Dicha matriz se puede representar como
donde
- matriz triangular superior,
Es una matriz
real diagonal, y sus elementos diagonales son iguales a la unidad en valor absoluto. Del mismo modo, el sistema original se reduce a otros dos:
que también se resuelven elementalmente debido a las propiedades de las matrices
y
.
La derivación de fórmulas algorítmicas es bastante engorrosa y permanece más allá del alcance de la publicación. Si lo desea, se pueden encontrar
aquí .
Ejemplo de código Java que implementa el método de barrido:
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.PrintWriter; import java.util.Locale; import java.util.Scanner; public class SquareRootMethod { public static void main(String[] args) throws FileNotFoundException { Scanner scanner = new Scanner(new FileReader("input.txt")); scanner.useLocale(Locale.US); int n = scanner.nextInt(); double[][] a = new double[n + 1][n + 1]; double[] b = new double[n + 1]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { a[i][j] = scanner.nextDouble(); } b[i] = scanner.nextDouble(); } double[] x = new double[n + 1]; double[] d = new double[n + 1]; double[][] s = new double[n + 1][n + 1];
Método de barrido
Con este método, solo se pueden resolver sistemas específicos con no más de tres incógnitas en cada fila. Es decir, con el sistema
matriz
es tridiagonal:
A = \ begin {pmatrix} C_1 & -B_1 & 0 & \ dots & 0 & 0 \\ -A_2 & C_2 & -B_2 & \ dots & 0 & 0 \\ \ vdots & \ vdots & \ vdots & \ ddots & \ vdots & \ vdots \\ 0 & 0 & \ dots & -A_ {n-1} & C_ {n-1} & -B_ {n-1} \\ 0 & 0 & \ dots & 0 & -A_n & C_n \\ \ end {pmatrix}. $
Solo tenga en cuenta que hay una conexión de soluciones vecinas:
- Algunos números desconocidos. Si los encontramos y una sola variable, podemos encontrar todos los demás.
Derivación de fórmulas.
presente
aquí Bueno al final
Tenga en cuenta que en las fórmulas de búsqueda
hay una división por número
que puede llegar a ser cero y necesita ser rastreado. Pero, de hecho, se cumple la siguiente
declaración , cuya prueba está
aquí : el algoritmo de barrido es correcto y estable si se cumplen las condiciones:
Considere el código del programa Java que resuelve el sistema.
\ left \ {\ begin {alineado} & x_1 = 0, \\ & x_ {i-1} + \ xi x_ {i + 1} = \ dfrac {i} {n}, \ (i = \ overline {2, n-1}), \\ & x_n = 1, \\ \ end {alineado} \ right.
a las
.
package SystemOfLinearAlgebraicEquations; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.PrintWriter; import java.util.Locale; import java.util.Scanner; public class TridiagonalMatrixAlgorithm { public static void main(String[] args) throws FileNotFoundException { final int n = 21; double[] A = new double[n + 1]; double[] B = new double[n + 1]; double[] C = new double[n + 1]; double[] F = new double[n + 1]; double xi = 2; C[1] = 1; F[1] = 0; for(int i = 2; i <= n-1; i++) { A[i] = 1; C[i] = xi; B[i] = 1; F[i] = - (double) i / n; } A[n] = 0; C[n] = 1; F[n] = 1; double[] alpha = new double[n + 1]; double[] beta = new double[n + 1];