Sunteți pe pagina 1din 12

Matemticas III

Pivoteo parcial escalonado

Realizado por: Aitor Caldern Martnez 2-Telecomunicaciones Sup.

1.- FUNCIONAMIENTO DEL PROGRAMA 1.1.- INTRODUCCIN 1.2.- FUNCIONES DE MATLAB UTILIZADAS 1.3.- FUNCIONES INTERNAS DEL PROGRAMA 1.4.- VARIABLES DEL PROGRAMA 1.5.- FUNCIONAMIENTO Y CDIGO FUENTE DEL PROGRAMA 2.- SOLUCIN DEL PROBLEMA Y OTROS EJEMPLOS 2.1.- RESOLUCIN DEL PROBLEMA DADO 2.2.- OTROS EJEMPLOS

3 3 3 4 5 6 11 11 12

1.- Funcionamiento del Programa


1.1.- Introduccin
El problema consiste en la resolucin de un sistema de ecuaciones por el mtodo de Gauss con pivoteo parcial escalonado. ste mtodo consiste en la modificacin de una matriz y posterior tratado por el mtodo de Gauss para la obtencin de de una matriz con el valor de cada una de las incgnitas que cumplen el sistema. El tratado de la matriz consiste en: -Hallar una matriz S, que contenga el mximo de cada fila de la matriz de coeficientes: Si = Max{ai , j }
i =1...n

-Se realiza un intercambio de filas con el siguiente criterio: a j ,1 ak ,1 = Max Sk j 1,..., n S j Se efecta el cambio: E1 Ek ; Ek -Una vez hecho esto, se aplica Gauss: Si ak , k 0 E1

mi , k =
~

ai , k ak , k

i>k

a i , j = ai , j ak , j mi , k
bi = bi bk mi , k
~

j = k ,..., n

i = k + 1,..., n Una vez hechos ceros debajo de la diagonal, se resuelve el sistema.

1.2.- Funciones de MatLab utilizadas


Las funciones de MatLab utilizadas el programa son: -size: Funcin que tiene como argumento una variable, y como respuesta el tamao de la misma. En el caso de una matriz, devolver el orden de la misma. Dado que el orden de una matriz no se puede colocar en una sola variable, la respuesta constar de 2 o ms variables. As pues, el programa cuya entrada sern una matriz de n x n valores, y otra de n x 1 valores, deberemos llamarla tal q as: [{N Filas},{N Columnas}] = size({Matriz en cuestin}); -abs: Funcin que tiene como argumento una variable de tipo numrico (bien sea Integer, Long, Short, etc.), y devuelve el valor absoluto del mismo.

-fprintf: Funcin que tiene como argumentos un texto, y un nmero de variables sin especificar. Su objetivo es sustituir en el texto caracteres especiales por los valores de las variables pasadas, y mostrar el resultado en forma de texto. El programa, solamente hace uso de la propiedad de sustitucin de valores de variables una vez (ms adelante, en la explicacin se mostrar donde y con que objetivo), en este nico caso, se hace uso de los caracteres especiales: %d, que significa que se muestre el valor de la variable pasada como un nmero en notacin decimal con signo. -input: Tiene como argumento un texto, que se le mostrar al usuario cuando se ejecute. La peculiaridad de esta funcin es que espera que el usuario escriba un valor, el cual ser devuelto por la misma funcin. Ejemplo: A = input(Introduzca el valor de A ); Este ejemplo mostrar el texto, y esperar a una entrada del usuario, cuyo valor ser asignado a la variable A. -cputime: Esta funcin devuelve el nmero de segundos que ha transcurrido desde la inicializacin de MatLab (no necesita argumento alguno). En el programa esta funcin es usada para calcular el tiempo que se ha tardado en hallar los valores de las incgnitas. -format: Esto ms que una funcin es una declaracin, proporciona a MatLab una forma de representar los nmeros. Su uso es simple, se escribe la palabra format, y delante se pone una palabra reservado usada para ciertos tipos de nmeros. En nuestro caso hemos usado la palabra rat, la cual provoca que MatLab trabaje con fracciones de nmeros enteros racionales, con esto se consigue un error mnimo (el error no puede llegar a ser cero, porque en la matriz de coeficientes puede haber un nmero irracional).

