Está en la página 1de 22

U.A.N.L. FACULTAD DE CIENCIAS DE LA TIERRA.

Metodos Numericos Lineales y no Lineales usando GUI

ALUMNO(s): Alan Villegas Rios Edie Arturo Portales Barbosa Orlando Muiz Hernandez

GRUPO: 008 MATRICULA(s): 1483339 1474939 1489689

Ex -Hacienda de Guadalupe, Linares, Nuevo Len a 10 de Mayo del 2012 1

ndice Lineales
Eliminacin Gaussiana - Definicin programa - Cdigo Gauss-Jordan - Definicin programa - Cdigo Matriz inversa - Definicin programa - Cdigo Determinante - Definicin programa - Cdigo . . . . . .

Pag.
3 6 8 7 10 9

. 12 . 13

No Lineales
Biseccin Definicin programa - Cdigo Secante - Definicin programa - Cdigo Newton Raphson - Definicin programa - Cdigo Falsa Posicin - Definicin programa - Cdigo . 14 . 15 . 16 . 17 . 18 . 19

. 20 . 21

Conclusiones

. 22

Comencemos definiendo los programas usados para nuestro men

Mtodos Numricos
Lineales
Eliminacin Gaussiana Gauss-Jordan Matriz inversa Determinante

No Lineales
Biseccin Secante Newton Raphson Falsa Posicin

Mtodos numricos Lineales


Eliminacin Gaussiana

Aqu tenemos nuestro programa en GUI se agregaron mtodos de gauss por pivoteo parcial y Parcial ficticio En la parte de historial de Mtodos al mover el slider nos muestra los pasos que sigui nuestro mtodo a elegir Tambin hay 3 botones uno que genera una matriz aleatoria, otro que nos da la opcin de meter nuestra propia matriz, y por ultimo tenemos el botn de aplicar mtodo, este es el que lleva el cdigo que nos interesa. Tenemos 2 editexts que al mover el slider del historial nos va mostrando los pasos que hizo para resolver la matriz usando el mtodo que elegimos El cdigo es muy largo y dada la complejidad del programa mostrare solo la parte del cdigo importante en la cual esta los algoritmos de los mtodos ya mencionados

global datos if isempty(datos.a) return end a=datos.a; n=length(a); l=eye(size(a)); p=1:n; g=[]; g{1}.matriz=a; g{1}.if=[]; g{1}.ic=[]; g{1}.p=p; g{1}.operacion=' '; escribir(a,handles.matrizu) set(handles.operacion,'string',g{1}.operacion); guidata(handles.operacion,handles); if datos.metodo==3 set(handles.vectorp,'visible','on'); set(handles.text10,'visible','on'); else set(handles.vectorp,'visible','off'); set(handles.text10,'visible','off'); end m=1; for i=1:n if datos.metodo>1 [aux,r]=max(abs(a(p(i:n),i))); r=r+i-1; if datos.metodo==2 & r~=i; % escribir(l,handles.matrizl,[],[i,r])1 m=m+1; g{m}.matriz=a; g{m}.if=[i,r]; g{m}.ic=[]; g{m}.operacion=['Intercambio filas ' num2str([i,r])]; set(handles.operacion,'string',g{m}.operacion); escribir(a,handles.matrizu,[i,r],[]); pause(datos.pausa); a([r,i],:)=a([i,r],:); m=m+1; g{m}.matriz=a; g{m}.if=[i,r]; g{m}.ic=[]; g{m}.p=p; g{m}.operacion=['Intercambio filas ' num2str([i,r])]; set(handles.operacion,'string',g{m}.operacion); escribir(a,handles.matrizu,[i,r],[]); % escribir(l,handles.matrizu,[],[r,i]) % escribir(l,handles.matrizl,[r,i],[])

end

