El documento describe diferentes métodos para resolver sistemas de ecuaciones lineales, incluyendo descomposición LU, el algoritmo de Thomas, descomposición de Cholesky, el método de Jacobi y el método de Gauss-Seidel. Estos métodos utilizan iteraciones para aproximar la solución de sistemas expresados como matrices. El método de Gauss-Seidel converge más rápido que el método de Jacobi al utilizar las aproximaciones más recientes en cada iteración.
Métodos directos para solución de sistemas ecuaciones lineales
Métodos iterativos para sistemas tridiagonales
1. Matrices Especiales.<br /> <br />Una matriz bandada es una matriz cuadrada en la que todos sus elementos son cero, con excepción de una banda sobre la diagonal principal. Un sistema tridiagonal (es decir con un ancho de banda de 3) se puede expresar en forma general como:<br /> <br />f0g0 x0 b0e1f1g1 x1=b1 e2f2g2 x2 b2 e3f3 x3 b3<br /> <br />Basados en la descomposición LU podemos ver que el algoritmo de Thomas es:<br /> <br /> <br /> <br />La sustitución hacia adelante es<br /> <br /> <br />y hacia atrás es:<br /> <br /> <br />Ejemplo:<br /> <br />Resuelva el siguiente sistema tridiagonal por medio del algoritmo de Thomas.<br /> <br />2.04-1 x0 40.8-12.04-1 x1=0.8 -12.04-1 x2 0.8 -12.04 x3 200.8<br /> <br />La solución de la descomposición triangular es:<br /> <br />2.04-1 -0.491.55-1 -0.6451.395-1 -0.7171.323<br /> <br /> <br />La solución del sistema es:<br /> <br />X = [65.970, 93.778, 124.538, 159.480]T<br /> <br />Descomposición de Cholesky.<br /> <br />Este algoritmo se basa en el hecho de que una matriz simétrica se puede descomponer en [A] = [L][L]T , dado que la matriz [A] es una matriz simétrica. En este caso aplicaremos la eliminación de Crout a la parte inferior de la matriz y la parte superior, simplemente tendrá los mismos valores.<br /> <br />Así tomando las ecuaciones para la factorización LU la podemos adaptar como:<br />Podemos ver, que cualquier elemento bajo la diagonal se calcula como:<br />para todo i=0,...,n-1 y j = 0,...,i-1.<br /> <br />Para los términos arriba de la diagonal, en este caso solo la diagonal<br /> <br />para todo i=0,...,n-1.<br /> <br />La implementación en Java es:<br /> <br /> static public void Cholesky(double A[][]) {<br /> int i, j, k, n, s;<br /> double fact, suma = 0;<br /> <br /> n = A.length;<br /> <br /> for (i = 0; i < n; i++) { //k = i<br /> for (j = 0; j <= i - 1; j++) { //i = j<br /> suma = 0;<br /> for (k = 0; k <= j - 1; k++) // j = k<br /> suma += A[i][k] * A[j][k];<br /> <br /> A[i][j] = (A[i][j] - suma) / A[j][j];<br /> }<br /> <br /> suma = 0;<br /> for (k = 0; k <= i - 1; k++)<br /> suma += A[i][k] * A[i][k];<br /> A[i][i] = Math.sqrt(A[i][i] - suma);<br /> }<br /> }<br /> Método de Jacobi<br />En análisis numérico el método de Jacobi es un método iterativo, usado para resolver sistemas de ecuaciones lineales del tipo Ax = b. El algoritmo toma su nombre del matemático alemán Carl Gustav Jakob Jacobi.<br />Descripción<br />La base del método consiste en construir una sucesión convergente definida iterativamente. El límite de esta sucesión es precisamente la solución del sistema. A efectos prácticos si el algoritmo se detiene después de un número finito de pasos se llega a una aproximación al valor de x de la solución del sistema.<br />La sucesión se construye descomponiendo la matriz del sistema en la forma siguiente:<br />donde<br />, es una matriz diagonal.<br />, es una matriz triangular inferior.<br />, es una matriz triangular superior.<br />Partiendo de , podemos reescribir dicha ecuación como:<br />Luego,<br />Si aii ≠ 0 para cada i. Por la regla iterativa, la definición del Método de Jacobi puede ser expresado de la forma:<br />donde k es el contador de iteración, Finalmente tenemos:<br />Cabe destacar que al calcular xi(k+1) se necesitan todos los elementos en x(k), excepto el que tenga el mismo i. Por eso, al contrario que en el método Gauss-Seidel, no se puede sobreescribir xi(k) con xi(k+1), ya que su valor será necesario para el resto de los cálculos. Esta es la diferencia más significativa entre los métodos de Jacobi y Gauss-Seidel. La cantidad mínima de almacenamiento es de dos vectores de dimensión n, y será necesario realizar un copiado explícito.<br />Convergencia<br />El método de Jacobi siempre converge si la matriz A es estrictamente diagonal dominante y puede converger incluso si esta condición no se satisface. Es necesario, sin embargo, que los elementos de la diagonal en la matriz sean mayores (en magnitud) que los otros elementos.<br />Algoritmo<br />El método de Jacobi se puede escribir en forma de algoritmo de la siguiente manera:<br />Algoritmo Método de Jacobifunción Jacobi (A, x0)//x0 es una aproximación inicial a la solución//para hasta convergencia hacer para hasta hacer para hasta hacer si entonces fin parafin paracomprobar si se alcanza convergenciafin para<br />algoritmo en java<br />public class Jacobi {<br />double [][]matriz={{4,-2,1},{1,-5,3},{2,1,4}};<br />double []vector={2,1,3};<br />double []vectorR={1,2,3};<br />double []x2=vectorR;<br />double sumatoria=1;<br />int max=50;<br /> public void SolJacobi(){<br /> int tam = matriz.length;<br />for (int y = 0; y < 10; y++) {<br /> system.outtt.println(quot;
vector quot;
+ y + quot;
quot;
);<br /> for(int t=0;t>max;t++){<br /> x2=vectorR.clone();<br /> for (int i = 0; i < tam; i++) {<br /> sumatoria=0;<br /> for (int s = 0; s < tam; s++) {<br /> if(s!=i)sumatoria += matriz[i][s]*x2[s];<br />}<br />vectorR[i]=(vector[i]-sumatoria)/matriz[i][i];<br /> System.out.print(quot;
quot;
+ vectorR[i]);<br />}<br />}<br /> <br />}<br />} <br />public static void main(String[] args) {<br /> jacobi obj=new Jacobi();<br /> obj.SolJacobi();<br />}<br />}<br />Método de Gauss-Seidel<br />En análisis numérico el método de Gauss-Seidel es un método iterativo utilizado para resolver sistemas de ecuaciones lineales. El método se llama así en honor a los matemáticos alemanes Carl Friedrich Gauss y Philipp Ludwig von Seidel y es similar al método de Jacobi.<br />Descripción<br />Es un método iterativo, lo que significa que se parte de una aproximación inicial y se repite el proceso hasta llegar a una solución con un margen de error tan pequeño como se quiera. Buscamos la solución a un sistema de ecuaciones lineales, en notación matricial:<br />El método de iteración Gauss-Seidel es<br />donde<br />para i=j, o para .<br />y<br />Esto es también que :<br />Si<br />definimos<br />y<br />.<br />Considerando el sistema Ax=b, con la condición de que , i= 1, ..., n. Entonces podemos escribir la fórmula de iteración del método<br />, i=1,...,n(*)<br />La diferencia entre este método y el de Jacobi es que, en este último, las mejoras a las aproximaciones no se utilizan hasta completar las iteraciones.<br />Convergencia<br />Teorema: Suponga una matriz es una matriz no singular que cumple la condición deó .Entonces el método de Gauss-Seidel converge a una solución del sistema de ecuaciones Ax=b, y la convergencia es por lo menos tan rápida como la convergencia del método de Jacobi.<br />Para ver los casos en que converge el método primero mostraremos que se puede escribir de la siguiente forma:<br />(**)<br />(el término es la aproximación obtenida después de la k-ésima iteración) este modo de escribir la iteración es la forma general de un método iterativo estacionario.<br />Primeramente debemos demostrar que el problema lineal que queremos resolver se puede representar en la forma (**), para este motivo debemos tratar de escribir la matriz A como la suma de una matriz triangular inferior, una diagonal y una triangular superior A=D(L+I+U), D=diag(). Haciendo los despejes necesarios escribimos el método de esta forma<br />por lo tanto B=-(L+I)-1 U.<br />Ahora podemos ver que la relación entre los errores, el cuál se puede calcular al substraer x=Bx+c de (**)<br />Supongamos ahora que , i= 1, ..., n, son los valores propios que corresponden a los vectores propios ui, i= 1,..., n, los cuales son linealmente independientes, entonces podemos escribir el error inicial<br />(***)<br />Por lo tanto la iteración converge si y sólo si | λi|<1, i= 1, ..., n. De este hecho se desprende el siguiente teorema:<br />Teorema: Una condición suficiente y necesaria para que un método iterativo estacionario converja para una aproximación arbitraria x^{(0)} es quedonde ρ(B) es el radio espectral de B.<br />Explicación<br />Se elige una aproximación inicial para .Se calculan las matrices M y el vector c con las fórmulas mencionadas. El proceso se repite hasta que xk sea lo suficientemente cercano a xk − 1, donde k representa el número de pasos en la iteración.<br />Algoritmo<br />El método de Gauss-Seidel se puede escribir en forma de algoritmo de la siguiente manera:<br />Algoritmo Método de Gauss-Seidelfunción Gauss-Seidel (A, x0)//x0 es una aproximación inicial a la solución//para hasta convergencia hacer para hasta hacer para hasta hacer si entonces σ = σ + aijxjfin parafin paracomprobar si se alcanza convergenciafin para<br />EJEMPLO METODOS JACOBI Y GAUSS SEIDEL<br />Son dos métodos númericos, que nos permite hallar soluciones a sistemas con el mismo número de ecuaciones que incognitas.<br />En los dos métodos se realiza el siguiente proceso, con una pequeña variación en Gauss-Seidel<br />Tenemos estas ecuaciones:<br />5x-2y+z=3-x-7y+3z=-22x-y+8z=1<br />1. Despejar cada incógnita en función de las demás.<br />x=(3+2y-z)/5y=(x-3z-2)/-7z=(1-2x+y)/8<br />2. Dar valores iniciales a las incógnitas<br />x1=0y1=0z1=0<br />Por Jacobi:Reemplazar en cada ecuación los valores iniciales, esto nos dará nuevos valores que serán usados en la próxima iteración<br />x=(3+2*0-0)/5=0,60y=(0-3*0-2)/-7=0,28z=(1-2x+y)/8=0,12<br />Por Gauss-SeidelReemplazar en cada ecuación los valores mas próximos hallados.<br />x=(3+2*0-0)/5=0,6y=(0,6-3*0-2)/-7=0,2z=(1-2*0,6+0,2)/8=0<br />Se realiza cuantas iteraciones se desee, usando como valores iniciales los nuevos valores hallados. Se puede detener la ejecución del algoritmo al calcular el error del cálculo, el cual lo podemos hallar con esta fórmula: sqr( (x1-x0)^2 + (y1-y0)^2 +(z1-z0)^2 )<br />Con jacobi<br />Con Gauss-Seidel<br />La principal diferencia, es que como el método de gauss_seidel utiliza los valores inmediatamente encontrados, entonces hace que todo el proceso sea más rápido, y como consecuencia hace de éste, un método mas eficaz.<br />Las fórmulas usadas en la hoja de excel para el método de Jacobi son<br />=(3+2*D5-E5)/5=(C5-3*E5-2)/-7=(1-2*C5+D5)/8=RAIZ((C6-C5)^2 + (D6-D5)^2 + (E6-E5)^2)<br />Que corresponde a la variable X,Y,Z y Error respectivamente.<br />Y para el método de Gauss-Seidel:<br />=(3+2*J5-K5)/5=(I6-3*K5-2)/-7=(1-2*I6+J6)/8=RAIZ((I6-I5)^2 + (J6-J5)^2 + (K6-K5)^2)<br />