Sei sulla pagina 1di 8

Laboratorio # 3

Eliminacin de Gauss
Victor Snchez Urrutia

1.

Objetivos
Entender sobre las fuentes de error en algortmos numricos.
Aprender a usar Scilab para programar, graficar y realizar exploraciones numricas.

2.

Uso de sta gua


Esta gua de laboratorio contiene:

1. Parte de la teora requerida para poder realizar y entender el experimento numrico propuesto, recomendamos que lea bien sta
gua antes del principio de la sesin de laboratorio.
2. Una serie de pasos o acciones que deben ejecutar en el laboratorio.
Para que sea ms fcil de localizar estos pasos dentro del documento, stos sern resaltados de la siguiente manera:

Paso 0
Este es un ejemplo de como aparecern los pasos a acciones a
realizar. Fijes que est enumerado.
3. Adems de las acciones a tomar se les harn preguntas o se les
pedir que realice trabajo extra. Estas preguntas o trabajos extras
son los que deben entregarse como su informe de laboratorio. Para

que sea fcil localizarlas y no se le olvide, las resaltaremos de la


siguiente manera:

0
Ejemplo: Modificar el programa xxx para que calcule otra cosa. Entregue el programa en su informe. Piensa usted que la
nueva versin es ms rpida?
4. En algunas situaciones haremos comentarios importantes que indicaremos de la siguiente manera:

Divisin entre cero


Al calcular el error aproximado, se puede dar el caso que el
nuevo o mejor valor sea cero y por consiguiente el error
aproximado sea infinito...
Los informes de laboratorio deben ser entregados antes del laboratorio siguiente. El informe debe estar contenido en una archivo Word u
OpenOffice con todas sus grficas y tablas incluida en el mismo documento. Debe tratar de que su escritura sea coherente y todas las preguntas que se le hicieron en la gua estn contempladas. Si se le pide que
haga o modifique programas estos deben ser entregados en archivos
aparte, tambin cualquier archivo de datos utilizados.
Estos archivos sern entregados segn instruccin del profesor o profesor de laboratorio utilizando la plataforma Moodle.

3.

Procedimiento
Paso 1
Escriba la siguiente funcin en un archivo llamado gauss.sci. Ntese el uso del comando halt para detener el programa y poder ver
resultados parciales lo que facilita la depuracin y verificacin del
mismo.
Tambin investigue el comando pause que permite parar e inspeccionar el valor de las variables, etc. Cuando se tiene duda de como
est funcionando un programa o se quiere verificar algn valor intermedio se puede usar pause para detener el programa y regresar
a la lnea de comando. El comando return reinicia la ejecucin del
programa.

function [ deter , sol ] = gauss ( a , b )

2
3
4
5
6
7
8
9
10
11

//
//
//
//
//
//
//
//
//

Esta funcion implementa e l metodo de Gauss


para l a s o l u c i o n de sistemas de ecuaciones
l i n e a l e s . Ademas , l a funcion c a l c u l a e l
determinante de l a matriz .
Forma de uso :
[ deter , s o l ] = gauss (A, B )
para Ax=B
A debe ser cudrada y B tener e l mismo numero de f i l a s .

12
13
14
15

// Verificamos primero s i l o s datos tienen l a dimension


// correcta .

16
17
18

[ n ,m] = size ( a ) ;
[ nb ,mb] = size ( b ) ;

19
20
21
22

i f n~=m then
error ( " La matriz A debe ser cuadrada " )
end ;

23
24

i f n~=nb then
3

25
26

error ( " La matriz B debe tener e l mismo numero de l i n e a s que A" )


end ;

27
28
29

// Todo bien en cuanto a dimensiones . . . Creamos ahora


// l a matriz aumentada

30
31

c = [a,b];

32
33

// Realizamos ahora l a reduccion por l i n e a s y columnas

34
35
36
37
38
39
40
41
42
43
44

disp ( c ) ,
halt
for i = 1 :n1
// Para cada l i n e a . .
pivote = c ( i , i ) ;
for j = i +1:n
c ( j , : ) = c ( j , : ) c ( i , : ) * ( c ( j , i ) / pivote ) ;
disp ( c ) , halt ; // Comando usado para ayudar a depurar
end ;
end ;

45
46
47
48
49

//
//
//
//

en e s t e punto , s i no hemos encontrado un p i v o t e


cero o muy pequeno , estamos bien .
E l determinante es l a m u l t i p l i c a c i o n de l a
diagonal

50
51
52
53
54

deter = 1 ;
for i = 1 :n
deter = deter * c ( i , i ) ;
end ;

55
56
57

// Ahora haremos l a s u b s t i t u c i o n hacia atras para encontrar


// l a s o l u c i o n