if datos.metodo==3 & p(r)~=p(i); m=m+1; g{m}.matriz=a; g{m}.if=[p(i),p(r)]; g{m}.ic=[]; g{m}.p=p; escribir(a,handles.matrizu,[p(i),p(r)],[]) g{m}.operacion=['Intercambio filas ' num2str([p(i),p(r)])]; set(handles.operacion,'string',g{m}.operacion); set(handles.vectorp,'string',num2str(p)); guidata(handles.vectorp, handles); pause(datos.pausa) p([r i])=p([i r]); %a([r,i],:)=a([i,r],:); m=m+1; g{m}.matriz=a; g{m}.if=[p(i),p(r)]; g{m}.ic=[]; g{m}.p=p; escribir(a,handles.matrizu,[p(i),p(r)],[]) g{m}.operacion=['Intercambio filas ' num2str([p(i),p(r)])]; set(handles.operacion,'string',g{m}.operacion); end end for k=i+1:n %l(k,i)=a(k,i)/a(i,i); l(k,i)=a(p(k),i)/a(p(i),i)*l(i,i); a(p(k),i+1:n)=a(p(k),i+1:n)-l(k,i)*a(p(i),i+1:n); a(p(k),i)=0; escribir(a,handles.matrizu,p(k),i); m=m+1; g{m}.matriz=a; g{m}.if=p(k); g{m}.ic=i; g{m}.p=p; g{m}.operacion=['Cero en ' num2str([p(k) i]) ' con fila ' num2str([p(i),i])]; set(handles.operacion,'string',g{m}.operacion); if datos.metodo~=2 escribir(l,handles.matrizl); end pause(datos.pausa)

% % %

end end escribir(a,handles.matrizu,p(k),i); m=m+1; g{m}.matriz=a; g{m}.if=[ ]; g{m}.ic=[ ]; g{m}.p=p; g{m}.operacion='Fin triangulacion'; set(handles.operacion,'string',g{m}.operacion); %set(handles.slides,'min',1,'max',m) datos.historial=g; set(handles.slides,'sliderstep',[1/(m-1) 1/(m-1)]) set(handles.slides,'value',0) set(handles.slides,'visible','on'); guidata(hObject, handles);

Gauss-Jordan
En matemticas, la eliminacin Gaussiana, eliminacin de Gauss o eliminacin de Gauss-Jordan, llamadas as debido a Carl Friedrich Gauss y Wilhelm Jordan, son algoritmos del lgebra lineal para determinar las soluciones de un sistema de ecuaciones lineales, encontrar matrices e inversas. Un sistema de ecuaciones se resuelve por el mtodo de Gauss cuando se obtienen sus soluciones mediante la reduccin del sistema dado a otro equivalente en el que cada ecuacin tiene una incgnita menos que la anterior. Cuando se aplica este proceso, la matriz resultante se conoce como: "forma escalonada". Algoritmo de eliminacin de Gauss-Jordan 1. Ir a la columna no cero extrema izquierda 2. Si el primer rengln tiene un cero en esta columna, intercambiarlo con otro que no lo tenga 3. Luego, obtener ceros debajo de este elemento delantero, sumando mltiplos adecuados del rengln superior a los renglones debajo de l 4. Cubrir el rengln superior y repetir el proceso anterior con la submatriz restante. Repetir con el resto de los renglones (en este punto la matriz se encuentra en la forma de escaln) 5. Comenzando con el ltimo rengln no cero, avanzar hacia arriba: para cada rengln obtener un 1 delantero e introducir ceros arriba de ste sumando mltiplos correspondientes a los renglones correspondientes

Este programa es mucho mas bsico que el anterior su cdigo es el siguiente


function varargout = pushbutton1_Callback(h, eventdata, handles, varargin) A=str2num(get(handles.edit1,'string'));

[m,n]=size(A); for i=1:m divisor=A(i,i); for j=i:n A(i,j)=A(i,j)/divisor; end for k=1:m if i~=k pivote = A(k,i); for j=i:n A(k,j)=A(k,j)- pivote*A(i,j); end end end end for i=1:m x(i)=A(i,n); end x=x'; t=1:m; t=t'; cadena=''; for t=1:m cad=sprintf('x%d=%6.2f',t,x(t)); cadena=[cadena;cad]; end set(handles.edit2,'string',cadena);

Matriz inversa

Mtodo de Gauss-Jordan para el clculo de la matriz inversa El mtodo de Gauss - Jordan para calcular la matriz inversa de una dada se basa en una triangularizacin superior y luego otra inferior de la matriz a la cual se le quiere calcular la inversa.

10

Codigo del programa


function pushbutton1_Callback(hObject, eventdata, handles) valor=get(handles.edit1,'string'); valor=str2num(valor); inversa=valor.^-1; set(handles.edit2,'string',num2str(inversa))

11

Determinante de la Matriz

Introduciremos a continuacin el concepto de determinante asociado a una matriz cuadrada. Este concepto permite simplicar operaciones matriciales tales como el calculo del rango o de la matriz inversa. Denfinicin: Si es una matriz 2 x 2 se dene el determinante de la matriz A, y se expresa como det(A) o bien |A|, como el nmero:

Ejemplos: El clculo de los determinantes de orden 2 es bien sencillo, por ejemplo:

Para denir determinantes de matrices de orden mayor que 2 es necesario introducir previamente algunos conceptos. Dada una matriz cuadrada A de orden n, denimos el menor complementario de un elemento de A,aij , como el determinante de la matriz que se obtiene al suprimir la la i y la columna j en la que se encuentra dicho elemento aij . Se representa por Mij .

12

Cdigo del programa


function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) valor=get(handles.edit1,'string'); valor=str2num(valor); deter=det(valor); set(handles.edit2,'string',num2str(deter))

13

Mtodos numricos No Lineales


Mtodo de biseccin Mtodo que requiere de un intervalo el cual contenga la raz, esto es, que necesita de dos valores iniciales que estn cada uno a un lado de la raz. Para encontrar un intervalo que tenga un cambio de signo al evaluar la funcin, se divide cada intervalo creado en dos sub-intervalos, se evala cada uno de los subintervalos para encontrar el cambio de signo. Conforme el proceso se repite los sub-intervalos se hacen mas pequeos y y la aproximacin ala raz mejora. Paso 1. Se escogen los valores iniciales del intervalo xl y xu, de forma tal que la funcin cambie de signo sobre el intervalo, o lo que es lo mismo f(xl)f(xu)<0 Paso 2. Encontrar la primera aproximacin a la raz: xr = (xl+xu)/2 Paso 3. Determinar el sub-intervalo en el que eta la raz: Si f(xl)f(xr) < 0 entonces la raz esta en el sub-intervalo [xl, xr] y xu = xr Si f(xl)f(xr) > 0 entonces la raz esta en el sub-intervalo [xr, xu] y xl = xr Si f(xl)f(xr) == 0 entonces la raz esta en el xr Paso 4. Calcular una nueva aproximacin a la raz: xr = (xl+xu)/2 Paso 5. Evaluar el error relativo aproximado:

14

Ejemplo usado
Funcion= x*cos(x)-2*x^2+3*x-1 a=.2 b=.3 error=0.1
f=get(handles.edit1,'string'); f=inline(f); ezplot(f), grid on

Cdigo de grafica Cdigo del programa


function varargout = pushbutton1_Callback(h, eventdata, handles, varargin) f=get(handles.edit1,'string'); f=inline(f); a=str2double(get(handles.edit2,'string')); b=str2double(get(handles.edit3,'string')); E=str2double(get(handles.edit4,'string')); if f(a)*f(b)< 0 while abs(b-a)>E x=(a+b)/2; if f(a)*f(x)==0 a=b; else if f(a)*f(x)<0 b=x; else a=x; end end set(handles.edit5,'string',x); end else set(handles.edit5,'string','No existe la raiz en el intervalo'); end

15

Mtodo de la Secante
Cuando existe problema al derivar una funcin, la derivada se puede aproximar a travs de una secante, la cual corta en dos puntos xi-1 y xi a la funcin. Los dos puntos que cortan a la funcin son datos y no requiere que al evaluarse la funcin con estos puntos, esta cambie de signo como en el mtodo de biseccin. La derivada se puede aproximar a la pendiente de esa secante:

Al sustituir en la ecuacin de Newton raspn, se tiene la ecuacin iterativa de la secante:

16

Ejemplo usado
Funcion = x^3+2*x^2+10*x-20 x0=0 x1=1 e=.001 Cdigo del programa
function varargout = pushbutton3_Callback(h, eventdata, handles, varargin) f=inline(get(handles.edit1,'string')); x0=str2double(get(handles.edit2,'string')); x1=str2double(get(handles.edit3,'string')); E=str2double(get(handles.edit4,'string')); while abs(x1-x0)>E x2=x1-(((x1-x0)*f(x1))/(f(x1)-f(x0))); x0=x1; x1=x2; end set(handles.edit5,'string',x2)

Cdigo del grafico


f=get(handles.edit1,'string'); f=inline(f); ezplot(f), grid on

17

Newton Raphson
Se necesita un valor inicial prximo a la raz, con ese valor se extiende una tangente a f(x) desde el punto [xi, f(xi)]. El punto donde esta tangente cruza el eje x, es una nueva aproximacin a la raz. El mtodo se puede derivar de forma geomtrica o bien por la serie de Taylor De forma geomtrica: La primera derivada en x es igual a la pendiente f(x) = [f(xi+1)f(xi)]/( xi+1-xi) Donde f(xi+1) =0 cuando xi+1 es la raz, por lo que ordenando los trminos xi+1 = xi - f(xi)/ f(x) Por la serie de Taylor: f(xi+1)= f(xi) + f(xi)h + f(xi)h2/2! + Truncando en la primera derivada y donde f(xi+1) = 0 cuando xi+1 es la raz h = xi+1 -xi 0 = f(xi) + f(xi) (xi+1 -xi) Ordenando terminus xi+1 = xi - f(xi)/ f(x)