1.3.- Funciones internas del programa


Solo se ha usado una funcin interna del programa, a la que se ha llamado IntercambioF. Esta funcin tiene como objetivo intercambiar 2 filas de una matriz cualquiera. Los argumentos de esta funcin son, una variable que contiene Matriz a cambiar, el primer numero de fila y el segundo numero de fila a intercambiar. Para explicar el funcionamiento interno de esta funcin, se comenzar por mostrar las variables y su propsito: -Z: La variable al que se debe asignar la matriz cambiada. -V: La variable con la matriz pasada como parmetro. -f1: Una de las filas a cambiar. -f2: La otra fila a cambiar. -FV: Numero de filas de la matriz pasada como parmetro. -CV: Numero de columnas de la matriz pasada como parmetro. -CV1: Un nmero que se explicar ms adelante como es usado.

As pues, una vez explicadas la funcin de cada variable, se explica el cdigo en si:
[FV,CV] = size(V); Se obtiene el orden de la matriz pasada como parmetro, en FV, se almacena el nmero de filas, y en CV, el nmero de columnas de la misma. CV1 = 0; Se declara la variable CV1, en el fondo esta declaracin de una variable no es necesaria 1 . for n = 1:CV Este bucle sirve para recorrer cada uno de los elementos de las filas requeridas. CV1= V(f1,n); El numero CV1 contendr el valor del elemento n en la fila f1 de la matriz a cambiar. V(f1,n) = V(f2,n); Se asigna al elemento n fila f1 de la matriz a cambiar el valor del elemento n de la fila f2, de esta forma, la fila f1, pasa a ser la fila f2 2 . V(f2,n) = CV1; Se asigna al elemento n de la fila f2 de la matriz a cambiar el nmero CV1, cuyo valor, es el elemento n de la fila f1, de esta manera, la fila f2 pasa a ser la fila f1. end Termina el bucle. Z = V; Z es la variable con el resultado, que devuelve la funcin.

1.4.- Variables del programa


Una vez explicadas las funciones usadas en el programa, se procede a la explicacin de las variables usadas en el mismo, mencionando su propsito: -t: Variable a la cual se le asignar el valor que devuelva la funcin cputime justo al inicio del programa, despus ser usada para Mostar el tiempo que ha tardado el programa en hallar los valores de las variables. -nargin: Variable interna de MatLab, cuyo valor es igual al nmero de argumentos pasados a la funcin en la que se encuentre. -A: Argumento de entrada del programa en si. Esta variable debe contener una matriz cuadrada con los coeficientes de las distintas ecuaciones a resolver. -B: Argumento de entrada del programa en si. Se trata de una variable que debe contener una matriz con los trminos independientes de las ecuaciones a resolver. -F: Variable que contiene el nmero de filas de la matriz de entrada A. -C: Variable que contiene el nmero de columnas de la matriz de entrada A.
Nota del Autor: A pesar de que en MatLab estas declaraciones no son necesarias, la experiencia me dice que es mejor declarar todas las variables que van a ser usadas, adems, el programa no pierde mucho tiempo con este tipo de declaraciones. 2 Nota del Autor: MatLab, permite cambiar una variable pasada como parmetro, aunque esta, tal y como est declarada la funcin, al terminar la ejecucin de la misma no variar su valor, por ello debemos hacer uso de la variable Z.
1

-FB: Variable que contiene el nmero de filas de la matriz de entrada B. -CB: Variable que contiene el nmero de columnas de la matriz de entrada B. -S: Vector columna S del mtodo de Gauss con pivoteo parcial Escalonado. 3 -AB: Matriz que contiene la matriz A concatenada con la matriz B. 4 -i: Usada como apoyo en ms de un bucle for. -j: Igual que i, es una variable de apoyo para bucles for. -M: Usada como variable de apoyo para hallar el valor de S de cada fila. Ir tomando el valor mximo de cada coeficiente de cada fila de la matriz A. -q: Otra variable usada para un bucle for, en este caso es usada en el bucle de bsqueda de filas a intercambiar, tambin es utilizada en el bucle de creacin de ceros por el mtodo de Gauss en la matriz AB. -Max: Usada como variable de apoyo ir almacenando un valor que determinar que filas sern intercambiadas. -MaxF: Usada como variable de apoyo, contendr el numero de una fila, la cual ser intercambiada con otra ms adelante. -m: Variable de apoyo usada para guardar un multiplicando (que ir cambiando para cada fila), para la creacin de ceros en la matriz AB por el mtodo de Gauss. -X: Matriz con los resultados (valores de las variables del sistema). -Sum: Variable de apoyo utilizada para realizar un sumatorio en el bucle de despeje de las diferentes variables del sistema. -R: El resultado de la funcin debe ser asignado a esta variable, luego se le debe asignar la variable X.

