Captulo
10.2 QU ES MATLAB?
MATLAB (MATrix LABoratory) es un entorno integrado de computacin orientado hacia la resolucin de problemas cientficos y de ingeniera. MATLAB integra en un solo paquete clculo (numrico y simblico), visualizacin grfica y programacin. Algunas caractersticas notables de MATLAB son: La programacin es ms sencilla. No hay distincin entre nmeros enteros, reales y complejos. La amplitud de intervalo y la exactitud de los nmeros son mayores. Cuenta con una biblioteca matemtica amplia. Abundantes herramientas grficas. Capacidad de vincularse con los lenguajes de programacin tradicionales, tales como FORTRAN, C/ C++, Visual Basic, etc. Transportabilidad de los programas MATLAB. Adems, el entorno bsico de MATLAB se complementa con una amplia coleccin de cajas de herramientas (toolboxes) que contienen funciones especficas para determinadas aplicaciones en diferentes ramas de las ciencias y la ingeniera (por ejemplo: modelado, simulacin y optimizacin de sistemas, control de procesos, adquisicin de datos, estadstica y control de calidad, etc.) Estas caractersticas han hecho de MATLAB una herramienta muy efectiva para la educacin y la investigacin.
El smbolo nos indica que MATLAB est esperando que introduzcamos datos o alguna instruccin (comando). Una vez que se escribe la orden deseada, hay que pulsar la tecla de retorno, entonces el programa realiza la operacin indicada y muestra la respuesta (ans=). En las guas de uso y de referencia (PDF) que acompaan al programa, as como en la ayuda (HELP) del programa pueden consultarse informacin adicional sobre las instrucciones y el uso de MATLAB.
CAP. 10
10.5 VARIABLES
Una variable almacena un dato cuyo valor puede cambiar durante la ejecucin de un programa. En MATLAB no es necesario declarar las variables ni sus tipos. Sencillamente se crea la variable mediante asignacin directa de su valor. La sintaxis es: NOMBRE_VARIABLE = VALOR Ejemplos: Para definir una variable de tipo real, se puede realizar mediante la siguiente orden: R = 0.08205 Para definir una variable de tipo vector, la orden a utilizar sera similar a la siguiente: X1 = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] Para definir una variable tipo matriz, se puede realizar de la siguiente forma: A = [2, 3, 0; 1, 4, 3; 2, 1, 0] Luego, para acceder a un elemento individual de un vector o matriz lo hacemos escribiendo el nombre de la variable y a continuacin el o los ndices entre parntesis. Por ejemplo: X1(6) ans = 0.5 A(2, 3) ans = 3 Importante: Tener en cuenta que MATLAB distingue las letras maysculas de las minsculas en los nombres dados a las variables, as por ejemplo: VOLUMEN Volumen volumen
; 3 4] 2 4
4 8
-2 0
Operadores relacionales:
A == B A ~= B A<B A>B A <= B A => B Igual a Diferente Menor Mayor Menor o igual Mayor o igual
Operadores lgicos:
~P P&Q P|Q xor(P, Q) Negacin Conjuncin Disyuncin inclusiva Disyuncin exclusiva. Devuelve unos donde x o y es distinto de cero (verdadero). Devuelve ceros donde ambos x e y son ceros (falso) o ambos son distintos de ceros (verdadero).
Devuelve uno si algn elemento en un vector x no es nulo. Devuelve uno para cada columna en una matriz x que tiene elementos no nulos Devuelve uno si algn elemento en un vector x no es nulo. Devuelve uno para cada columna en una matriz x que tiene elementos no nulos Devuelve unos en magnitudes no numricas (NaN) en x. Devuelve unos en magnitudes no numricas (NaN) en x. Devuelve unos en magnitudes no numricas (NaN) en x.
CAP. 10
Resto de la divisin de n entre m Signo de n (1 para n < 0, 1 para n > 0) Mximo de los nmeros n y m Mnimo de los nmeros n y m Mximo comn divisor de n y m Mnimo comn mltiplo de n y m Factorial de n Descompone n en factores primos
Inversa
asin(x) cos(x) atan(x), atan2(x) acot(x) asec(x) acsc(x)
Inversa
asinh(x) cosh(x) atanh(x) acoth(x) asech(x) acsch(x)
Funcin exponencial en base e Funcin logartmica en base e de x Funcin logartmica en base 10 de x Funcin logartmica en base 2 de x Funcin potencial en base 2 de x Funcin raz cuadrada de x
Valor absoluto del real x Valor entero ms prximo hacia Valor entero ms prximo hacia + Redondeo haca el entero ms prximo de x Redondeo haca el entero ms prximo a 0 Resto de la divisin entre los reales a y b Devuelve 1 si x >0 y 1 si x<0. Aplicado en nmeros complejos devuelve un vector unitario en la misma direccin
Comentarios 16 dgitos 5 dgitos ms exponente 16 dgitos ms exponente Hexadecimal 2 dgitos decimales Positivo, negativo o cero Aproximacin racional Visualizacin por defecto
Valor Nombre por defecto de la variable usada para los resultados. Razn de una circunferencia a su dimetro. Nmero ms pequeo tal que, cuando se le suma 1, crea un nmero en coma flotante en el computador mayor que 1. Infinito. Magnitud no numrica. i=1=v1 El nmero real positivo ms pequeo que es utilizable. El nmero real positivo ms grande que es utilizable.
CAP. 10
10.9 MATRICES
La potencia de MATLAB radica en la capacidad de clculo matricial que posee, se puede trabajar con matrices de forma muy cmoda y extensa. Hay ciertas matrices espaciales que se pueden definir en MATLAB de forma directa, usando las siguientes funciones: Variable
diag(VECTOR)
Valor Crea un matriz diagonal con los elementos de VECTOR en la diagonal. Crea una matriz de orden n Crea una matriz de orden mxn Crea una matriz de orden mxn con todos sus elementos 1 Crea una matriz aleatoria uniforme de orden mxn Crea una matriz aleatoria normal de orden mxn
0 0 0 1
Para el caso de las operaciones matriciales estas se rigen por las reglas del lgebra lineal. A continuacin se especifican las operaciones ms importantes: A+B AB A*B A A^n Suma de matrices Resta de matrices Multiplicacin de matrices Transpuesta de una matriz Potencia escalar de una matriz
Una de las caractersticas ms tiles de MATLAB es que dispone de un conjunto de operadores que operan sobre una matriz, elemento a elemento, estos son: A .* B A ./ B A.^n
CAP. 10
10.10 GRAFICACIN
El comando plot grafica el conjunto de puntos (x, y) sobre el plano euclidiano (2D). Su sintaxis es: plot(X, Y, S) Donde X e Y son vectores fila que representan a las abscisas y las ordenadas, respectivamente. S es una cadena que indica el tipo de lnea y/o carcter a usar en el ploteo y el color de la curva. Su formato es: S = [TIPO DE LNEA][MARCA][COLOR]
Color de lnea Rojo Amarillo Verde Azul Magenta Cian Negro Blanco r y g b m c k w
Ejemplo 10.7 X = [0: 0.05: 10]; Y = sin(X) .* exp(-0.4 * X); plot(X, Y, k); xlabel(X); ylabel(Y); title(Gracacin en 2D);
En la primera lnea se especifica el dominio y el tamao de paso, en este caso 0.05. En la siguiente lnea se define la funcin. Luego mediante la orden plot graficamos la funcin mediante una curva simple de color negro (k). La cuarta y quinta lneas muestran un rtulo para los ejes X e Y, respectivamente. La ltima lnea muestra un ttulo para el grfico. El comando plot3 es la versin tridimensional de plot. Todas las reglas y comandos ya explicados para plot se aplican a plot3. Ejemplo 10.8 Como ejemplo vamos a graficar la hlice paramtrica definida por: x(t) = sin(t) ; y(t) = cos(t) ; z(t) = t t = [0: pi/50: 10*pi]; X = sin(t); Y = cos(t); Z = t; plot3(X, Y, Z); grid on; xlabel(X); ylabel(Y); zlabel(Z); title(Hlice paramtrica);
10
CAP. 10
Las grficas de superficie permiten obtener representaciones densas de figuras tridimensionales y en especial de funciones de dos variables, de la forma: z = (x, y) Para graficar una funcin de este tipo, el procedimiento es el siguiente: 1. Utilizar el comando meshgrid para definir la malla (matriz de puntos) sobre los cuales se evaluar la funcin para hacer su representacin grfica. 2. Usar el comando surf o contour, o cualquiera de sus variantes. La sintaxis bsica de estos comandos es: [X, Y] = meshgrid(VECTORX, VECTORY) surf(X, Y, Z) countour(X, Y, Z) Ejemplo 10.9 Como ejemplo vamos a graficar la superficie dada por la siguiente ecuacin:
[X, Y] = meshgrid(-7.5: 0.5: 7.5); warning off all; Z = sin(sqrt(X.^2 + Y.^2)) ./ sqrt(X.^2 + Y.^2); warning on all; gure(1); surf(X, Y, Z); xlabel(X); ylabel(Y); zlabel(Z);
11
Mediante el comando contour tambin es posible graficar funciones implcitas, cuya sintaxis para graficar curvas implcitas es: contour(X, Y, F(X, Y), [0, 0]) Donde X e Y son vectores fila que representan los valores de x e y, respectivamente. F(X, Y) es la funcin en x e y. El vector [0, 0] sirve para especificar el nivel de contorno, pues el nico contorno que nos interesa es el del nivel 0, pero los niveles de contorno deben estar en forma de vector, por lo que repetimos el cero. Ejemplo 10.10 Suponga que se desea graficar la siguiente funcin implcita: y3 + exp(y) tanh(x) = 0 X = [-3: 0.2: 3]; Y = [-2: 0.2: 1]; [X, Y] = meshgrid(X, Y); F = Y .^3 + exp(Y) - tanh(X); contour(X, Y, F, [0, 0]); xlabel(X); ylabel(Y);
12
CAP. 10
13
Para resolver este problema, cargar el editor de programas de MATLAB e ingresar el siguiente cdigo: Listado SISLIN2.m % Ingreso de datos a = input(INGRESE A? ); b = input(INGRESE B? ); c = input(INGRESE C? ); d = input(INGRESE D? ); e = input(INGRESE E? ); f = input(INGRESE F? ); % Clculo de x e y x = (c * e - b * f) / (a * e - b * d); y = (a * f - c * d) / (a * e - b * d); % Impresin de resultados disp(SOLUCIN (X,Y)= ); disp([x, y]); Una vez escrito el cdigo mostrado, guarde el programa como SisLin2.M. Para probar el cdigo que acaba de escribir, vamos a resolver el sistema: 6x + y = 9 2x + 5y = 17 Para ello ingrese en la ventana de comandos de MATLAB lo siguiente: SISLIN2 INGRESE A? 6 INGRESE B? 1 INGRESE C? 9 INGRESE D? 2 INGRESE E? 5 INGRESE F? 17 SOLUCIN (X, Y)= 1 3
Observar que las sentencias que comienzan con el smbolo % son comentarios, es decir son ignoradas por el programa, pero sirven como referencia para hacer ms legible el cdigo.
14
CAP. 10
15
290175
Ejemplo 10.14 Escriba un programa que para un nmero x permita calcular la siguiente sumatoria:
Hasta que el valor absoluto del trmino Listado SUMCIFRASM.m EPS = 1e-6; X = input(VALOR DE X?); SUMA = 1 + X; TERMINO = X; N = 1; while abs(TERMINO) > EPS N = N + 1; TERMINO = TERMINO * X / N; SUMA = SUMA + TERMINO; end disp(SUMA=); disp(SUMA); SERIE_EXP VALOR DE X? 1 SUMA= 2.71828180114638
Ejemplo 10.15 Escriba un programa para obtener una solucin real de la ecuacin: cosx 3x = 0 Utilizando el algoritmo de NewtonRaphson, tomando como valor inicial .
16
CAP. 10
10.14 FUNCIONES
MATLAB dispone de una amplia gama de funciones que permiten realizar una gran variedad de tareas. Sin embargo, se pueden crear funciones definidas por el usuario para realizar tareas especficas. Para ello se debe definir la funcin como un archivo M, el nombre del archivo debe ser igual al nombre de la funcin y se debe guardar en el directorio de trabajo por defecto. La sintaxis para definir una funcin es: function PARMETROS_SALIDA = NOMBRE_FUNCIN(PARMETROS _ENTRADA) . . CUERPO DE LA FUNCIN . . return; Para invocar una funcin hacemos uso de la siguiente sintaxis: VARIABLE = NOMBRE_FUNCIN(LISTA_ARGUMENTOS) Donde LISTA_ARGUMENTOS debe coincidir con el nmero de PARMETROS_ENTRADA, de lo contrario se produce un error.
17
Escriba una funcin en MATLAB que acepte como argumentos de entrada los valores de las constantes de Antoine y la temperatura, y retorne el valor de la presin de vapor. Listado ANTOINE.m function P = ANTOINE(A, B, C, T) P = exp(A - B / (T + C)); return; Para probar la funcin que acaba de crear estimar la presin de vapor del etilbenceno a 347.2 K Las constantes de Antoine para el etilbenceno son (donde PSat est en KPa y T en C): A = 14.0045 B = 3279.47 C = 213.2 PSAT = ANTOINE(14.0045, 3279.47, 213.2, 347.20 - 273.15) PSAT= 13.2994 Una forma eficiente de construir programas es crear nuevas funciones que se almacenan como archivos m. Estas funciones nos permiten especificar los datos que se deben introducir y los nos retornan los resultados que deben mostrarse y pueden ser llamados como subprogramas desde otros programas.
18
CAP. 10
19
20
CAP. 10
Listado NEWTON.m Aproximacin a una solucin de la ecuacin no lineal (x) = 0 mediante el mtodo de Newton Raphson function [Xp, ITER, FLAG] = NEWTON(F, dF, X0, EPS1, EPS2, MAXIT) % Sintaxis % [Xp, ITER, FLAG] = NEWTON(F, dF, X0, EPS1, EPS2, MAXIT) % Entrada % - F es la funcin, almacenada como un archivo F.m % - dF es la derivada de de la funcin, almacenada como un archivo dF.m % - X0 es el valor inicial % - EPS1 es el criterio de convergencia % - EPS2 es el criterio de exactitud % - MAXIT es el nmero mximo de iteraciones % Salida % - Xp es el valor de la raz aproximada % - ITER es el nmero de iteraciones realizadas % - FLAG es una variable lgica, es 1 si hubo convergencia, caso % contrario es 0 for K = 1 : MAXIT Xp = X0 - feval(F, X0) / feval(dF, X0); if (abs(Xp - X0) <= EPS1) | (abs(feval(F, Xp)) <= EPS2) ITER = K; FLAG = 1; return; end X0 = Xp; end disp(Se ha excedido el mximo nmero de iteraciones...); ITER = MAXIT; FLAG = 0; En este caso vamos a utilizar el programa NEWTON.m para resolver la ecuacin (x) = lnx x + 2 = 0, Problema 1.5 (pg. 33), la cual ya est almacenada como un archivo F1.m (problema anterior, mtodo de la biseccin). Listado F1.m function Y = F1(X) Y = log(X) - X + 2; return;
21
la cual tambin debe ser guardada como un archivo, por ejemplo dF1.m. Listado dF1.m function Y = dF1(X) Y = 1 / X - 1; return; Para obtener el resultado ingresar lo siguiente en la ventana de comandos de MATLAB: [Xp, ITER, FLAG] = NEWTON(@F1, @dF1, 3, 1e-6, 1e-6, 25) Xp = 3.14619344079791 ITER = 2 FLAG = 1 El mtodo de Newton Raphson tambin es aplicable para la obtencin de races complejas, con la diferencia que el valor inicial debe ser un valor complejo. Por ejemplo, para hallar las races complejas de la ecuacin (x) = x2 + 8, dada en el Problema 1.4 (pg. 31), primero almacenamos la funcin y su derivada como archivos, por ejemplo F2.m y dF2, respectivamente. Listado F2.m function Y = F2(X) Y = X^2 + 8; return; Listado dF2.m function Y = dF2(X) Y = 2 * X; return; Luego, en la ventana de comandos: [Xp, Xp = 0 ITER = FLAG = ITER, FLAG] = NEWTON(@F2, @dF2, 2*i, 1e-6, 1e-6, 25) + 2.82842712474938i 4 1
Donde la raz compleja es 2.828427i y la raz compleja conjugada ser 2.828427i . Para obtener el valor de la raz conjugada dar como valor inicial 2i (esto ltimo se deja como ejercicio para el lector). Listado SECANTE.m Aproximacin a una solucin de la ecuacin (x) = 0 mediante el mtodo de la secante. function [Xp, ITER, FLAG] = SECANTE(F, X0, X1, EPS1, EPS2, MAXIT) % Sintaxis % [Xp, ITER, FLAG] = SECANTE(F, X0, X1, EPS1, EPS2, MAXIT) % Entrada % - F es la funcin, almacenada como un archivo F.m % - X0, X1 son los valores iniciales
22
CAP. 10
% - EPS1 es el criterio de convergencia % - EPS2 es el criterio de exactitud % - MAXIT es el nmero mximo de iteraciones % Salida % - Xp es el valor de la raz aproximada % - ITER es el nmero de iteraciones realizadas % - FLAG es una variable lgica, es 1 si hubo convergencia, caso % contrario es 0 for K = 1 : MAXIT Xp = X0 - (X1 - X0) * feval(F, X0) / (feval(F, X1) - feval(F, X0)); if (abs(Xp - X1) <= EPS1) | (abs(feval(F, Xp)) <= EPS2) ITER = K; FLAG = 1; return; end X0 = X1; X1 = Xp; end disp(Se ha excedido el mximo nmero de iteraciones...); ITER = MAXIT; FLAG = 0; En este caso vamos a utilizar el programa SECANTE.m para resolver la ecuacin (x) = lnx x + 2 = 0, dada en el Problema 1.6 (pg. 35), la cual ya est almacenada como un archivo F1.m (problema anterior, mtodo de la biseccin). Por tanto, para obtener el resultado ingresar lo siguiente en la ventana de comandos de MATLAB: [Xp, ITER, FLAG] = SECANTE(@F1, 3, 3.15, 1e-6, 1e-6, 25) Xp = 3.14619320852215 ITER = 2 FLAG = 1 Listado MULLER.m Aproximacin a una solucin de la ecuacin (x) = 0 mediante el mtodo de la Mller. function [Xp, ITER, FLAG] = MULLER(F, X0, X1, X2, EPS1, EPS2, MAXIT) % Sintaxis % [Xp, ITER, FLAG] = MULLER(F, X0, X1, X2, EPS1, EPS2, MAXIT) % Entrada % - F es la funcin, almacenada como un archivo F.m % - X0, X1, X2 son los valores iniciales % - EPS1 es el criterio de convergencia % - EPS2 es el criterio de exactitud % - MAXIT es el nmero mximo de iteraciones % Salida % - Xp es el valor de la raz aproximada % - ITER es el nmero de iteraciones realizadas % - FLAG es una variable lgica, es 1 si hubo convergencia, caso % contrario es 0 for K = 1 : MAXIT F10 = (feval(F, X1) - feval(F, X0)) / (X1 - X0); F21 = (feval(F, X2) - feval(F, X1)) / (X2 - X1);
23
24
CAP. 10
Luego, para ejecutar el programa en la ventana de comandos de MATLAB ingresar la siguiente orden: GRAFICA_F1
Como puede apreciar en la grfica obtenida se puede ver claramente que la funcin presenta dos races, una de las cuales se encuentra aproximadamente entre 0.1 y 0.2, y la otra que se encuentra entre 3.0 y 3.2. Listado APROXILIN.m Aproximacin polinomial simple. Construccin del polinomio interpolador de grado N que pasa por los (N + 1) puntos function [YINT, C] = APROXLIN(X, Y, XINT) % Sintaxis % [YINT, C] = APROXLIN(X, Y, XINT) % Entrada % - X es un vector la que contiene la lista de abscisas % - Y es un vector la que contiene la lista de ordenadas % - XINT es el valor para el que se desea la interpolacin % Salida % - YINT es el valor de la funcin en XINT % - C es el vector de coecientes (en forma ascendente, a0, a1, ..., aN) % del polinomio de grado N que pasa por los (N + 1) puntos N = length(X) - 1; X = X; Y = Y; for I = 1 : N + 1 B(I, 1) = 1; for J = 2 : N + 1 B(I, J) = B(I, J - 1) * X(I); end end C = inv(B) * Y; YINT = 0; for I = N + 1 : -1 : 1 YINT = YINT * XINT + C(I); end
25
0 5
1 7
2 9
5 15
Para hallar el valor de la funcin en x = 3, en la ventana de comandos de MATLAB tipear: X = [0, 1, 2, 5]; Y = [5, 7, 9, 15]; [YINT, C] = APROXLIN(X, Y, 3) YINT = 11 C = 5 2 -7.7715611723761e-016 -5.55111512312578e-017 Listado LAGRANGE1.m Interpolacin con polinomios de Lagrange de grado N. function YINT = LAGRANGE1(X, Y, XINT) % Sintaxis % YINT = LAGRANGE1(X, Y, XINT) % Entrada % - X es un vector que contiene la lista de abscisas % - Y es un vector que contiene la lista de ordenadas % - XINT es el valor para el que se desea la interpolacin % Salida % - YINT es el valor de la funcin en XINT N = length(X) - 1; YINT = 0; for I = 1 : N + 1 L = 1; for J = 1 : N + 1 if I ~= J L = L * (XINT - X(J)) / (X(I) - X(J)); end end YINT = YINT + L * Y(I); end Para el mismo caso anterior (Problema 2.7, pg. 107), tipear en la ventana de comandos de MATLAB lo siguiente: X = [0, 1, 2, 5]; Y = [5, 7, 9, 15]; YINT = LAGRANGE1(X, Y, 3) YINT = 11
26
CAP. 10
Listado LAGRANGE2.m Construccin del polinomio interpolador de Lagrange de grado N que pasa por los (N + 1) puntos function [YINT, C, L] = LAGRANGE2(X, Y, XINT) % Sintaxis % [YINT, C, L] = LAGRANGE2(X, Y, XINT) % Entrada % - X es un vector que contiene la lista de abscisas % - Y es un vector que contiene la lista de ordenadas % - XINT es el valor para el que se desea la interpolacin % Salida % - YINT es el valor de la funcin en XINT % - C es la matriz que contiene los coecientes del polinomio % interpolador de Lagrange, en forma ascendente (a0, a1, a2, ..., aN) % - L es la matriz que contiene los coecientes de los polinomios % coecientes de Lagrange N = length(X) - 1; L = zeros(N + 1, N + 1); for I = 1 : N + 1 V = 1; for J = 1 : N + 1 if I ~= J V = conv(V, poly(X(J))) / (X(I) - X(J)); end end L(I, :) = V; end C = (Y * L); C = ipud(C); YINT = 0; for I = N + 1 : -1 : 1 YINT = YINT * XINT + C(I); end Para el mismo caso anterior (Problema 2.7, pg. 107), tipear en la ventana de comandos de MATLAB lo siguiente: [YINT, C, L] = LAGRANGE2(X, Y, 3) YINT = 11 C = 5 2 -1.11022302462516e-016 0 L = -0.1000 0.8000 -1.7000 0.2500 -1.7500 2.5000 -0.1667 1.0000 -0.8333 0.0167 -0.0500 0.0333
1.0000 0 0 0
27
1.0 0.7651977
1.3 0.6200860
1.6 0.4554022
1.9 0.2818186
2.2 0.1103623
Para ello en la ventana de comandos de MATLAB ingresar la siguiente orden: X = [1.0, 1.3, 1.6, 1.9, 2.2]; Y = [0.7651977, 0.6200860, 0.4554022, 0.2818186, 0.1103623]; [YINT, Q] = NEVILLE(X, Y, 1.5) YINT = 0.511819994238683 Q = 0.7652 0 0 0 0 0.6201 0.5233 0 0 0 0.4554 0.5103 0.5125 0 0 0.2818 0.5133 0.5113 0.5118 0 0.1104 0.5104 0.5137 0.5118 0.5118 Listado MINCUAD.m Interpolacin por mnimos cuadrados. function [YC] = MINCUAD(X, Y, N) % Sintaxis % YC = MINCUAD(X, Y, N) % Entrada % - X es un vector la que contiene la lista de abscisas % - Y es un vector la que contiene la lista de ordenadas % - N es el orden del polinomio
28
CAP. 10
% Salida % - YC es un vector que contiene los coecientes del polinomio en forma % ascendente (a0, a1, a2, ..., aN), es decir de menor a mayor exponente % de la variable M = X = Y = for length(X); X; Y; I = 1 : M B(I, 1) = 1; for J = 2 : N + 1 B(I, J) = B(I, J - 1) * X(I); end
end YC = inv(B * B) * (B * Y); Por ejemplo para la funcin dada en el Problema 2.11 (pgina 135), se tiene: x
y = f (x)
2 0
1 0
0 1
1 1
2 3
Para ajustar la funcin a una recta escriba las siguientes instrucciones en la ventana de comandos de MATLAB: X = [-2, -1, 0, 1, 2]; Y = [0, 0, 1, 1, 3]; YC = MINCUAD(X, Y, 1) YC = 1 0.7 Con los mismos datos del problema anterior, para ajustarlos a un polinomio de segundo grado, tipear lo siguiente en la ventana de comandos: YC = MINCUAD(X, Y, 2) YC = 0.571428571428571 0.700000000000000 0.214285714285714 Para ajustar los datos anteriores a un polinomio de tercer grado hacer: YC = MINCUAD(X, Y, 3) YC = 0.5714285714285710 0.4166666666666670 0.2142857142857140 0.0833333333333335
29
En la ventana de comandos de MATLAB ingresamos lo siguiente: X1 X2 Y YC YC = = = = = [2.0, 3.5, 4.5, 2.5, 8.5, 10.5, 13.5] [18.0, 16.5, 10.5, 2.5, 9.0, 4.5, 1.5] [27.5, 28.0, 28.8, 29.1, 30.0, 31.0, 32.0] MINCUAD2(X1, X2, Y) 28.6917135088340000 0.25693926572616200 -0.0960681843122408
30
CAP. 10
Grficas Para graficar los siguientes datos del problema 2.11 (pg. 135) y las curvas ajustadas mediante mnimos cuadrados: x
y = f (x)
2 0
1 0
0 1
1 1
2 3
Lo podemos realizar mediante el siguiente programa: Listado GRAFICA_MC.m close all; clear; X = [-2, -1, 0, 1, 2]; Y = [0, 0, 1, 1, 3]; YC1= MINCUAD(X, Y, 1); YC2= MINCUAD(X, Y, 2); YC3= MINCUAD(X, Y, 3); YC1 = YC1(1) + YC1(2) .* X; YC2 = YC2(1) + YC2(2) .* X + YC2(3) .* X.^2; YC3 = YC3(1) + YC3(2) .* X + YC3(3) .* X.^2 + YC3(4) .* X.^3; gure(1); plot(X, Y, *, X, YC1) xlabel(X); ylabel(Y); title(Polinomio de 1er. grado); gure(2); plot(X, Y, *, X, YC2); xlabel(X); ylabel(Y); title(Polinomio de 2do. grado); gure(3); plot(X, Y, *, X, YC3) xlabel(X); ylabel(Y); title(Polinomio de 3er. grado);
31
Listado DIFLAGRANGE.m Diferenciacin numrica mediante el polinomio interpolador de Lagrange function DY = DIFLAGRANGE(X, Y, XD) % Sintaxis % DY = DIFLAGRANGE(X, Y, XD) % Entrada % - X es un vector que contiene la lista de abscisas % - Y es un vector que contiene la lista de ordenadas % - XD es punto en que se desea evaluar la derivada % Salida % - DY es la aproximacin a la primera derivada en XD N = length(X); DY = 0; for I = 1 : N
32
CAP. 10
0 5
1 1
2 9
3 25
4 55
5 105
Ingresar lo siguiente en la ventana de comandos de MATLAB: X = [0, 1, 2, 3, 4, 5] Y = [-5, 1, 9, 25, 55, 105] DY = DIFLAGRANGE(X, Y, 0) DY = 7 Para evaluar la derivada de la misma funcin para x = 0.5 y x = 3.5 (Problema 3.2, pg. 170), hacemos lo siguiente: DY DY = DY DY = = DIFLAGRANGE(X, Y, 0.5) 5.75 = DIFLAGRANGE(X, Y, 3.5) 29.75
1 13
2 10
3 5
4 2
5 11
5 105
Tipear lo siguiente en la ventana de comandos de MATLAB: X = [1, 2, 3, 4, 5] Y = [-13, -10, -5, 2, 11] DY = DIFLAGRANGE(X, Y, 2.5) DY = 5
33
34
CAP. 10
Listado TRAPECIO.m Regla compuesta del trapecio para aproximar la integral de una funcin dada en forma tabular, en el intervalo function S = TRAPECIO(X, FX) % Sintaxis % I = TRAPECIO(X, FX) % Entrada % - X es un vector que contiene la lista de variables independientes % - FX es un vector que contiene la lista de variables dependientes o % integrando % - a y b son los extremos inferior y superior del intervalo de % integracin % Salida % - S es la aproximacin a la integral con la regla compuesta del % trapecio N = length(X); a = X(1); b = X(N); H = (b - a) / (N - 1); S = 0; for K = 2 : (N - 1) S = S + FX(K); end S = (H / 2) * (FX(1) + 2 * S + FX(N)); Para integrar la funcin dada en forma tabular del Problema 4.1 (pgina 202): x
y = f (x)
0 5
1 1
2 9
3 25
4 55
5 105
6 181
Digitar lo siguiente en la ventana de comandos de MATLAB: I X Y I = = [0, 1, 2, 3, 4, 5, 6] = [-5, 1, 9, 25, 55, 105, 181] = TRAPECIO(X, Y) 283
35
Listado SIMPSON38.m Regla compuesta de Simpson 3/8 para aproximar la integral de una funcin dada en forma tabular, en el intervalo [a, b]. function S = SIMPSON38(X, FX) % Sintaxis % I = SIMPSON38(X, FX) % Entrada % - X es un vector que contiene la lista de variables independientes % - FX es un vector que contiene la lista de variables dependientes o % integrando % - a y b son los extremos inferior y superior del intervalo de % integracin % Salida
36
CAP. 10
% - S es la aproximacin a la integral con la regla compuesta del % Simpson 3/8 N = length(X); a = X(1); b = X(N); H = (b - a) / (N - 1); S1 = 0; S2 = 0; for K = 2 : (N - 1) if mod(K - 1, 3) == 0 S1 = S1 + FX(K); else S2 = S2 + FX(K); end end S = (3 * H / 8) * (FX(1) + 2 * S1 + 3 * S2 + FX(N)); Para integrar la misma funcin del ejemplo anterior , ingresar lo siguiente en la ventana de comandos de MATLAB: I X Y I = = [0, 1, 2, 3, 4, 5, 6] = [-5, 1, 9, 25, 55, 105, 181] = SIMPSON38(X, Y) 276
Para integrar la funcin tabular dada en el Problema 4.2 (pgina 203), desde tal como se muestra: x
y = f (x)
0 5
1 1
2 9
3 25
4 55
5 105
Como el nmero de subintervalos es impar (en este caso 5) aplicamos una combinacin de las frmulas de Simpson 1/3 y Simpson 3/8, veamos: I X1 = [0, 1, 2, 3] Y1 = [-5, 1, 9, 25] X2 = [3, 4, 5] Y2 = [25, 55, 105] I = SIMPSON38(X1, Y1) + SIMPSON13(X2, Y2) = 135.4167
Listado ROMBERG.m Aproximacin a la integral de una funcin y = (x) dada en forma analtica mediante el mtodo de integracin de Romberg, en el intervalo [a, b]. function [R, Q, EPS, H] = ROMBERG(F, a, b, K, TOL) % Sintaxis % [R, Q, EPS, H] = ROMBERG(F, a, b, K, TOL) % Entrada % - F es la funcin integrando, almacenada como un archivo F.m % - a y b son los extremos inferior y superior del intervalo de % integracin
37
(pg. 217), primero tiene que almacenar la funcin como un archivo, por ejemplo F3.m, tal como se muestra a continuacin: Listado F3.m function Y = F3(X) Y = 4 * X^3 - 3 * X^2 + 2 * X + 1; return; Luego, en la ventana de comandos de MATLAB ingresar las siguientes instrucciones: [R, I, EPS, H] R = 2.500000000 2.125000000 2.031250000 2.007812500 2.001953125 I = 2 EPS = 0 H = 0.0625 = ROMBERG(@F3, 0, 1, 4, 1e-2) 0 0 0 0 2.0000 0 0 0 2.0000 2.0000 0 0 2.0000 2.0000 2.0000 0 2.0000 2.0000 2.0000 2.0000
38
CAP. 10
Listado GAUSS_LEGENDRE.m Aproximacin a la integral de una funcin dada en forma analtica mediante la frmula de la cuadratura de Gauss-Legendre, en el intervalo [a, b]. function Q = GAUSS_LEGENDRE(F, a, b, N) % Sintaxis % I = GAUSS_LEGENDRE(F, a, b, N) % Entrada % - F es la funcin integrando, almacenada como un archivo F.m % - a y b son los extremos inferior y superior del intervalo de % integracin % - N es el nmero de puntos a utilizar (2, 3, 4, 5 6) % Salida % - Q es la aproximacin a la integral NP(1) = 2; NP(2) = 3; NP(3) = 4; NP(4) = 5; NP(5) = 6; IAUX(1) = 1; IAUX(2) = 2; IAUX(3) = 4; IAUX(4) = 6; IAUX(5) = 9; IAUX(6) = 12; Z(1) = 0.577350269; Z(2) = 0.0; Z(3) = 0.774596669; Z(4) = 0.339981044; Z(5) = 0.861136312; Z(6) = 0.0; Z(7) = 0.53846931; Z(8) = 0.906179846; Z(9) = 0.238619186; Z(10) = 0.661209387; Z(11) = 0.932469514; W(1) = 1.0; W(2) = 0.888888889; W(3) = 0.555555556; W(4) = 0.652145155; W(5) = 0.347854845; W(6) = 0.568888889; W(7) = 0.478628671; W(8) = 0.236926885; W(9) = 0.467913935; W(10) = 0.360761573; W(11) = 0.171324493; I= 0; for J =1 : 5 if N == NP(J) I = J; end if I == 0 Q = 0; else J1 = IAUX(I); J2 = IAUX(I + 1) - 1; C = (b - a) / 2; D = (b + a) / 2; S = 0; for J=J1 : J2 if Z(J) == 0 S = S + W(J) * F(D); end if Z(J) ~= 0 S = S + W(J) * (F(Z(J) * C + D) + F(-Z(J) * C + D)); end end Q = C * S; end end
39
Luego, para obtener la integral de la funcin , dada en el Problema 4.8 (pg. 222), primero se debe almacenar la funcin como un archivo, por ejemplo F4.m, veamos: Listado F4.m function Y = F4(X) Y = X^3 + X^2 + X + 1; return; Luego, en la ventana de comandos de MATLAB ingresar las siguientes instrucciones, para calcular la integral mediante la frmula de Gauss-Legendre de 2 puntos: I = GAUSS_LEGENDRE(@F4, -1, 1, 2) I = 2.66666666622874 Para la misma funcin, la integral evaluada desde a = 1 hasta b = 3 (ver pg. 224), el resultado se puede obtener mediante las siguientes instrucciones en la ventana de comandos: I = GAUSS_LEGENDRE(@F4, 1, 3, 2) I = 34.66666666360121 Para calcular la integral de la funcin (Problema 4.9, pg. 223) mediante la frmula de Gauss-
Legendre de 5 puntos, primero almacenamos la funcin como un archivo, para este caso F5.m, tal como se indica a continuacin: Listado F5.m function Y = F5(X) Y = 1 / X; return; Luego, en la ventana de comandos de MATLAB digitar lo siguiente: I = GAUSS_LEGENDRE(@F5, 1, 2, 5) I = 0.69314715819178 Listado THOMAS.m Mtodo de Thomas para la resolucin de un sistema tridiagonal AX = B function [X] = THOMAS(A, B) % Sintaxis % X = THOMAS(A, B) % Entrada % - A es la matriz de coecientes del sistema tridiagonal % - B es el vector de trminos independientes (vector columna) % Salida % - X es el vector solucin del sistema tridiagonal AX = B N = length(B); b = diag(A, 0); a = [0; diag(A, -1)]; c = [diag(A, 1); 0]; d = B; for I = 1 : (N - 1) if b(I) == 0
40
CAP. 10
Para resolver el sistema dado en el Problema 5.2 (pgina 265), ingresamos las siguientes instrucciones en la ventana de comandos de MATLAB: A = [ 4, 1, 0, 0, -8, -1, 1, 0, 0, 3, -2, 4, 0, 0, 1, -1, 0, 0, 0, 2, B = [-1; 13; -3; 2.1; [X] = THOMAS(A, B) X = 0.9250 -4.7000 15.7000 10.6250 -2.9750 0; 0; 0; 1; 6] 3.4]
Nota: En MATLAB este sistema pudo resolverse directamente mediante la siguiente orden en la ventana de comandos: X = inv(A) * B X = 0.9250 -4.7000 15.7000 10.6250 -2.9750 El mismo resultado se obtiene si hacemos: X = A^(-1) * B O tambin: X = A \ B Queda como tarea para el lector comprobar los resultados de estas dos ltimas rdenes.
41
function [X1, X2, X3] = TRIDIAG3(A1, A2, A3, B1, B2, B3, C1, C2, C3, D1, D2, D3) P1 = inv(B1) * C1; Q1 = inv(B1) * D1; P2 = inv(B2 - A2 * P1) * C2; Q2 = inv(B2 - A2 * P1) * (D2 - A2 * Q1); P3 = inv(B3 - A3 * P2) * C3; Q3 = inv(B3 - A3 * P2) * (D3 - A3 * Q2); X3 = Q3; X2 = Q2 - P2 * X3; X1 = Q1 - P1 * X2; Luego, para resolver el sistema tridiagonal por bloques planteado en el Problema 5.3 (pgina 269), primero ingresamos las matrices bloques: b1 = [1, 2, 1; b2 2, 1, 1; 1, 2, 2] a1 = zeros(3) a2 0, 0, 1; 0, 0, 2] c1 = [2, 2, 1; c2 2, 1, 0; 1, 2, 0] d1 = [9; 7; 8] d2 = [1, 2, 2, = [0, 1; b3 0; 1] 3; a3 0, 0, 2; 0, 0, 1] = [1, 2, 1; c3 1, 2, 0; 1, 1, 0] = [12; 8; 8] d3 2, 2, 1, 1, = [2, 1, 3, = [0, 1, 1, 1, 1, 1; 1; 2] 2;
= zeros(3)
= [7; 5; 6]
Luego, llamamos al programa que acabamos de crear: [X1, X2, X3] = TRIDIAG3(a1, a2, a3, b1, b2, b3, c1, c2, c3, d1, d2, d3) X1 = 1.0000 X2 = 1.0000 X3 = 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 Nota: Otra forma de resolver el problema anterior es aprovechando la capacidad de MATLAB para el clculo matricial, veamos: Primero construimos la matriz de coeficientes A y la matriz de trminos independientes B, respectivamente: A = [b1, A = 1 2 1 0 0 0 0 0 0 c1, zeros(3); a2, b2, c2; zeros(3), a3, b3] 2 1 2 1 0 0 0 0 0 1 1 2 3 1 2 0 0 0 2 2 1 1 2 2 0 0 0 2 1 2 2 2 1 1 0 0 1 0 0 1 0 1 2 2 1 0 0 0 1 1 1 2 1 2 0 0 0 2 2 1 1 1 1 0 0 0 1 0 0 1 1 2
42
CAP. 10
Listado PUNTOFIJO_MV.m Resolucin de un sistema de ecuaciones no lineales F(X) = 0 mediante el mtodo del punto fijo multivariable con desplazamientos simultneos function [Xp, ITER, FLAG] = PUNTOFIJO_MV(G, X0, EPS, MAXIT) % Sintaxis % PUNTOFIJO_MV(G, X0, EPS, MAXIT) % Entrada % - G es el sistema de ecuaciones no lineales, almacenado como G.m % - X0 es el vector de valores iniciales % - EPS es el criterio de convergencia % - MAXIT es el nmero mximo de iteraciones % Salida % - Xp es el vector solucin % - ITER es el nmero de iteraciones realizadas % - FLAG es una variable lgica, es 1 si hubo convergencia, caso % contrario es 0 for K = 1 : MAXIT X = feval(G, X0); if norm(X - X0) <= EPS Xp = real(X); ITER = K; FLAG = 1; return; end X0 = X; end disp(Se ha excedido el mximo nmero de iteraciones...); ITER = MAXIT; FLAG = 0;
43
Primero tenemos que almacenar el sistema como un archivo, por ejemplo FG_2EC.m, veamos: Listado FG_2EC.m function G = FG_2EC(X) G(1) = (4 - sqrt(X(2)))^3 / 8; G(2) = sqrt(17 - X(1)^2); return; Ahora, en la ventana de comandos de MATLAB digitar lo siguiente: [Xp, ITER, FLAG] = PUNTOFIJO_MV(@FG_2EC, [0.5, 0.5], 1e-6, 25) Xp = 0.999999719761863 4.0000000005318 ITER = 17 FLAG = 1 Listado NEWTON_MV.m Resolucin de un sistema de ecuaciones no lineales mediante el mtodo de Newton Raphson estndar function [Xp, ITER, FLAG] = NEWTON_MV(F, JF, X, EPS1, EPS2, MAXIT) % Sintaxis % [Xp, ITER, FLAG] = NEWTON_MV(F, JF, X, EPS1, EPS2, MAXIT) % Entrada % - F es el sistema de ecuaciones no lineales, almacenado como F.m % - JF es la matriz jacobiana, almacenada como JF.m % - X es el vector de valores iniciales % - EPS1 es el criterio de convergencia % - EPS2 es el criterio de exactitud % - MAXIT es el nmero mximo de iteraciones % Salida % - Xp es el vector solucin % - ITER es el nmero de iteraciones realizadas % - FLAG es una variable lgica, es 1 si hubo convergencia, caso % contrario es 0 Y = feval(F, X); for K = 1 : MAXIT J = feval(JF, X); Q = X + (inv(J) * (-Y)); Y = feval(F, Q); if (norm(Q - X) < EPS1) | (abs(Y) < EPS2) ITER = K; FLAG = 1; Xp = real(Q); return; end X = Q; end disp(Se ha excedido el mximo nmero de iteraciones...); ITER = MAXIT; FLAG = 0;
44
CAP. 10
Primero almacenamos el sistema como un archivo F_2EC.m, tal como se muestra a continuacin: Listado F1_2EC.m function Y = F1_2EC(X) Y(1) = 1.6*X(1)^2 + 3.6*X(1)*X(2) - 7.8*X(1) - 2.6*X(2) + 5.2; Y(2) = 0.9*X(2)^2 + 3.1*X(1)^2 - 6.2*X(1) + 6.2*X(2); return; Luego, la matriz jacobiana est dada por:
La cual almacenamos como un archivo, por ejemplo JF_2EC.m, tal como se indica: Listado JF1_2EC.m function W(1, W(1, W(2, W(2, return; W = JF1_2EC(X) 1) = 3.2 * X(1) 2) = 6.2 * X(1) 1) = 3.2 * X(1) 2) = 1.8 * X(2) + + 3.6 * X(2) - 7.8; 6.2; 2.6 * X(2); 6.2;
Luego, para resolver el sistema, en la ventana de comandos de MATLAB ingresamos la siguiente orden: [Xp, ITER, FLAG] = NEWTON_MV(@F1_2EC, @JF1_2EC, [0.5, 0.4], 1e-6, 1e6, 25) Xp = 0.831437674158452 0.45565479630685 ITER = 6 FLAG = 1 Listado NEWTON_MODIF.M Resolucin de un sistema de ecuaciones no lineales F(X) = 0 mediante el mtodo de Newton Raphson modificado con desplazamientos sucesivos function [Xp, ITER, FLAG] = NEWTON_MODIF(F, D, X, EPS1, MAXIT) % Sintaxis % [Xp, ITER, FLAG] = NEWTON_MODIF(F, D, X, EPS1, MAXIT) % Entrada % - F es el sistema de ecuaciones no lineales, almacenado como F.m % - D son las derivadas, almacenadas como D.m % - X es el vector de valores iniciales % - EPS1 es el criterio de convergencia % - MAXIT es el nmero mximo de iteraciones % Salida % - Xp es el vector solucin % - ITER es el nmero de iteraciones realizadas
45
En primer lugar almacenamos el sistema como un archivo, por ejemplo: Listado F2_2EC.m function Y = F2_2EC(X) Y(1) = 4 - (8 * X(1))^(1/3) - X(2)^(1/2); Y(2) = 17 - X(1)^2 - X(2)^2; return; Adems requerimos las siguientes derivadas:
Las cuales tambin deben estar almacenadas como un archivo, por ejemplo DF2.m: Listado DF2_2EC.m function dY = DF2_2EC(X) dY(1) = -(8/3) * (8 * X(1))^(-2/3); dY(2) = -2 * X(2); return Luego, para resolver el sistema, en la ventana de comandos de MATLAB ingresar la siguiente instruccin: [Xp, ITER, FLAG] = NEWTON_MODIF(@F2_2EC, @DF2_2EC, [4, 3], 1e-6, 25) Xp = 0.9999999839973 4.00000000400067 ITER = 9 FLAG = 1
46
CAP. 10
Listado EULER.m Aproximacin a la solucin del problema del valor inicial y = (t, x) con y0 = y(a) en el intervalo [a, b], mediante el mtodo de Euler function [t, Y] = EULER(F, a, b, Y0, N) % Sintaxis % [t, Y] = EULER(F, a, b, Y0, N) % Entrada % - F es la funcin, almacenada como un archivo F.m % - a y b son los extremos del intervalo % - Y0 es la condicin inicial YO = Y(a) % - N es ell nmero de pasos % Salida % - t es el vector de la abscisas o variable independiente % - Y es el vector de las ordenadas o variable dependiente H = (b - a) / N; t = zeros(1, N + 1); Y = zeros(1, N + 1); t = [a: H: b]; Y(1) = Y0; for J = 1 : N Y(J + 1) = Y(J) + H * feval(F, t(J), Y(J)); end t = t; Y = Y; Para resolver la ecuacin diferencial dada en el Problema 7.1 (pgina 367), ; y(0) = 1
primero almacenamos la funcin como un archivo, por ejemplo ODEF1.m, segn se indica a continuacin: Listado ODEF1.m function DYDX = ODEF1(X, Y) DYDX = (Y + 1) / (X - 1); return; Luego, en la ventana de comandos ingresar la siguiente orden: [X, Y] = EULER(@ODEF1, 0, 0.4, 1, 4) X = 0 Y = 1.0 0.1 0.8 0.2 0.6 0.3 0.4 0.4 0.2 Listado RK2.m Aproximacin a la solucin del problema del valor inicial y = (t, x) con y0 = y(a) el intervalo [a, b], mediante el mtodo de Runge Kutta de segundo orden function [t, Y] = RK2(F, a, b, Y0, N) % Sintaxis % [t, Y] = RK2(F, a, b, Y0, N)
47
En primer lugar la almacenamos como un archivo, por ejemplo ODEF2.m, veamos: Listado ODEF2.m function DYDX = ODEF2(X, Y) DYDX = X + 2 * X * Y; return; Luego, en la ventana de comandos de MATLAB ingresar la siguiente orden: [X, Y] = RK2(@ODEF2, 0.5, 1, 1, 5) X = 0.5000 Y = 1.0000 0.6000 1.1740 0.7000 1.4057 0.8000 1.7129 0.9000 2.1209 1.0000 2.6661
48
CAP. 10
Listado RK4.m Aproximacin a la solucin del problema del valor inicial y = (t, x) con y0 = y(a) en el intervalo [a, b], mediante el mtodo de Runge Kutta de cuarto orden function [t, Y] = RK4(F, a, b, Y0, N) % Sintaxis % [t, Y] = RK4(F, a, b, Y0, N) % Entrada % - F es la funcin, almacenada como un archivo F.m % - a y b son los extremos del intervalo % - Y0 es la condicin inicial YO = Y(a) % - N es ell nmero de pasos % Salida % - t es el vector de la abscisas o variable independiente % - Y es el vector de las ordenadas o variable dependiente H = (b - a) / N; t = zeros(1, N + 1); Y = zeros(1, N + 1); t = [a: H: b]; Y(1) = Y0; for J = 1 : N K1 = H * feval(F, t(J), Y(J)); K2 = H * feval(F, t(J) + H/2, Y(J) + K1/2); K3 = H * feval(F, t(J) + H/2, Y(J) + K2/2); K4 = H * feval(F, t(J) + H, Y(J) + K3); Y(J + 1) = Y(J) + (K1 + 2 * K2 + 2 * K3 + K4)/6; end t = t; Y = Y; Por ejemplo, para resolver la ecuacin diferencial anterior (Problema 7.7, pg. 379), que est dada por: ; y(0.5) = 1
Como ya esta almacenada como ODEF2.m, simplemente digitar lo siguiente en la ventana de comandos de MATLAB: [X, Y] = RK4(@ODEF2, 0.5, 1, 1, 5) X = 0.5000 Y = 1.0000 0.6000 1.1744 0.7000 1.4069 0.8000 1.7155 0.9000 2.1260 1.0000 2.6755 Listado RK4_S.m Aproximacin a la solucin del sistema de ecuaciones diferenciales: x1 = 1(t, x1(t), x2(t), ... xm(t)) x2 = 2(t, x1(t), x2(t), ... xm(t)) . . . xm = m(t, x1(t), x2(t), ... xm(t))
49
50
CAP. 10
Listado TC_UESG_CR.m Aproximacin a la solucin la ecuacin diferencial de transferencia de calor, unidireccional, rgimen estacionario, sin generacin en coordenadas rectangulares function T = TC_UESG_CR(TA, TB) % Sintaxis % T = TC_UESG_CR(TA, TB) % Entrada % - TA, TB son las temperaturas en los extremos de la barra % Salida % - T = [T1, T2, T3, T4, T5] es un vector que retorna las temperaturas % interiores de la barra D(1) = -3; D(5) = -3; for I = 2 : 4 D(I) = -2; end for I = 1 : 4 D1(I) = 1; end A = diag(D1, -1) + diag(D, 0) + diag(D1, 1); B(1) = -2 * TA; B(5) = -2 * TB; B = B; T = inv(A) * B; Para resolver el problema 8.1 dado en la pgina 562, ingresar la siguiente orden en la ventana de comandos de MATLAB: T = TC_UESG_CR(100, 500) T = 140.00 220.00 300.00 380.00 460.00 Listado TC_UECG_CR.m Aproximacin a la solucin la ecuacin diferencial de transferencia de calor, unidireccional, rgimen estacionario, con generacin en coordenadas rectangulares function T = TC_UECG_CR(TA, TB, G, K, DX) % Sintaxis % T = TC_UECG_CR(TA, TB) % Entrada % - TA, TB son las temperaturas en los extremos de la barra % - G es el trmino de generacin % - K es el coeciente de conductividad % - DX es el incremento de longitud % Salida % - T = [T1, T2, T3, T4, T5] es un vector que retorna las temperaturas % interiores de la barra C = G * DX^2 / K;
51
52
CAP. 10
Para resolver el problema 8.3 dado en la pgina 568, ingresar la siguiente orden en la ventana de comandos de MATLAB: T = TC_COND_CONV_UE_CR(100, 20, 20, 1, 1, 1, 0.2) T = 67.3513 39.9351 28.4670 23.7724 22.0958 Listado EXPLICITO.m Resolucin de la ecuacin diferencial parcial:
Mediante el mtodo explcito. function [TMALLA] = EXPLICITO(CI, CF1, CF2, NX, Nt, XF, tF, ALFA) % Sintaxis % [TMALLA] = EXPLICITO(CI, CF1, CF2, NX, Nt, XF, tF, ALFA) % Entrada % - CI es la condicin inicial, almacenada como un archivo CI.m % - CF1 y CF2 son las condiciones de frontera, almacenadas como archivos % CF1.m y CF2.m, respectivamente % - NX es el nmero de puntos de la malla en el eje X % - Nt es el nmero de puntos de la malla en el eje t % - XF es la longitud total del eje X % - tF es la longitud total del eje t % - ALFA es el coeciente de la derivada de segundo orden % Salida % - TMALLA es una matriz que contiene la tabla (malla) con los valores de % la variable dependiente T a lo largo del eje X a distintos tiempos t DX = XF / (NX - 1); Dt = tF / (Nt - 1); LAMBDA = ALFA * Dt / DX^2; for I = 2 : (NX - 1) T(I) = CI(DX * (I - 1)); end T(1) = (CI(DX) + CF1(Dt)) / 2;
53
Entonces primero tenemos que crear los archivos para la condicin inicial y para las condiciones de frontera. Listado C1.m function T0 = CI(X) T0 = 0; return; Listado CF1.m function T = CF1(t) T = 50; return; Listado CF2.m function T = CF2(t) T = 50; return; Luego, en la ventana de comandos de MATLAB ingresar la siguiente orden: TMALLA = EXPLICITO(@CI, @CF1, @CF2, 6, 4, 1, 0.03, 1) TMALLA = 25.0000 0 0 0 0 25.0000 50.0000 6.2500 0 0 6.2500 50.0000 50.0000 15.6250 1.5625 1.5625 15.6250 50.0000 50.0000 20.7031 5.0781 5.0781 20.7031 50.0000 Para obtener de manera grfica una distribucin de la temperatura en la barra para diferentes tiempos, ingresar las siguientes rdenes en la ventana de comandos de MATLAB: plot(X, TMALLA(1, :), X, TMALLA(2, :), X, TMALLA(3, :), X, TMALLA(4, :)) xlabel(X); ylabel(T);
54
CAP. 10
Para obtener la grfica de la solucin numrica de la EDP de conduccin de calor en una sola dimensin hacer: surf(X, t, TMALLA) xlabel(X); ylabel(t); zlabel(T);
55
25.0000
56