18

Ejemplo usado
Funcion = x^3+2*x^2+10*x-20 derivada = 3*x^2+4*x+10 X0=1 E=.001
f=get(handles.edit1,'string'); f=inline(f); ezplot(f), grid on

Codigo del Grafico Codigo del programa


function varargout = pushbutton1_Callback(h, eventdata, handles, varargin)

f=get(handles.edit1,'string'); g=get(handles.edit2,'string'); f=inline(f); g=inline(g); x=str2double(get(handles.edit3,'string')); E=str2double(get(handles.edit4,'string')); x1=x-f(x)/g(x); while abs (x1-x)>E x=x1; x1=x-f(x)/g(x); end set(handles.edit5,'string',x1);

19

Falsa Posicin
El mtodo de la falsa posicin, (Basado en la interpolacin lineal) es anlogo almtodo de biseccin, puesto que el tamao del intervalo que contiene a la raz sereduce mediante iteracin. Sin embargo, en vez de bisectar en forma montona elintervalo, se utiliza una interpolacin lineal ajustada a dos puntos extremos paraencontrar una aproximacin a la raz 1. Este mtodo sirve para encontrar la raz osolucin real de una ecuacin. Al decir que encuentra su resultado hay que tomar encuenta que no todas las ecuaciones tienen un solo resultado, y que no todas tienenresultado, por lo que hay que tener una idea de la forma de la curva de la ecuacinantes de aplicar el mtodo para que sea efectivo.Es un mtodo que consiste en encontrar una raz que se encuentra en medio de dosvalores iniciales, que son con los cuales el mtodo arranca a trabajar. Cuando se hacelo anterior, el mtodo se denomina interpolacin lineal , mas a menudo, mtodo defalsa posicin (en latn regula falsi) 2.Esta tcnica es similar a la biseccin, salvo que la siguiente iteracin se toma en lainterseccin de una recta entre el par de valores x y el eje x, en vez del punto medio.Es necesario, para que el mtodo iterativo tenga xito al momento de encontrar laraz, que la funcin a la cual se le desea encontrar races, sea evaluada en los dospuntos, la evaluacin en un punto debe ser de diferente signo su magnitud a la funcinevaluada en el otro punto.

20

Cdigo del programa


function Calcular_Callback(hObject, eventdata, handles) f=get(handles.edit1,'string'); f=inline(f); xi=str2double(get(handles.edit2,'string')); xu=str2double(get(handles.edit3,'string')); err=str2double(get(handles.edit4,'string')); erro=100;%Se inicia el valor del error del 100 porciento xf=0; i=0; salida=''; if f(xi)*f(xu)<0 while erro>err xfa=xf; xf=xu-((f(xu)*(xi-xu))/(f(xi)-f(xu))); if f(xi)*f(xf)>0 xi=xf; else xu=xf; end erro=((xfa-xf)/xf)*100; if erro<0 erro=erro*-1; end i=i+1; set(handles.text1,'string',xf); end fprintf('Iteracion:%d',i); fprintf('X final es:%f',xf); else warndlg ('No existe la raiz en el intervalo'); end ezplot(f); grid on; zoom on;

21

Conclusiones
Alan Villegas Rios Al realizar el trabajo nos topamos con problemas para hacer que el resultado o la grafica se mostrara en nuestro GUI, para resolverlo tuvimos que redisear la mayora de los cdigos obviamente usando la mima logia y sus algoritmos se tuvo que estudia cada uno de los mtodos usados en el programa, para poder entender que datos peda que variables necesitaba para poder completar la operacin de cada mtodo etc..

Edie Arturo Portales Barbosa En este menu se tuvieron que estudiar a fondo el funcionamiento de la mayoria de los codigos dados para corregirlos y hacerlos funcionar adecuadamente ,como tambien investigar cuales eran sus datos numericos o formulas requeridas para que los programas dieran los resultados deseados,como asi tambien disear varios codigos para su graficacion correcta.

Orlando Muiz Hernndez Para concluir en este trabajo aprendimos a resolver mtodos lineales y no lineales por medio de programas hechos en matlab en un principio tuvimos algunos problemas y dudas sobre todo con las variables y tambin al empezar el men tuvimos dificultades al momento de poner los botones y ponerles su nombres. Pero con la ayuda del profesor aclaramos las dudas y salimos adelante.

22

También podría gustarte