Você está na página 1de 11

Matrices Especiales.

 
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:
 
f0 g0       x0   b0
e1 f1 g1     x1 = b1
  e2 f2 g2   x2   b2
    e3 f3   x3   b3
 
Basados en la descomposición LU podemos ver que el algoritmo de Thomas es:
 
ek
ek 
f k 1
f k  f k  ek * g k 1

k  1,.., n  1
 
 
La sustitución hacia adelante es
 
bk  bk  ek * rk 1
k  1,.., n  1
 
y hacia atrás es:
 

xn 1  bn 1 / f n
k  n  2,...,0
r  g k xk 1
xk  k
fk
 
Ejemplo:
 
Resuelva el siguiente sistema tridiagonal por medio del algoritmo de Thomas.
 
2.04 -1       x0   40.8
-1 2.04 -1     x1 = 0.8
  -1 2.04 -1   x2   0.8
    -1 2.04   x3   200.
8
 
La solución de la descomposición triangular es:
 
2.04 -1    
-0.49 1.55 -1  
  -0.645 1.395 -1
    -0.717 1.323
 
 
La solución del sistema es:
 
X = [65.970, 93.778, 124.538, 159.480]T
 
Descomposición de Cholesky.
 
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.
 
Así tomando las ecuaciones para la factorización LU la podemos adaptar como:
Podemos ver, que cualquier elemento bajo la diagonal se calcula como:
j 1
ai , j   ai ,k ak , j
ai , j  k 0
a j, j
para todo i=0,...,n-1 y j = 0,...,i-1.
 
Para los términos arriba de la diagonal, en este caso solo la diagonal
 
i 1
a i ,i  a i ,i   a i , k a i , k
k 0

para todo i=0,...,n-1.


 
La implementación en Java es:
 
static public void Cholesky(double A[][]) {
int i, j, k, n, s;
double fact, suma = 0;
 
n = A.length;
 
for (i = 0; i < n; i++) { //k = i
for (j = 0; j <= i - 1; j++) { //i = j
suma = 0;
for (k = 0; k <= j - 1; k++) // j = k
suma += A[i][k] * A[j][k];
 
A[i][j] = (A[i][j] - suma) / A[j][j];
}
 
suma = 0;
for (k = 0; k <= i - 1; k++)
suma += A[i][k] * A[i][k];
A[i][i] = Math.sqrt(A[i][i] - suma);
}
}
  Método de Jacobi

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.

Descripción

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.

La sucesión se construye descomponiendo la matriz del sistema en la forma siguiente:

donde

, es una matriz diagonal.

, es una matriz triangular inferior.

, es una matriz triangular superior.

Partiendo de , podemos reescribir dicha ecuación como:

Luego,

Si aii ≠ 0 para cada i. Por la regla iterativa, la definición del Método de Jacobi puede ser
expresado de la forma:
donde k es el contador de iteración, Finalmente tenemos:

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.

Convergencia

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.

Algoritmo

El método de Jacobi se puede escribir en forma de algoritmo de la siguiente manera:

Algoritmo Método de Jacobi

funció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 para
fin para

comprobar si se alcanza convergencia

fin para

algoritmo en java
public class Jacobi {

double [][]matriz={{4,-2,1},{1,-5,3},{2,1,4}};
double []vector={2,1,3};
double []vectorR={1,2,3};
double []x2=vectorR;
double sumatoria=1;
int max=50;
public void SolJacobi(){
int tam = matriz.length;
for (int y = 0; y < 10; y++) {
system.outtt.println("\nvector " + y + "\n");
for(int t=0;t>max;t++){
x2=vectorR.clone();
for (int i = 0; i < tam; i++) {
sumatoria=0;
for (int s = 0; s < tam; s++) {
if(s!=i)sumatoria += matriz[i][s]*x2[s];
}
vectorR[i]=(vector[i]-sumatoria)/matriz[i][i];
System.out.print(" " + vectorR[i]);
}
}

}
}
public static void main(String[] args) {
jacobi obj=new Jacobi();
obj.SolJacobi();
}
}
Método de Gauss-Seidel

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.
Descripción

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:

El método de iteración Gauss-Seidel es

donde

para i=j, o para .

Esto es también que :

Si

definimos

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

, i=1,...,n(*)

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.
Convergencia
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.

Para ver los casos en que converge el método primero mostraremos que se puede escribir
de la siguiente forma:

(**)

(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.

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

por lo tanto B=-(L+I)-1 U.

Ahora podemos ver que la relación entre los errores, el cuál se puede calcular al substraer
x=Bx+c de (**)

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

(***)
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:

Teorema: Una condición suficiente y necesaria para que un método iterativo


estacionario converja para una aproximación arbitraria
x^{(0)} es que

donde ρ(B) es el radio espectral de B.

Explicación

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.

Algoritmo

El método de Gauss-Seidel se puede escribir en forma de algoritmo de la siguiente manera:

Algoritmo Método de Gauss-Seidel

funció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

σ = σ + aijxj

fin para
fin para

comprobar si se alcanza convergencia

fin para

EJEMPLO METODOS JACOBI Y GAUSS SEIDEL

Son dos métodos númericos, que nos permite hallar soluciones a sistemas con el mismo
número de ecuaciones que incognitas.

En los dos métodos se realiza el siguiente proceso, con una pequeña variación en Gauss-
Seidel

Tenemos estas ecuaciones:

5x-2y+z=3
-x-7y+3z=-2
2x-y+8z=1

1. Despejar cada incógnita en función de las demás.

x=(3+2y-z)/5
y=(x-3z-2)/-7
z=(1-2x+y)/8

2. Dar valores iniciales a las incógnitas

x1=0
y1=0
z1=0

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

x=(3+2*0-0)/5=0,60
y=(0-3*0-2)/-7=0,28
z=(1-2x+y)/8=0,12
Por Gauss-Seidel
Reemplazar en cada ecuación los valores mas próximos hallados.

x=(3+2*0-0)/5=0,6
y=(0,6-3*0-2)/-7=0,2
z=(1-2*0,6+0,2)/8=0

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 )

Con jacobi
Con Gauss-Seidel

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.

Las fórmulas usadas en la hoja de excel para el método de Jacobi son

=(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)

Que corresponde a la variable X,Y,Z y Error respectivamente.

Y para el método de Gauss-Seidel:

=(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)

Você também pode gostar