58
59
60
61
62

for i = n: 1:1
sol ( i ) = c ( i , n + 1 ) ;
for j = i +1:n
sol ( i ) = sol ( i )c ( i , j ) * sol ( j ) ;
4

63
64
65
66
67
68

end ;
sol ( i ) = sol ( i ) / c ( i , i ) ;
disp ( sol ) ,
halt
end ;
endfunction
Pruebe la funcin comparando su resultado, para varios juegos de
valores, con los resultados de las funciones de Scilab (a
b).

1
Intente ahora usando los valores:

2
0 3 1

A= 1 2 4 yb= 3
1
3 1 8
y compare con el comando de Scilab para resolver ecuaciones lineales: A\b

2
Modifique el programa para implementar el intercambio de filas para siempre maximizar el pivote. Utilice escalamiento para determinar el pivote, pero no para encontrar la solucin. Recuerde que el
signo del determinante cambia al intercambiarse las filas.

Paso 2
Escriba la siguiente funcin que implementa el mtodo de GaussSeidel
1

function [ sol ] = g se id e l ( a , b )

2
3
4
5
6

//
//
//
//

Programa que implementa e l metodo


GaussS e i d e l para l a s o l u c i o n de sistemas
l i n e a l e s simultaneos . Tomaremos
como valor i n i c i a l un vector de ceros .

7
8
9

// verificamos primero s i l o s datos tienen l a dimension

10

// correcta .

11
12
13

[ n ,m] = size ( a ) ;
[ nb ,mb] = size ( b ) ;

14
15
16
17

i f n~=m then
error ( " La matriz de c o e f i c i e n t e s debe ser cuadrada . " )
end ;

18
19
20
21

i f n~=nb then
error ( " La matriz de resultados debe tener e l mismo numero de l i n e a s que l a
end ;

22
23
24

// Las entradas estan bien . Como resultado i n i c i a l


// tomaremos un vector de ceros :

25
26

sol = zeros ( n , 1 ) ;

27
28
29
30
31

//
//
//
//

Iteraremos mientras e l cambio en x sea mayor 1e7


Ponemos un valor i n i c i a l en e l vector s o l v i e j o s o l o
para asegurarnos que ejecutamos e l " while " a l menos
una vez .

32
33

s o l v i e j o = ones ( n , 1 ) ;

34
35
36
37

d i f f s o l = max( abs ( s o l v i e j o sol ) ) ;


diffsolviejo = diffsol ;
iter = 1

38
39
40
41

while d i f f s o l > 0.0000001


mprintf ( " \n\n\n I t e r a c i n : %d\n" , i t e r ) ;
mprintf ( " d i f f s o l = %e, d i f f s o l v i e j o = %e\n" , d i f f s o l , d i f f s o l v i e j o )

42
43
44
45
46
47

i f d i f f s o l > d i f f s o l v i e j o then
pr intf ( " E l algoritmo esta divergiendo . Adios ! \ n" )
break
end ;
// Para ver que esta pasando . . .
6

48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

mprintf ( "Cambio = %e, \ n" ,max( abs ( s o l v i e j o sol ) ) )


disp ( sol ) ,
halt
s o l v i e j o = sol ;
for i = 1 :n
temp = 0 ;
for j = 1 :n
i f j ~= i then
temp = temp + a ( i , j ) * sol ( j ) ;
end ;
end ;
sol ( i ) = ( b ( i ) temp ) / a ( i , i ) ;
end ;
diffsolviejo = diffsol ;
d i f f s o l = max( abs ( s o l v i e j o sol ) ) ;

64
65
66
67

iter = iter + 1
end ;
endfunction

3
Fjese en el clculo del error.. Qu tipo de norma estamos aplicando para obtener la magnitud del error?

Paso 3
Pruebe su programa con los

m= 1
3

siguientes datos:

3 1
2

6 4 ys= 3
1 8
1

y compare con la funcin de Scilab m\s

Paso 4
Utilice ahora los valores:

2 3 1
2

m= 1 6 4 ys= 3
3 1 8
1

Ntese que la matriz m slo ha cambiado en el elemento 1,1. No es


necesario introducir toda la matriz nuevamente: solo haga m(1,1)
= 2.

4
Ejecute gseidel con los nuevos argumentos. Qu paso? Compruebe, usando m\s que el sistema si tiene solucin. Cmo se puede
arreglar el algoritmo para que encuentre la solucin?

5
Modifique el programa para utilizar el mtodo Gauss-Seidel con relajacin. Aada un parmetro (lambda) que controlara el grado de
relajacin. Ahora trate de resolver uno de los problemas anteriores,
variando lambda con los valores: 0.5, 1.0, 1.5, 2. Cantas iteraciones tom en cada caso?