1.5.- Funcionamiento y cdigo fuente del programa


El programa obtiene las incgnitas de un sistema de ecuaciones cuadrado (mismo nmero de ecuaciones y de incgnitas). Comienza por asegurarse de que el nmero de variables pasadas a la funcin como argumentos sea correcto, en caso de que no sea as, el programa pide al usuario que proporcione las matrices necesarias para resolver el sistema (matriz de los coeficientes, y matriz de trminos independientes). Una vez obtenidas ambas matrices, se procede a la validacin de las mismas, se asegura de que concuerde el numero de la matriz de los coeficientes, y la matriz de trminos independientes (que para cada ecuacin exista solo un trmino independiente, ni ms, ni
3

Nota del Autor: Esta variable se ha declarado de la siguiente manera: S = [0;0], esta declaracin un tanto extraa se debe a que si declaramos S=[], o simplemente cambiamos valores de este vector (por ejemplo: S(3) = 4), se tratara de un vector fila, sin embargo, yo pretenda conseguir que se tratase de un vector columna (simplemente para que la visualizacin de la misma en el momento de depuracin del programa fuese ms fcil), y declarar esta variable como ha sido declarada, provocara un vector columna. 4 Nota del Autor: La declaracin de esta variable, tambin puede parecer un poco extraa: AB = [A,B], sin embargo creo que es una forma limpia de concatenar A y B sin necesidad de uso de funciones (en realidad, internamente, MatLab sustituye esta declaracin por otro cdigo que hace uso de la funcin horzcat (Este tipo de declaracin tambin es utilizada al declarar X).

menos), que la matriz de trminos independientes sea un vector columna y que se trate de un sistema cuadrado (esto se realiza comprobando que el nmero de filas de la matriz de los coeficientes coincida con el nmero de columnas de la misma). Una vez comprobado que las matrices son correctas y aceptables, se procede a la obtencin de la matriz S (usada en el mtodo de Gauss con pivoteo parcial escalonado), se recorre cada fila, y en cada fila se recorre cada columna de la matriz de coeficientes, buscando el mximo de esta fila, de manera que la matriz S albergar los mximos de cada fila de la misma matriz. A su vez, se asegura de que ninguno de los valores de S hallados sean iguales a cero, puesto que esto implicara que el sistema no tiene solucin nica (en el caso de que esto ltimo se cumpliese, se muestra un mensaje informando del error, y se procede a la salida del programa). Una vez hallada la matriz S, se ordenan las columnas, de manera que el mximo quede en la primera fila, y el mnimo en la ltima (el criterio de ordenacin es el correspondiente al mtodo de Gauss con pivoteo parcial escalonado explicado en la introduccin). Una vez ordenada la matriz, se hacen ceros en la misma debajo de la diagonal principal. Al finalizar este proceso, se procede a la bsqueda de ceros en la diagonal, si se diese el caso de que alguno de los elementos de la misma es cero, se procede a la muestra de un mensaje de error, y se sale del programa. Finalmente se resuelve el sistema, sabiendo que el ltimo elemento de la matriz de incgnitas es igual al ltimo elemento de la matriz de trminos independientes modificada dividido entre el valor de la matriz de coeficientes modificada, una vez tenemos el ltimo elemento, los dems se hallan haciendo uso de un bucle que comienza en la penltima fila y termina en la primera y multiplicando las variables que conocemos por los sus respectivos coeficientes y sumando estos resultados, una vez hallada la suma, se le resta al trmino independiente correspondiente, y se divide entre el elemento de la diagonal correspondiente. Al terminar el bucle se obtiene la matriz de las incgnitas, la cual se asigna a la variable que debe tener el resultado del programa. A continuacin se muestra el cdigo fuente comentado detalladamente lnea a lnea (se omitir lo ya explicado como para que sirven las funciones, el propsito de cada variable etc.). function R = GPivParEsc(A,B) Se declara la funcin principal, que tiene como parmetros las variables A y B, y el resultado de la funcin, ser la variable R. t = cputime; Se obtienen los segundos actuales, para despus restrselos a los segundos que devuelva la funcin cputime al final del programa, esta diferencia ser el tiempo empleado en ejecutar el programa. format rat; El formato acordado es rat. if ((nargin < 2) | (nargin > 2)) En el caso de que el nmero de argumentos no sea el necesario, se procede a pedir las matrices A y B. fprintf('El numero de argumentos difiere del necesario.\n'); A = input('Por favor escriba a continuacion la matriz de incognitas A:\n'); Se pide la matriz A al usuario. B = input('A continuacion escriba la matriz de elementos independientes B:\n'); Se pide la matriz B al usuario. end

Fin de la condicin. [F,C] = size(A); Se obtiene el nmero de filas y columnas de la matriz A. [FB,CB] = size(B); Se obtiene el nmero de filas y columnas de la matriz B. if ((F ~= C) | (CB > 1) | (FB ~= F)) En el caso de que el numero de filas difiera con el de columnas en la matriz A (esto significara que no es cuadrada), o en el caso de que el nmero de columnas sea mayor de 1 (esto significara que no es un vector), o en el caso de que el nmero de filas de la matriz A y la matriz B difieran (esto significara que hay ms, o menos, trminos independientes que ecuaciones), procedemos a informar del error. fprintf('Error: El orden de la matriz A y/o la matriz B, no es/son el/los correcto/s. \n Por favor reviselo'); Se informa del error. return; Se sale de la funcin sin ningn valor que retornar. end Fin de la condicin. S = [0;0]; Se declara el vector S. AB = [A,B]; Se declara AB, resultado de la concatenacin horizontal de A y B. for i = 1:F Para cada una de las filas: M = abs(A(i,1)); %Tomamos el primer elemento Se declara M como el primer elemento (de este modo se ahorra una comparacin, y se comienza el bucle por el segundo elemento). for j = 2:C Para cada una de las columnas: if abs(A(i,j)) > M Si el elemento actual es mayor que el mximo registrado previamente: M = abs(A(i,j)); M pasar a tomar el nuevo mximo. end Fin de la condicin end Fin del bucle de columnas. S(i) = M; El elemento S de la fila actual ser el mximo registrado entre todas las columnas de la fila. if S(i) == 0 Si el mximo es 0, el sistema no tiene solucin nica. fprintf('No existe solucion unica para el sistema. Finalizado SIN exito'); Se muestra el mensaje. return; Se sale de la funcin sin resultado alguno. end

Fin de la condicin. end Fin del bucle de filas. for i = 1:(C-1) Para cada una de las columnas, menos la ltima (la ltima no necesita aplicar este criterio, puesto que se buscara el mximo entre 1 elemento, por consiguiente el mximo sera ese mismo elemento). for q = i:(F) Se recorren las filas desde la fila donde se encuentra el elemento de la diagonal de la columna actual hasta la ltima fila. MaxF = q; Inicialmente, Se asigna MaxF (el nmero de fila que contiene el mximo) la fila actual, as se ahorra una comparacin. Max = abs(AB(q,i))/S(q); Al igual que antes, el valor mximo inicialmente, ser el de la fila actual, lo cual ahorrar una comparacin. for j = (q+1):F Se recorren todas las filas, a excepcin de la primera, que ya hemos asignado. if AB(j,i)/S(j) > Max Si el elemento actual dividido por el elemento del vector S correspondiente es mayor que el mximo registrado: Max = abs(AB(j,i))/S(j); Se actualiza la variable que contiene el mximo. MaxF = j; Al igual que la variable que registra el nmero de lnea que contiene el mximo. end Finaliza la condicin. end Final del bucle que recore las filas if (MaxF ~= q) Si la fila inicial difiere de la fila que contiene el mximo: AB = IntercambioF(AB,MaxF,q); Se intercambian las filas necesarias en AB (a partir de ahora se trabajar con esta matriz por comodidad). S = IntercambioF(S,MaxF,q); Puesto que las lneas en AB, han cambiado, tambin deben hacerlo en S. end Final de la comparacin end Final del bucle, la columna actual se encuentra organizada if (AB(i,i) == 0) No debe haber ningn elemento en la diagonal de AB ordenada, puesto que en este caso no existira solucin nica, en el caso de que ocurriera: fprintf('No existe solucion unica para el sistema. Finalizado SIN exito'); Se muestra el mensaje con el error.

return; Se sale del programa sin valor de retorno. end Fin del bucle de filas. for j = (i+1):F Para cada fila de la columna actual, que se encuentra ebajo de la diagonal de la misma columna: m = (AB(j,i)/AB(i,i)); Se obtiene el multiplicando para hacer ceros por el mtodo de Gauss for q = 1:(C+1) Para cada elemento de la fila actual: AB(j,q) = AB(j,q) - m*AB(i,q); Se realiza la operacin de acuerdo al mtodo de Gauss. end Fin del bucle de columnas. end Fin del bucle de filas. end Fin del bucle de columnas, y obtenida la matriz con todos los valores debajo de la diagonal principal iguales a cero. for i = 1:F Para cada Fila: if (AB(i,i) == 0) Se busca de que ningn elemento de la diagonal de la matriz con ceros sea cero, en caso de que esto ocurriera: fprintf('No existe solucion unica para el sistema. Finalizado SIN exito'); Se muestra el mensaje return; Se sale de la funcin sin valor de retorno. end Final de la comparacin. end Final del bucle. X = [0;0]; Se declara la matriz con los resultados. X(F) = AB(F,F+1)/AB(F,F); El ltimo elemento de la Matriz AB, partido por el coeficiente situado a la iquierda de este valor, es exactamente el valor de la tima incgnita. for i = (F-1):-1:1 Para las dems, se recorren las filas en orden inverso, y se van calculando una a una, terminando con la primera. Sum = 0; Se asigna el valor 0 a la variable Sum, que se usar para calcular el sumatorio. 5 for j = (i+1):F
Esta variable debe inicializarse, y ponerse a cero porque cuando el bucle que recorre las filas realice la 2, 3, n-sima pasada, la variable contendr el valor de el/los anterior/es sumatorio/s.
5

Se recorren las Columnas multiplicando cada valor de incgnita que se conoce, multiplicado por su coeficiente, para de esta manera, despejar la siguiente incgnita. Sum = Sum + AB(i,j)*X(j); End Fin del bucle. X(i) = (AB(i,F+1)-Sum)/AB(i,i); Se obtiene la incgnita end Fin del bucle de filas. fprintf('Resolucion del sistema concluida en: %d segundos. El resultado: \n',(cputime - t)); Se muestra el mensaje de conclusin exitosa, el tiempo que ha tardado, R = X; Y el resultado se asigna en la variable de respuesta.

2.- Solucin del problema y otros ejemplos


2.1.- Resolucin del problema dado
Una vez terminado el programa, procedemos a la resolucin del sistema dado, que da como resultado en el programa: >> A=[1,3,5,6;5,4,3,0;0,3,4,2;4,1,2,0] A= 1 5 0 4 3 4 3 1 5 3 4 2 6 0 2 0

>> B=[3;0;6;1] B= 3 0 6 1 >> GPivParEsc(A,B) Resolucion del sistema concluida en: 6.200000e-002 segundos. El resultado: ans = -13/14 -34/35

199/70 -43/35 {El tiempo variar dependiendo del ordenador} As pues, tenemos la solucin, que se guardar el la variable ans de MatLab.

2.2.- Otros ejemplos


Un ejemplo: 5x+9y+9z+5t=65 54x+7y+4z+4t=84 6x+5y+231z+9t=12 8x+3y+8z+100t=8 Cuyo resultado: x=-13/14 y=-34/35 z=199/70 t=-43/35 Y por ltimo un ejemplo especial, en el que hay dos ecuaciones semejantes (una es resultado de una constante por la otra): 3x+7x+9z=12 9x+21y+27z=36 6x+12y-z=14 El resultado: GPivParEsc(A,B) No existe solucion unica para el sistema. Finalizado SIN xito Que es exactamente lo esperado.

S-ar putea să vă placă și