81
INSTITUTO POLITECNICO NACIONAL COORDINACION GENERAL DE ESTUDIOS DE POSGRADO E INVESTIGACION ESCUELA SUPERIOR DE INGENIERIA Y ARQUITECTURA UNIDAD ZACATENCO DESARROLLO DE CODIGOS EN MATLAB PARA RESOLVER PROBLEMAS EN HIDRÁULICA REGISTRO CGPI 20041017 PARTICIPANTES: LUCIO FRAGOSO SANDOVAL J. ROBERTO RUIZ Y ZURVIA FLORES ARTURO BRUNO JÚAREZ LEÓN JOSÉ LUIS PENA ROMERO ADRIANA GUADALUPE PORRES LÓPEZ MEXICO DISTRITO FEDERAL, A 28 DE JUNIO DEL 2005.

INSTITUTO POLITECNICO NACIONAL - SAPPI - Sistema …sappi.ipn.mx/cgpi/archivos_anexo/20041017_1240.pdf · derivacion numerica 48 vii.1. planteamiento del problema 48 vii.2. metodos

  • Upload
    doanthu

  • View
    218

  • Download
    2

Embed Size (px)

Citation preview

INSTITUTO POLITECNICO NACIONAL

COORDINACION GENERAL DE ESTUDIOS DE POSGRADO E INVESTIGACION

ESCUELA SUPERIOR DE INGENIERIA Y ARQUITECTURA UNIDAD ZACATENCO

DESARROLLO DE CODIGOS EN MATLAB PARA RESOLVER PROBLEMAS EN HIDRÁULICA

REGISTRO CGPI 20041017

PARTICIPANTES:

LUCIO FRAGOSO SANDOVAL J. ROBERTO RUIZ Y ZURVIA FLORES

ARTURO BRUNO JÚAREZ LEÓN JOSÉ LUIS PENA ROMERO

ADRIANA GUADALUPE PORRES LÓPEZ

MEXICO DISTRITO FEDERAL, A 28 DE JUNIO DEL 2005.

DESARROLLO DE CODIGOS EN MATLAB, PARA RESOLVER PROBLEMAS EN HIDRÁULICA

RESUMEN 4 INTRODUCCIÓN 4 METODOS Y MATERIALES 5 IMPACTO 6 I. ESTUDIO DEL SISTEMA INTERACTIVO MATLAB® 6 I.1ACCESO A MATLAB. 6 I.2. INTRODUCCIÓN DE MATRICES. 6 I.3. OPERACIONES CON MATRICES, OPERACIONES A COORDENADAS. 7 I.4. DECLARACIONES, EXPRESIONES Y VARIABLES; ALMACENAMIENTO DE UNA SESIÓN. 7 I.5. FUNCIONES PARA LA CONSTRUCCIÓN DE MATRICES. 8 I.6. FOR, WHILE, IF - Y RELACIONES. 8 I.7. FUNCIONES ESCALARES. 9 I.8. FUNCIONES VECTORIALES. 9 I.9. FUNCIONES MATRICIALES. 10 I.10. COMANDOS DE EDICIÓN DE LÍNEA Y RELLAMADA. 10 I.11. ARCHIVOS .M. 11 I.12. CADENAS DE TEXTO, MENSAJES DE ERROR, INPUT. 11 I.13. FORMATO DE SALIDA. 12 I.14. HARDCOPY. 12 I.15. GRÁFICOS. 12 II. MODELOS MATEMÁTICOS EN HIDRÁULICA, ANÁLISIS DE APROXIMACIONES Y ERRORES EN LOS PROBLEMAS. 14 II.1. ECUACIÓN DE NAVIER-STOKES 14 III. RESOLUCION DE ECUACIONES NO LINEALES 18 III.1. PLANTEAMIENTO DEL PROBLEMA 18 III.2. METODOS DE SOLUCION 19 III.2.1. MÉTODO DEL PUNTO FIJO. 19 III.2.2. MÉTODO DE BISECCIÓN DE BOLZANO 20 III.2.3. MÉTODO DE LA REGLA FALSA O DE LA FALSA POSICIÓN 23 III.2.4. MÉTODO DE NEWTON-RAPHSON 25 III.2.5. MÉTODO DE LA SECANTE 27 III.2.6. FUNCIÓN FZERO (F_NOMBRE,P0) DE MATLAB. 29 IV. RESOLUCION DE SISTEMAS DE ECUACIONES 30 IV.1. PLANTEAMIENTO DEL PROBLEMA 30 IV.2. METODOS DE SOLUCION 31 IV.2.1. SOLUCIONES EMPLEANDO OPERACIONES CON MATRICES 31 IV.2.2. MÉTODO DE SEIDEL 35 IV.2.3. MÉTODO DE NEWTON-RAPHSON. 37 V. INTERPOLACIÓN Y APROXIMACIÓN POLINOMIAL 39

V.1. PLANTEAMIENTO DEL PROBLEMA 39 V.2. METODOS DE SOLUCION 39 V.2.1. POLINOMIO INTERPOLADOR DE LAGRANGE 39 V.2.2. POLINOMIO DE INTERPOLACIÓN DE NEWTON 41 V.2.3. POLINOMIO DE CHEBYSHEV. 43 VI. AJUSTE DE CURVAS 45 VI.1. PLANTEAMIENTO DEL PROBLEMA 45 VI.2. METODOS DE SOLUCION 45 VI.2.1. REGRESIÓN LINEAL O RECTA DE REGRESIÓN EN MÍNIMOS CUADRADOS 45 VI.2.2. LINEALIZACIÓN DE RELACIONES NO LINEALES. 46 VII. DERIVACION NUMERICA 48 VII.1. PLANTEAMIENTO DEL PROBLEMA 48 VII.2. METODOS DE SOLUCION 48 VII.2.1. DERIVACIÓN NUMÉRICA MEDIANTE LIMITES. 48 VII.2.2. DERIVACIÓN USANDO EL MÉTODO DE EXTRAPOLACIÓN DE RICHARDSON 49 VII2.3. DERIVACIÓN NUMÉRICA MEDIANTE INTERPOLACIÓN EN N-1 NODOS 50 VIII. INTEGRACION NUMERICA 52 VIII.1. PLANTEAMIENTO DEL PROBLEMA 52 VIII.2. METODOS DE SOLUCION 52 VIII.2.1. MÉTODO DEL TRAPECIO 52 VIII.2.2. MÉTODO DE SIMPSON 54 VIII.2.3. MÉTODO DE ROMBERG 55 IX. ECUACIONES DIFERENCIALES ORDINARIAS 58 IX.1. PLANTEAMIENTO DEL PROBLEMA 58 IX.2. METODOS DE SOLUCION 58 IX.2.1. MÉTODO DE EULER 58 IX.2.2. MÉTODO DE HEUN 59 IX.2.3. MÉTODO DE LAS SERIES DE TAYLOR 61 IX.2.4. MÉTODOS DE RUNGE-KUTTA 62 IX.2.5. MÉTODO DE ADAMS-BASHFORTH-MOULTON 63 IX.2.6. MÉTODO DE MILNE 65 IX.2.7. MÉTODO DE HAMMING 67 X. SOLUCION NUMERICA DE ECUACIONES EN DERIVADAS PARCIALES 69 X.1. PLANTEAMIENTO DEL PROBLEMA 69 X.1.1. ECUACIÓN DIFERENCIAL PARCIAL ELÍPTICA (FUNCIÓN POTENCIAL) 69 X.2. METODOS DE SOLUCION 71 X.2.2.a METODO DE DIFERENCIAS FINITAS EXPLICITAS 74 X.2.2.b METODO DE CRANK-NICHOLSON 76 X.2.2.c METODO DE DIFERENCIAS FINITAS 78 REFERENCIAS BIBLIOGRÁFICAS 80 ANEXO 81

RESUMEN Tradicionalmente en la enseñanza de la hidráulica se ha dejado que el alumno genere sus propios códigos para resolver problemas en este campo, teniendo que rehacerse cada semestre tales códigos. Por ello, investigadores de la Escuela Superior de Ingeniería y Arquitectura, Unidad Zacatenco del Instituto Politécnico Nacional, desarrollaron este proyecto que nos permite estandarizar los procedimientos en la generación de códigos en Matlab, mismos que se pueden reutilizar, y son fáciles de exportar a otros lenguajes de programación como lo es el lenguaje C, Basic, o bien Fortran, y que incluso son fáciles de interpretar y realizar. En este proyecto se desarrollaron diversas herramientas que podrán ser utilizadas en el curso de Métodos Numéricos y aplicadas a otras materias de Hidráulica, así como también en el desarrollo de otros proyectos de investigación y en el desarrollo de tesis de grado. A través de este proyecto se llevo a cabo en el ambiente del programa Matlab, el desarrollo de diferentes códigos, para la solución de problemas de metodología numérica, según el tipo de problema sobre hidráulica que se pretenda analizar y resolver. De igual manera se desarrolló un Manual de Usuario, que contiene un breviario del objetivo principal de cada codigo, así como su pseudocódigo y algoritmo que nos explican la actividad paso a paso que desarrolla cada programa.

INTRODUCCION Los métodos numéricos son fundamentales para el desarrollo de la programación numérica de problemas en el campo de la hidráulica y en general en todo el ámbito de la ingeniería. Los objetivos planteados inicialmente en el proyecto son:

a) Desarrollar una serie de códigos en Matlab, que permitieran resolver problemas en el campo de la hidráulica.

b) Estandarizar los procedimientos utilizados en el desarrollo de dichos códigos. c) Evaluar los resultados generados de la estandarización de los códigos a través de

los menús creados, dadas las rutinas y subrutinas. d) Desarrollar notas para el curso de Métodos numéricos y notas previas para el

desarrollo de un libro. Es por eso, que a través del desarrollo de éstos códigos de análisis númerico, se realizaron varios procedimientos estandarizados, para que los alumnos que cursen materias, en las cuales tengan la necesidad de desarrollar alguno de los programas que contenga la guía de este trabajo, ahorre tiempo en la codificación del programa, ya que solo tendrá que delimitar su problema y agregar los datos en la ventana de inicio del programa Matlab o bien a un fichero, y éste correrá sus datos en el algoritmo que se le designe.

Con el desarrollo de este proyecto se generó un paquete de códigos, de los cuales nos podremos auxiliar en la resolución de problemas hidráulicos, así como una guía práctica que nos permite conocer la utilidad de cada uno de los métodos desarrollados, su funcionamiento, su pseudocódigo (lista de acciones del programa),

su algoritmo (secuencia lógica y matemática de los pasos que ejecuta el programa), así como la codificación detallada de cada uno de éstos. Por lo antes expuesto se puede considerar, que el proyecto es de gran importancia púes sus resultados pueden utilizarse de una amplia forma, dentro del medio educativo, y de investigación, dentro del desarrollo de otros proyectos relacionados con la Hidráulica, cuyo campo acción es muy grande.

METODOS Y MATERIALES Para el alcance de los objetivos planteados, fue necesario recrear en Matlab todos y cada uno de los componentes del análisis numérico, para así a partir de ellos delimitar cada uno de los elementos que se debían de analizar y desarrollar para generar los nuevos códigos en todos los temas de los Métodos Numéricos que nos permitieran su aplicación para resolver problemas en el campo hidráulico, para diferentes condiciones y situaciones que se representaron, en dichos programas, lo cual también integran los resultados de este proyecto. Lo antes expuesto se describe detalladamente en los diez capítulos que se presentan después de la presentación del IMPACTO del presente proyecto. De igual manera de cada sección se generó un menú que permitió realizar la evaluación de los resultados generados, de manera rápida y concisa, demostrando la efectividad de las metodologías empleadas. AMBIENTE MATLAB. Para llevar a cabo la aplicación de dicha metodología fue necesario, realizar un estudio del comportamiento de los componentes que utilizaríamos en matlab, para desarrollar el estudio de los scrips o códigos. MATLAB es un programa para realizar cálculos numéricos con vectores y mátrices. Como caso particular puede también trabajar con números escalares, tanto reales como complejos. Una de las capacidades más atractivas es la de realizar una amplia variedad de gráficos en dos y tres dimensiones. MATLAB tiene también un lenguaje de programación propio. 1 Es un gran programa para cálculo técnico y científico. Para ciertas operaciones es muy rápido, cuando puede ejecutar sus funciones en código nativo con los tamaños más adecuados para aprovechar sus capacidades de vectorización. En otras aplicaciones resulta bastante más lento que el código equivalente desarrollado en C, C++ o Fortran. Sin embargo, siempre es una magnífica herramienta de alto nivel para desarrollar aplicaciones técnicas, fácil de utilizar y que aumenta la productividad de los programadores respecto a otros entornos de desarrollo.

IMPACTO

Por lo antes expuesto se puede concluir, que el proyecto tiene un gran impacto pues sus resultados pueden utilizarse de una amplia forma, dentro del medio educativo, y de investigación, dentro del desarrollo de otros proyectos relacionados con la Hidráulica, cuyo campo acción es muy grande. Lo anterior se entiende al considerar que a través de este proyecto se desarrollaron diversas herramientas que podrán ser utilizadas en el curso de Métodos Numéricos y aplicadas a otras materias de la Maestría en ciencias en Hidráulica, así como también en el desarrollo de otros proyectos de investigación y además en el desarrollo de tesis de grado.

I. Estudio del sistema interactivo MATLAB®

I.1. Acceso a MATLAB. Después de entrar a la mayoría de los sistemas, para acceder a MATLAB basta utilizar la instrucción matlab y para salir, la instrucción exit o quit. Por ejemplo si estamos en una PC, salvo que tengamos el programa en un directorio aparte, basta con escribir C> matlab Podemos salir de él con la instrucción: >> quit. En sistemas que permiten procesos múltiples, como el UNIX, será conveniente tener activos a la vez MATLAB y el editor local. Si se trabaja en una estación de trabajo con ventanas múltiples será deseable tener activos MATLAB en una ventana y el editor en otra. Los detalles de la instalación local se pueden obtener del centro de cálculo correspondiente, o consultando al instructor.

I.2. Introducción de matrices. MATLAB trabaja esencialmente con un solo tipo de objetos: una matriz numérica rectangular con entradas posiblemente complejas; todas las variables representan matrices. A veces, las matrices 1_1 se consideran escalares, y las matrices con una sola fila o columna se consideran como vectores. Hay varias formas diferentes para introducir una matriz en MATLAB. A saber:

_ Introduciendo una lista explícita de elementos, _ Generándola mediante funciones y declaraciones, _ Creándola en un archivo .m, _ Cargándola de un archivo de datos externo .

Por ejemplo, cualquiera de las declaraciones A = [1 2 3; 4 5 6; 7 8 9] y A = [

1 2 3 4 5 6 7 8 9 ]

crea la matriz 3 _ 3 que se espera y la asigna a una variable A. Los elementos en una fila de una matriz pueden separarse tanto por comas como por espacios en blanco. Cuando alguno de los números se escribe en forma exponencial (por ejemplo 2.34e-9), deben evitarse los espacios en blanco. La escritura de una matriz grande debe hacerse preferentemente en un archivo .m, donde es más sencillo corregir errores. Las entradas individuales de una matriz o de un vector se pueden obtener poniendo los índices entre paréntesis de la forma usual. Por ejemplo, A(2; 3) denota la entrada en la segunda _la y tercera columna de la matriz A y x(3) denota la tercera coordenada del vector x. Solo se pueden usar como índices de vectores y de matrices enteros positivos.

I.3. Operaciones con matrices, operaciones a coordenadas. Disponemos en MATLAB de las siguientes operaciones con matrices: + adición _ sustracción * multiplicación ^ potenciación ‘ traspuesta \ división izquierda / división derecha Estas operaciones para matrices se aplican también a escalares (matrices 1_1). Si los tamaños de las matrices son incompatibles para la operación matricial se obtiene un mensaje de error, exceptuando el caso en que uno de los operandos sea un escalar y el otro una matriz (para la adición, sustracción, división y multiplicación). En esta situación se opera el escalar con cada término de la matriz.

I.4. Declaraciones, expresiones y variables; almacenamiento de una sesión. MATLAB es un lenguaje de expresiones; las expresiones que se escriben son interpretadas y evaluadas. Las instrucciones de MATLAB son, normalmente, de la forma :

variable = expresión, o simplemente expresión. Las expresiones se componen, usualmente, a partir de operadores, funciones y nombres de variables. La evaluación de una expresión produce una matriz, que se muestra en pantalla, y se

asigna a la variable para su posterior uso. Si se omiten la variable y el signo =, se crea una variable llamada ans (por answer) a la que se asigna el resultado de la expresión. La instrucción who muestra las variables que se encuentran en el espacio de trabajo. Para eliminar una variable de la memoria se utiliza la instrucción clear nombre variable. Si se escribe sólo clear se borran todas las variables no permanentes. Almacenamiento de sesiones. Cuando salimos de MATLAB se pierden todas las variables. Para evitarlo se puede utilizar la instrucción save antes de salir. Esto hace que las variables se almacenen en el archivo de disco matlab.mat. Al acceder de nuevo a MATLAB, se pueden recuperar todas las variables con la instrucción load.

I.5. Funciones para la construcción de matrices. Las siguientes funciones están disponibles en MATLAB:

eye matriz identidad zeros matriz de ceros ones matriz de unos triu parte triangular superior de una matriz tril parte triangular inferior de una matriz rand matriz generada aleatoriamente hilb matriz de Hilbert magic matriz mágica

Por ejemplo, zeros(m,n) produce una matriz nula m _ n, y zeros(n) produce otra cuadrada de orden n; si A es una matriz, entonces zeros(A) produce una matriz de ceros del mismo orden que A. Si x es un vector, diag(x) es la matriz diagonal con x en su diagonal; si A es una matriz cuadrada, diag(A) es un vector formado por la diagonal de A.

I.6. For, while, if - y relaciones. Básicamente, las instrucciones para el control de flujo de MATLAB, operan como en la mayoría de los lenguajes usuales. for. Por ejemplo, las instrucciones

x = []; for i = 1:n, x=[x,i ^ 2], end o x = []; for i = 1:n x = [x,i b 2] end

darán como resultado un cierto vector mientras que

x = []; for i = n:-1:1, x=[x,i ^ b 2], end dará el mismo vector en orden inverso, producirán e imprimirán en pantalla la matriz de Hilbert m _ n. El punto y coma de la instrucción interior suprime la impresión no deseada de los resultados intermedios mientras que el último H muestra el resultado final. while. La forma general de un bucle while es

while relación instrucciones

end Las instrucciones se repetirán mientras la relación sea cierta. Por ejemplo, dado un número a, las instrucciones siguientes calculan y muestran el menor entero no negativo n tal que 2n ≥ a. if. La forma general de un bucle if simple es

if relación instrucciones

end

Las instrucciones se ejecutarán sólo si la relación es cierta. Relaciones. Los operadores relacionales en MATLAB son

< menor que > mayor que <= menor o igual que >= mayor o igual que == igual _= no igual.

I.7. Funciones escalares. Algunas funciones de MATLAB operan esencialmente sobre escalares, aunque lo hacen también sobre matrices (elemento a elemento). Las funciones más comunes entre estas son:

sin asin exp abs round cos acos log (natural) sqrt oor tan atan rem (resto) sign ceil

I.8. Funciones vectoriales. Otras funciones de MATLAB operan fundamentalmente sobre vectores (fila o columna), aunque también pueden operar sobre matrices m _ n (m _ 2) haciéndolo en este caso columna a columna, produciendo, por tanto, un vector _la que contiene el resultado de su aplicación a cada columna. Para conseguir que actúen por _las basta usar la transpuesta;

por ejemplo, mean(A')'. Veamos algunas de estas funciones:

max sum median any min prod mean all sort std

Por ejemplo, la entrada máxima de un matriz A se obtiene con max(max(A)) en vez de max(A). Inténtelo.

I.9. Funciones matriciales. Las funciones matriciales más útiles de MATLAB son las siguientes:

chol factorización de Cholesky svd descomposición en valores singulares inv inversa lu factorización LU qr factorización QR hess forma de Hessenberg schur descomposición de Schur rref forma escalonada reducida por filas expm matriz exponencial sqrtm matriz raíz cuadrada poly polinomio característico det determinante size tamaño norm norma 1, norma 2, norma de Frobenius, norma 1 cond número de condición en la norma 2 rank rango

I.10. Comandos de edición de línea y rellamada. Es fácil editar la línea de comandos en MATLAB. El cursor se posiciona con las echas izquierda/derecha mientras que para borrar caracteres pueden usarse las teclas Retroceso o Suprime. También son accesibles otras posibilidades de edición. En un PC pruebe con las teclas Inicio, Fin, y Suprime; en otros sistemas ver help cedit o type cedit. Una posibilidad muy útil es usar las echas arriba/abajo para recuperar los comandos previos. Se puede, por tanto, recuperar una línea de comandos previa, editarla, y ejecutarla revisada. Para pequeñas rutinas, esto es más conveniente que usar un archivo.m lo que requiere moverse entre MATLAB y el editor. Por ejemplo, el número de operaciones para el cálculo de la inversa de matrices de varios tamaños podrá ser comparado recuperando, editando y ejecutando repetidamente:

a = rand(8); flops(0), inv(a); flops

Si se desea comparar las gráficas de las funciones y = senmx y y = cosnx en el intervalo [0; 2π] para varios m y n, se podrá hacer lo mismo con la línea de comandos:

m=2; n=3; x=0:.01:2*pi; y=sin(m*x); z=cos(n*x); plot(x,y,x,z)

I.11. Archivos .m. MATLAB puede ejecutar una sucesión de instrucciones almacenadas en archivos de disco. Estos archivos se denominan \archivos .m", debido a que su sufijo debe ser \m". Gran parte del trabajo con MATLAB será el de crear y refinar archivos.m. Hay dos tipos de archivos .m: archivos de instrucciones y archivos de funciones. Archivos de instrucciones. Los archivos de instrucciones son utilizados a menudo para introducir datos en una matriz grande. En un archivo de este tipo es bastante sencillo corregir los errores sin tener que repetir todo el trabajo. Si, por ejemplo, se escribe en el archivo datos.m Archivos de funciones. Los archivos de funciones hacen que MATLAB tenga capacidad de crecimiento. Se pueden crear funciones específicas para un problema concreto, y, a partir de su introducción, tendrán el mismo rango que las demás funciones del sistema. Las variables en las funciones son locales. Veremos, en primer lugar, un ejemplo sencillo de archivo de función:

function a = ental(m,n) %ENTAL Matriz entera generada aleatoriamente. % ental(m,n) produce una matriz mxn con entradas % enteras entre 0 y 9 a = floor(10*rand(m,n));

I.12. Cadenas de texto, mensajes de error, input. Las cadenas de texto se introducen en MATLAB entre comillas simples. Por ejemplo, s = 'Esto es una prueba' asigna la cadena de texto dada a la variable s. Las cadenas de texto pueden mostrarse con la función disp.

Por ejemplo: disp('Este mensaje se está mostrando aquí') Los mensajes de error se muestran mejor con la función error ;

error('Lo siento, la matriz debe ser simétrica') ya que esta hace que la ejecución salga del archivo .m.

I.13. Formato de salida. Aunque todos los cálculos en MATLAB se efectúan en doble precisión, el formato de la salida en pantalla puede ser controlado con las siguientes instrucciones.

format short coma fija con 4 decimales (el defecto) format long coma fija con 14 decimales format short e notaci_on cient___ca con 4 decimales format long e notaci_on cient___ca con 15 decimales

Una vez que se ordena un formato, se mantiene hasta que se ordena un cambio. La orden format compact evitará la mayor parte de las líneas en blanco, con lo que se puede mostrar más información en pantalla. Es independiente de las demás instrucciones de formato.

I.14. Hardcopy. La forma más sencilla de obtener una hardcopy1 es con la instrucción diary. La orden diary nombre de archivo hace que todo lo que aparezca a continuación en pantalla (excepto los gráficos) sea escrito en el archivo nombre de archivo (si se omite el nombre se toma por defecto diary) hasta que se ordena diary off; la instrucción diary on hará que se escriba al final del archivo,etc. Al terminar, se puede editar el archivo como se desee e imprimirlo en el sistema local. Todo se puede hacer sin salir de MATLAB usando el signo !.

I.15. Gráficos. MATLAB puede producir gráficos planos y gráficos de malla de superficies tridimensionales. Para ver algunas de sus posibilidades escriba plotdemo. Gráficos planos. La instrucción plot crea gráficos en el plano XY; si x e y son vectores de la misma longitud, la orden plot(x,y) accede a la pantalla gráfica y realiza un gráfico plano de los elementos de x contra los elementos de y. Por ejemplo, podemos dibujarla gráfica de la función seno sobre el intervalo [-4; 4] con las instrucciones siguientes:

x = -4:.01:4; y = sin(x); plot(x,y)

El vector x es una partición del dominio con paso 0.01 mientras que y es un vector (sin es vectorial) con los valores que toma el seno en los nodos de esta partición. Para volver a la pantalla alfanumérica desde la gráfica, se pulsa cualquier tecla. Por el contrario, para acceder a la pantalla gráfica, se usa la orden shg (show graph). Si su máquina soporta ventanas múltiples con una ventana gráfica aparte, puede desear mantener la ventana expuesta |aunque a un lado| y la ventana alfanumérica activa. Pueden ponerse títulos, comentarios en los ejes o en cualquier otra parte con los siguientes comandos que tienen una cadena como argumento:

title t__tulo del gr_a_co xlabel comentario en el eje x ylabel comentario en el eje y gtext texto posicionado interactivamente text texto posicionado mediante coordenadas

II. Modelos matemáticos en hidráulica, análisis de aproximaciones y errores en los problemas.

II.1. Ecuación de Navier-Stokes Considerando la partícula elemental de masa m constante, representada en la figura 4.6 y sujeta a las fuerzas de superficie y a la fuerza de cuerpo en un campo gravitacional la ecuación 4.1 aplicada en la dirección x , resulta

( )F madudt

dxdydz a dydzx x x x= = = = − +ρ σ

σ∂σ∂

τ∂τ∂x yx

yx

xdx dydz

ydy dxdz+

+ +

τ τ∂τ∂

τyx zxzx

zxdxdzz

dz dydx dydx+ +

− +

ρg dxdydzx 2.1 simplificando se tiene que:

ρ∂σ∂

∂τ∂

∂τ∂

ρax y z

gxx yx zx

x= + + + 2.2a

similarmente, para las direcciones y y z , resulta que

ρ∂σ∂

∂τ∂

∂τ∂

ρay x z

gyy xy zy

y= + + + 2.2b

ρ∂σ∂

∂τ∂

∂τ∂

ρaz x y

gzz xz yz

z= + + + 2.2c

nombrándose a éstas, Ecuaciones Generales de Movimiento, aplicadas a cualquier fluido dentro de un campo gravitacional. Sí el fluido es de tipo newtoniano se sustituyen las ecuaciones 4.40 y 4.45 en las ecuaciones 2.2. Además de considerar que el esfuerzo normal σ es igual a - p, según la ecuación 3.48, la ecuación 2.2a resulta ser igual a

( )ρ ρ∂∂

∂∂

µ∂∂

µ∂

∂µ

∂∂

∂∂

a gpx x

ux y

vx

uux x= − + − ∇

+ +

+•2

23

q

∂µ

∂∂

∂∂z

uz

wx

+

2.3

qué es válida para un fluido newtoniano de densidad y viscosidad variables en un campo gravitacional. Como µ es una función de la temperatura y muy ligeramente de la presión, por tanto, si se considera que los cambios de la temperatura y de presión no influyen en µ, ésta entonces es constante, por lo que la ecuación 2.3 se transforma en

( )ρ ρ∂∂

µ∂

∂∂∂

µ∂

∂∂∂

∂∂ax xg

px x

ux y

vx

uu

= − + − ∇

+ +

+•2

23

q

µ∂

∂∂∂

∂∂z

uz

wx

+

2.4

qué después de desarrollar y simplificar, y haciendo lo mismo para las direcciones y y z , se obtiene

( )ρ ρ∂∂

µ∂∂

∂∂

∂∂

µ ∂∂ax xg

px

ux

uy

uz x

= − + + +

+ ∇•

2

2

2

2

2

2 3q 2.5a

( )ρ ρ∂∂

µ∂∂

∂∂

∂∂

µ ∂∂

a gpy

vx

vy

vz xy y z z z= − + + +

+ ∇•

2 2 2

3q 2.5b

( )ρ ρ∂∂

µ∂∂

∂∂

∂∂

µ ∂∂

a gpz

wx

wy

wz zz z z z= − + + +

+ ∇•

2 2 2

3q 2.5c

Estas ecuaciones son llamadas Ecuaciones de Navier-Stokes o ecuaciones diferenciales de la conservación de la cantidad de movimiento lineal, aplicadas a fluidos newtonianos de viscosidad constante, de densidad variable en un campo gravitacional y para un flujo no permanente. Estas ecuaciones presentadas en notación vectorial y usando las ecuaciones 3.7 y 3.9 se transforman en

( ) ( )ρ ρ∂∂

ρ ρ µµ

aq

q q g q q= + ∇ = − ∇ + ∇ + ∇ ∇• •tp 2

3 2.6

Para fluidos donde la densidad permanece constante, la ecuación de continuidad es ∇ =•q 0 , por tanto la ecuación 2.6 se reduce a

( )ρ∂∂

ρ ρ µq

q q g qt

p+ ∇ = − ∇ + ∇•2 2.7

Generalizando la posición de una partícula referida a un sistema de coordenadas cartesiano y situada a una altura h(x y z, , ) sobre un plano horizontal de referencia, como el que se observa en la figura 4.7, el valor de ∂ ∂h x/ significa el incremento de la elevación h en la dirección x ; si esta variación es constante, entonces será igual al sen ∝. Para un valor positivo de ∂ ∂h x/ , la componente del peso en la dirección x, será negativa, pues la componente de la aceleración de la gravedad en la dirección x es gx e igual a - g h x∂ ∂/ . De forma semejante, para las direcciones y y z las componentes de la aceleración de la

gravedad serán respectivamente; g g h y y g g h zy = − = −∂ ∂ ∂ ∂/ / ,2 o bien g = ∇g h

que pueden ser sustituidas en las ecuaciones anteriores. Por ejemplo, para el caso de la ecuación 2.7 y sus componentes resultan ser

( )aq

q q q= + ∇ = − ∇ − ∇ + ∇•

∂∂ ρ

µρt

g h p1 2 2.8

∂∂

∂∂

∂∂

∂∂

∂∂ ρ

∂∂

µρ

∂∂

∂∂

∂∂

ut

uux

vuy

wuz

ghx

px

ux

uy

uz

+ + + = − − + + +

1 2

2

2

2

2

2 2.9a

∂∂

∂∂

∂∂

∂∂

∂∂ ρ

∂∂

µρ

∂∂

∂∂

∂∂

vt

uvx

vvy

wvz

ghy

py

vx

vy

vz

+ + + = − − + + +

1 2

2

2

2

2

2 2.9b

∂∂

∂∂

∂∂

∂∂

∂∂ ρ

∂∂

µρ

∂∂

∂∂

∂∂

wt

uwx

vwy

wwz

ghz

pz

wx

wy

wz

+ + + = − − + + +

1 2

2

2

2

2

2 2.9c

Debe observarse que ax ay az, ,y fueron reemplazadas por los valores expresados en las ecuaciones 3.9. Las ecuaciones 2.8 y 2.9 son también de Navier - Stokes en un sistema de coordenadas cartesiano para un fluido newtoniano de viscosidad y densidad constante (incompresible). Las ecuaciones 2.9 en coordenadas cilíndricas se expresa de la siguiente manera: Para la dirección r ∂∂

∂∂

∂∂θ

∂∂

∂∂ ρ

∂∂

θ θvt

vvr

vr

v vr

vvz

ghr

pr

rr

r rz

z+ + − + = − +2 1

( )µρ

∂∂

∂∂

∂∂θ

∂∂θ

∂∂

θ

r r rrv

rv

rv v

zrr r1 1 2

2

2

2 2

2

2

+ − +

2.10a

Para la dirección θ ∂∂

∂∂

∂∂θ

∂∂

∂∂θ ρ

∂∂θ

θ θ θ θ θ θvt

vvr

vr

v v vr

vvz

gh

rp

rr

z+ + + + = − +1

( )µρ

∂∂

∂∂

∂∂θ

∂∂θ

∂∂θ

θ θ θ

r r rrv

rv

rv v

z1 1 2

2

2

2 2

2

2+ + +

2.10b

Para la dirección z

∂∂

∂∂

∂∂θ

∂∂

∂∂ ρ

∂∂

θvt

vvr

vr

vv

vz

ghz

pz

zr

z zz

z+ + + = − +1

µρ

∂∂

∂∂

∂∂θ

∂∂

1 1 2

2

2

2r rr

vr r

v vz

zz

z z

+ +

2.10c

Todas estas ecuaciones son diferenciales parciales no lineales, que en muchos de los casos es imposible obtener soluciones generales; por ello es que en algunos problemas de ingeniería es necesario efectuar simplificaciones razonables que dan soluciones aproximadas con fines de diseño, como se verá en incisos posteriores; sin embargo, para otros problemas de flujo se pueden generar soluciones exactas, como es el caso de flujo entre placas paralelas y tuberías de diámetro constante y flujos permanentes y plenamente desarrollados.

III. RESOLUCION DE ECUACIONES NO LINEALES

III.1. PLANTEAMIENTO DEL PROBLEMA En hidráulica un problema frecuente es encontrar las raíces de ecuaciones algebraicas y trascendentales de la forma f(x) = 0 o x = g(x), donde f(x) es una función real de una variable x. Se le llaman raíces de la ecuación a los valores de x que hacen f(x) = 0 Ejemplo de estas ecuaciones son: a). Tirante normal (ecuación algebraica no lineal)

ohh S

nQRA =32

Donde: yn = Tirante normal, en m Ah = Área hidráulica, en m2 = (B+t yn) yn Pm = Perímetro mojado, en m = 212 tyBP nm −+= Rh = Radio hidráulico, en m = Ah/Pm Q = Gasto medio, en m3/s B = Ancho de plantilla, en m t = Talud del canal, adimensional n = Coeficiente de rugosidad de Manning So = Pendiente longitudinal del canal.

b). Longitud de la onda en aguas intermedias (ecuación trascendental), en la teoría lineal de la ola progresiva (pequeña amplitud)

=

LdgTL π

π2tanh

2

2

Donde: L = Longitud de la ola, distancia horizontal medida entre dos crestas o valles consecutivos, en metros T = Periodo de la ola, tiempo que tarda en pasas por un punto fijo dos crestas o dos valles consecutivos, en segundos g = Aceleración local de la gravedad = 9.81 m/s π = 3.1416 d = Profundidad del cuerpo de agua, en metros.

c). Factor de fricción para tubos comerciales, en la región entre tubos lisos y la zona de turbulencia completa, desarrollada por Colebrook y que es la base para el diagrama de Moody.

+−=

fRD

f523.2

7.3ln869.01 ε

Donde: f = Coeficiente de fricción

ε = Rugosidad relativa del tubo D = Diámetro de la tubería, en m R = Numero de Reynolds

III.2. METODOS DE SOLUCION

III.2.1. Método del punto fijo. a. Introducción Resuelve la ecuación x=g(x), bajo determinadas condiciones para la función g, mediante el método iterativo que parte de un valor inicial p0 (aproximación a la solución) y que se define como pk+1 = g(pk). El teorema del punto fijo asegura que esta sucesión así definida converge hacia una solución de la ecuación y = g(x). En la práctica el proceso iterativo hay que detenerlo cuando el error absoluto o relativo correspondiente a dos iteraciones consecutivas es inferior a una cota prefijada (tolerancia). b. Algoritmo

Entrada: f_nombre = Nombre de la funcion que define la ecuacion p0 = Punto de partida, cercano a la solucion Salida: it = Número de iteraciones realizadas punto = Aproximación al punto fijo ErrorAbs = Diferencia entre dos valores consecutivos Puntos' = Sucesion de puntos {pn} Pasos computacionales: *condiciones iniciales; Sean tolerancia= 0.000001

it_ limite=500 (limite de iteraciones) Inicia la iteración declarando puntos(1) = p0. Para límite de iteraciones igual a 2 hasta el límite de iteraciones

*evaluación de funciones; Puntos(it) f(Puntos(it-1))

Por lo que el: error absoluto = valor absoluto de (Puntos(it)) menos(Puntos(it-1)); error relativo = error absoluto entre el valor absoluto de Puntos(it) más épsilon. Punto = Puntos(it). Sí. El error absoluto es menor que la tolerancia ó el error

relativo es menor que la tolerancia en tonces Termina, Finaliza Finaliza Sí la iteración es identica a el límite de iteraciones, entonces Indica que

se’excedió el número máximo de iteraciones’ y Termina Denota que Puntos=Puntos';

c. Código en Matlab

%Metodo del punto fijo %Objetivo: Resuelve ecuaciones no lineales del tipo x=g(x) %Sintaxis: %function [it,punto,ErrorAbs,Puntos] = puntofijo(f_nombre,p0) %function [punto] = puntofijo(f_nombre,p0) %Entrada: % - f_nombre = Nombre de la funcion que define la ecuacion a % resolver introducida como una cadena de caracteres 'g1'. % - p0 = Punto de partida, cercano a la solucion % Salida: % - it = Número de iteraciones realizadas % - punto = Aproximación al punto fijo % - ErrorAbs = Diferencia entre dos valores consecutivos % - Puntos' = Sucesion de puntos {pn} %Parametros de control Tolerancia=0.000001; %Tolerancia it_limite=5000; %Número máximo de iteraciones %Inicia Iteración Puntos(1)= p0; for it=2:it_limite Puntos(it)=feval(f_nombre,Puntos(it-1)); ErrorAbs=abs(Puntos(it)-Puntos(it-1)); ErrorRel=ErrorAbs/(abs(Puntos(it))+eps); punto=Puntos(it); if (ErrorAbs<Tolerancia) | (ErrorRel<Tolerancia),break;end end if it == it_limite disp('Excedido el número máximo de iteraciones') end Puntos=Puntos';

III.2.2. Método de bisección de Bolzano a. Introducción El método de bisección es el más sencillo posible. Dada una función f real y continua en el intervalo compacto I0 = [a; b] y que toma valores de signos contrario en a y b, esto es f(a) f(b) < 0, el teorema de Bolzano asegura que f se anula en algún punto interior de I0.

El método de bisección calcula f(c) donde c = (a+b)/2 es el punto medio del intervalo. Si f (c) = 0, hemos acabado, pero si no es así tiene el mismo signo que f(a) o f(b), es decir, en uno de los dos intervalos [a; c] o [c; b] la función toma valores de signo contrario en los extremos y por lo tanto contiene una raíz. Llamando ahora I1 a dicho intervalo estamos en la situación anterior pero con I1 en lugar de I0, la ventaja es que la longitud de I1 es la mitad de la I0. Repetimos el procedimiento de evaluar f en el punto intermedio de I1 y quedarnos con la mitad I2 donde haya un cambio de signo en los valores de los extremos. Continuando este proceso obtenemos una sucesión de intervalos encajados In de longitud (b-a)/ 2n que contienen una raíz de f. Teorema 1 [Teorema de Bolzano] Si f es una función continua en el intervalo cerrado [a, b] y f (a) · f (b) < 0, existe un punto � ε (a, b) en el cual f (�) = 0. b. Algoritmo Se quiere resolver la ecuación f (x) = 0.

Entrada: X a, X c, f unción. Salida: Yb (solución aproximada o mensaje de fracaso) Pasos computacionales: *condiciones iniciales; Sean tolerancia= 0.0000001

it_ limite=300 (limite de iteraciones) it = 0.

*evaluación de funciones; Ya f(Xa) Yc f(Xc) Sí (Ya*Yc > 0), comprueba si Xb es una mejor aproximación de la raíz

que Xa. Termina. Indica que : ‘ f(a) f(c) < 0, Cambia a o b y ejecuta otra vez’

. Sí no continúa aplicando criterio de convergencia. Mientras se incrementa la iteración it = it + 1. Aplica el método de bisección para encontrar el punto medio.

Xb = (Xa-Xc) / 2 Evalúa:

Yb f (Xb)

Criterios de parada, detenemos la iteración si sucede al menos alguna de éstas posibilidades: Si (abs(Xc-Xa)) <= tolerancia, ‘tolerancia satisfecha’. Termina.

Sí (it>it_limite), indica ‘se excedió el límite de iteraciones’. Termina. Sí (Ya*Yb<=0) Xc = Xb y Yc = Yb Sí no Xa = Xb y Ya = Yb Termina.

c. Código en Matlab

% METODO DE BISECCION. % bisección(función, a,c) % Datos % - función : Definicion de la ecuación a resolver. % - Xa, Xc : Extremos del intervalo inicial. % Salida % - tolerancia : Tolerancia. % - it_limite : Limite del numero de iteraciones. % - Ya, Yc : Valores "y" de los extremos actuales. function [Xb] = biseccion(funcion,Xa,Xc) tolerancia = 0.0000001; it_limite = 300; it = 0; %Evaluar las funciones Ya = feval(funcion, Xa ); Yc = feval(funcion, Xc ); if ( Ya*Yc > 0 ) %Checa que f(a)f(c) < 0, funcion cambia de signo en el intervalo

fprintf( '\n Detenido porque f(a)f(c) > 0 \n' ); fprintf( '\n Cambiar a o b y ejecutar otra vez.\n' ); break; else while 1 it = it + 1; %Se determina la aproximacion a la raiz y evalua la funcion Xb = (Xa + Xc)/2; Yb = feval(funcion, Xb );

%Checa que no se exceda la tolerancia if ( abs(Xc-Xa)<=tolerancia ) fprintf( ' Tolerancia satisfecha. \n' );break end

%Checa que no se excedan las iteraciones if ( it>it_limite ) fprintf( ' Excedido el limite de iteraciones.\n' ); break end %Se redefinen los valores if( Ya*Yb <= 0 ) Xc = Xb; Yc = Yb; else Xa = Xb; Ya = Yb; end end end

III.2.3. Método de la regla falsa o de la falsa posición a. Introducción En el método de la falsa posición se presenta una alternativa basada en una visualización gráfica que consiste en unir f (X1) y f (Xn) con una línea recta. La intersección de ésta línea con el eje de las X representa una mejor estimación de la raíz. El hecho de que se reemplace una línea curva por una línea recta da una “posición falsa” de la raíz; de aquí el nombre del método de la falsa posición, o en latín, regula falsi. También se le conoce como el método de la interpolación lineal. Usando triángulos semejantes, la intersección de la línea recta con el eje de las x puede ser estimado como:

f (Xl) f (Xu) ---------- = -----------

Xr – Xl Xr - Xu El cual puede resolverse por;

f (Xu) (Xl – Xu) Xr = Xu -- --------------------

f (Xl) -- f (Xu) El valor de Xl , calculado con la ecuación anterior reemplaza uno de los dos valores iniciales Xl o Xu, que produzca un valor de la función. b. Algoritmo

Entrada: a, c, f unción. Salida: c, err, yc = f(c). Pasos: *condiciones iniciales; Sean delta = tolerancia para el cero = 0.0000001

epsilón = tolerancia para la función = 0.0000001 max1 = numero máximo de iteraciones =300

*evaluación de funciones; Ya f(Xa) Yb f(Xb)

Sí (Ya*Yb > 0), comprueba si Xb es una mejor aproximación de la raíz que Xa.

Indicar que : ‘ f(a)*f(b) > 0’ , Termina. Para k =1 hasta max1 Aplica el método de falsa posición. Calculando dx = yb * (b-a) / (yb-ya); Calculando c = b - dx; Calculando ac = c – a; Evalúa: yc f (c) Sí yc ==0, Termina Sí no itera Sí yb*yc>0, Entonces b = c; yb = yc; Sí no a = c; ya = yc; Termina

Calcula el valor mínimo de dx; dx =min(abs(dx),ac);

Criterios de parada, detenemos la iteración si sucede al menos alguna de éstas posibilidades: Si (abs(dx)) <delta, ‘Termina. Si (abs(yc)) <epsilon, ‘Termina. Finaliza. Damos salida al valor de c calculado, Damos salida al cálculo de el error err = abs (b – a) / 2; Evalúamos: yc f (c).

c. Código en Matlab

function [c]=regula(funcion,a,b) % Datos % - f es la función, introducida como una cadena de caracteres 'f' % - a y b son el extremo izquierdo y el extremo derecho % - delta es la tolerancia para el cero % - epsilón es la tolerancia para el valor de f en el cero % - max1 es el numero máximo de iteraciones

% Resultados % - c es el cero % - yc=f(c) % - err es el error estimado de la aproximación a c delta = 0.0000001; epsilon =0.0000001; max1=300; ya=feval(funcion,a); yb=feval(funcion,b); if ya*yb>0 disp('Nota: f(a)*f(b) >0'), break, end for k=1:max1 dx=yb*(b-a)/(yb-ya); c=b-dx; ac=c-a; yc=feval(funcion,c); if yc==0,break; elseif yb*yc>0 b=c; yb=yc; else a=c; ya=yc; end dx=min(abs(dx),ac); if abs(dx)<delta,break,end if abs(yc)<epsilon, break,end end c; err=abs(b-a)/2; yc=feval(funcion,c);

III.2.4. Método de Newton-Raphson a. Introducción Este método consiste en un procedimiento iterativo para calcular valores aproximados de una raiz o un cero de la ecuación f (x) = 0, partiendo de un punto conocido y cercano a la raíz buscada. Sea r una raiz de f (x) = 0 situada en el intervalo (a, b) y supóngase que f ’(x) existe en (a, b). La recta tangente a la curva en el punto P(a, f(a)) de abscisa a (valor que se toma como la aproximación inicial de r) viene dada por:

y – f(a) = f’(a)(x-a) (punto – pendiente)

Para determinar el punto de intersección de esta recta con el eje x, que se llamará a1 y que se considera como la siguiente aproximación de r, se hace y = 0 en (1), de lo cual se obtiene: f(a) a1 = a - ----------- ; f’’(a)≠ o f’’(a) En muchas ocasiones a1es una aproximación a r mejor que a; en tales casos se repite de nuevo el procedimiento reemplazando el punto a por a1. La recta tangente a la curva en el punto P1(a1, f(a1)) y de pendiente f’(a1) viene dada por: y – f(a1) = f’’(a1)(x-a1) El intercepto de esta recta con el eje x, que se llamará a2 y que se considera la siguiente aproximación de r, se obtiene al hacer y = 0 en la ecuación (2), y asi se obtiene: f(a1) a2 = a1 - ----------- ; f’(a1)≠ o f’’(a1) El procedimiento se continúa de esta manera utilizando la siguiente fórmula de recurrencia: f(an) an+1 = an - ----------- ; f’(an)≠ o f’’(an) Son muchos los casos en los cuales la fórmula anterior proporciona una sucesión de valores an

, que progresivamente se van acercando a la raíz exacta. Resuelve la ecuación f(x)=0, bajo determinadas condiciones exigidas a f, mediante la iteración

( )( )1

11 ' −

−− −=

k

kkk xf

xfpp para un valor inicial dado de p0 lo suficientemente próximo a una

solución. b. Algoritmo

Entrada: X 0 (aproximación inicial), f unción. Salida: Xb

Pasos:

*condiciones iniciales; Sean X = Xo (punto inicial) Xb = X – 999,

del_X = 0.01 n = 0.

Mientras el valor absoluto de (x-xb) sea mayor que 0.00001 n=n+1; Xb = X

Sí el valor de n es mayor que 300, Termina, Finaliza *evaluación de funciones; Y f(x) por lo que

y_driv = f(x+del_x) – y / del_x ; x = Xb – y / y_driv;

Termina. c. Código en Matlab

%Newt_n(f_name, x0) Encuentra una ruta de una función mediante Iteración %de Newton % f_name: es el nombre de la función que define la ecuación a resolver. % x0: aproximación inicial. function x = Newton(función, x0) x = x0; xb=x-999; n=0; del_x = 0.01; while abs(x-xb) > 0.000001 n=n+1; xb=x; if n > 300 break; end y=feval(funcion, x); y_driv=(feval(funcion, x+del_x) - y)/del_x; x = xb - y/y_driv; end

III.2.5. Método de la Secante a. Introducción En el método de la secante en lugar de obtener una sucesión de intervalos, se calcula una sucesión de números que aproximan el cero de la función. Partiendo de dos aproximaciones x0; x1 a la raíz que buscamos ∝, se construye la recta secante que pasa por los puntos (x0; f(x0)); (x1; f(x1)) y calcula su corte con el eje OX que se

le llama x2 y se calcula f(x2). Después el proceso se repite con x1 y x2 para calcular x3 y sucesivamente x4; x5. La expresión que generaliza el método de la secante es la siguiente:

f(xn)(xn - xn-1) xn+1 = xn - ------------------ ; n = 1, 2,…. f(xn) - f(xn-1)

La aplicación sucesiva de la iteración anterior no es siempre posible, puede ocurrir que algún punto xn no estuviera en el dominio de f o que el denominador sea casi cero, en cuyo caso la secante es horizontal y, salvo que xn fuese ya un cero de f, no corta al eje de las abscisas.

)()())((

1

11

−+ −

−−=

kk

kkkkk pfpf

pppfpp

b. Algoritmo

Se pretende obtener la raíz de la ecuación f (x) = 0 dados los valores de po y p1, próximos a la raíz. El algoritmo construye una sucesión de aproximaciones p0, p1, p2….. pn..

Entrada: po, p1, f unción. Salida: y (función evaluada en p1), p1 (valor de la aproximación a cero calculado por el método de la

secante), err, k. Pasos:

*condiciones iniciales; Sean delta = tolerancia para p1 = 0.00001 epsilón =tolerancia para los valores de la

función= =0.0000001 max1 = numero máximo de iteraciones =300

Para k =1 hasta max1 (300)

Aplica el método de la secante.

*evaluación de funciones; para p2 f(p1) para p2 f(p0)

aplicar estas evaluación en la siguiente fórmula;

p1- f(p1) * ( p1- p0) Calculando la aproximación p2 = ------------------------- f(p1)- f(p0)

Calculando el error err = abs(p2 - p1)

Evaluando el error en función de la tolerancia y de p2;

relerr = 2*err / abs(p2) + delta); Entonces declaramos que:

p0 = p1 y

p1 = p2;

por lo tanto Evalúa: y f (p1)

Sí el error es menor que la tolerancia para p1 ó sí el error en función de la tolerancia p2 es menor que la tolerancia para p1 ó sí el valor absoluto de y es menor que la tolerancia para los valores de la función, Entonces , Termina

Finaliza. c. Código en Matlab

function [p1]=secante(función, p0, p1) %Datos % - f es la función, introducida como una cadena de caracteres 'f' % - p0 y p1 son las aproximaciones iniciales a un cero de la función % - delta es la tolerancia para p1 % - epsilon es la tolerancia para los valores de la función % - max1 es el numero máximo de iteraciones % Resultados % - p1 es la aproximación al cero, % obtenida con el método de la secante % - err es una estimación del error de p1 % - k es el numero de iteraciones realizadas % - y es el valor de la función f(p1) delta = 0.00001; epsilon = 0.0000001; max1 = 300; for k=1:max1 p2=p1-feval(funcion,p1)*(p1-p0)/(feval(funcion,p1)-feval(funcion,p0)); err=abs(p2-p1); relerr=2*err/(abs(p2)+delta); p0=p1; p1=p2; y=feval(funcion,p1); if (err<delta)|(relerr<delta)|(abs(y)<epsilon),break,end end

III.2.6. Función fzero(f_nombre,p0) de Matlab. a. Introducción

MATLAB dispone de funciones que minimizan y calculan raíces de funciones no lineales de una y varias variables, funciones que calculan integrales de funciones de

una y dos variables y, funciones que resuelven sistemas de ecuaciones diferenciales ordinarias de primer orden con condiciones iniciales. Una de ésta funciones que optimiza y calcula raíces de funciones es la función fzero la cual encuentra raíces de una función de una variable.

IV. RESOLUCION DE SISTEMAS DE ECUACIONES

IV.1. PLANTEAMIENTO DEL PROBLEMA La necesidad de resolver un sistema de ecuaciones lineales simultáneas es algo común en los problemas de ingeniería, por ejemplo: a). Problema de los tres depósitos

El problema de los tres depósitos, es un caso particular de las tuberías interconectadas y consiste en determinar las condiciones hidrodinámicas del escurrimiento (velocidades y gastos) en los conductos que interconectan los depósitos, con niveles de agua en cotas conocidas y permanentes en el tiempo.

La solución consiste en resolver el siguiente sistema de ecuaciones: En la primera ecuación asumimos que el flujo sale del depósito 1, a la unión (punto2), continuando al depósito más bajo (punto 4)

44

44

2424

24

242412

12

12

12121

11

1

2222V

gVZPV

gV

DLfV

gV

DLfV

gVZP

++=−−++γγ

Si la presión es la atmosférica P = 0 y si se considera que el nivel del agua en los depósitos es constante, V1 y V4 =0

( ) 022 1424

24

24

242412

12

12

1212 =−++ ZZV

gV

DL

fVg

VDL

f

En la segunda ecuación asumidos que el flujo sale del deposito 1 hacia la unión (punto2), hasta el deposito 3

33

33

2323

23

232312

12

12

12121

11

1

2222V

gV

ZP

Vg

VDL

fVg

VDLfV

gVZP

++=−−++γγ

( ) 022 1323

23

23

232312

12

12

1212 =−++ ZZV

gV

DL

fVg

VDL

f

La tercera ecuación de obtiene al aplicar el principio de continuidad en el nudo

0)( 242423231212 =−+ VAVAVA

Donde: V = Velocidad media del flujo, en m/s

A = Área de la tubería = 4

2Dπ

f = Coeficiente de fricción, adimensional L = Longitud de la tubería, en metros D = Diámetro de la tubería, en metros g = Aceleración de la gravedad = 9.81 m/s2 Z = Cota de la superficie libre del agua, en metros

IV.2. METODOS DE SOLUCION Existen varios métodos para resolver un sistema de ecuaciones

IV.2.1. Soluciones empleando operaciones con matrices: Un sistema de ecuaciones puede escribirse de la forma

A X = B 1.1. División de matrices

a. Introducción

Este método comprende el cálculo de la solución de un sistema lineal AX = B mediante la reducción a forma triangular superior de la matriz ampliada [A|B] seguida de la sustitución regresiva.

X= A \ BT ó X=B/AT b. Algoritmo

Entrada: A, B. Salida: X (matriz solución de AX = B).

Pasos computacionales:

*condiciones iniciales; Sean [N, N] = tamaño(A)

X = matriz nula (N,1); Y = matriz nula (N,1);

C = matriz nula (1,N+1); almacen temporal

Calculamos la matriz ampliada denominada Aug = [A|B] Para q = 1 hasta N -1

Determina la fila pivote parcial para la columna q-ésima

[Y,j]=valor máximo absoluto de (Aug(p hasta N,p));

Intercambio de filas q-ésima y j+p-1 ésima. C=la columna q de Aug; La columna q de Aug = la columna j+p-1, de Aug; La columna j+p-1, de Aug = C;

Sí Aug(q,q) es una igualdad con cero, entonces imprime que A es singular, que no hay

solución o que no es única, y por tanto termina el ciclo, Termina.

Proceso de eliminación en la columna q-ésima. Para k = p+1 hasta N m = Aug(k,q) / Aug(q,q); Aug(k, q hasta N+1) = Aug(k, q hasta N+1) – m * Aug(desde q,q hasta N+1); Termina el ciclo Termina.

Calcula la Sustitución regresiva en la matriz [U|Y] usando el programa anterior. X llama al programa backsub.m

X=backsub(Aug(1 de N,1 hasta N), Aug(1 de N,N+1)); c. Código en Matlab

%METODO DE TRIANGULACION SUPERIOR SEGUIDA DE SUSTITUCION REGRESIVA function X = uptrbk(A,B) %Datos % - A es una matriz invertible de orden N x N % - B es una matriz de N x N %Resultados % - X es una matriz de orden N x 1 que contiene al solucion de AX=B. %Inicializamos X y una matriz C que sirve de almacen temporal [N N]=size(A); X=zeros(N,1); C=zeros(1,N+1); %Calculo de la matriz ampliada: Aug=[A|B] Aug=[A B];

for p=1:N-1 %Pivoteo parcial en la columna q-èsima [Y,j]=max(abs(Aug(p:N,p))); %Intercambio de las filas q-èsima y (j+q-1)-èsima C=Aug(p,:); Aug(p,:)=Aug(j+p-1,:); Aug(j+p-1,:)=C; if Aug(p,p)==0 'A es singular. No hay solucion o no es unica' break end %Proceso de eliminacion de la columna q-èsima for k=p+1:N m=Aug(k,p)/Aug(p,p); Aug(k,p:N+1)=Aug(k,p:N+1)-m*Aug(p,p:N+1); end end % Sustitucion Regrsiva en [U|Y] usando el programa 3.1 X=backsub(Aug(1:N,1:N),Aug(1:N,N+1));

1.2. Inversión de matrices

a. Introducción Este método comprende el cálculo de la solución de un sistema lineal AX = B cuando la matriz A es invertible.

X = A-1 B ó X = B A-1

b. Algoritmo

Entrada: A, B. Salida: X (matriz solución de AX = B).

Pasos computacionales:

*condiciones iniciales; Sean [N, N] = tamaño(A)

X = matriz nula (N,1); Y = matriz nula (N,1);

C = matriz nula (1,N); R = 1 hasta N;

Para p = 1 hasta N -1

Determina la fila pivote para la columna q-ésima [max1,j]=max(abs(A(p:N,p)));

Intercambio de filas q-ésima y j-ésima. C=la columna p de A; La columna p de A = la columna j+p-1, de A; La columna j+p-1, de A = C;

d=R(p); R(p)=R(j+p-1); R(j+p-1)=d;

Sí A(p,p) es una igualdad con cero, entonces imprime que A es singular, que no hay solución o que no es única, y por tanto termina el ciclo,

Termina.

Calcula el multiplicador que se guarda en la parte subdiagonal de A. Para k = p+1 hasta N

Mult = A(k,p) / A(p,p); A(k,p) = mult A(k,p+1 hasta N) = A(k,p+1 hasta N) – mult * A(p, p+1 hasta N);

Termina el ciclo Termina.

Resolución para hallar Y Y(1) = B(R(1)); Para k=2 hasta N Y(k)= B(R(k))-A(k,1 hasta k-1) * Y(1 hasta k-1); Termina.

Resolución para hallar X X(N)=Y(N)/A(N,N); para k=N-1 de -1 hasta 1 X(k)=(Y(k)-A(k,k+1 hasta N)*X(k+1 hasta N))/A(k,k); Termina.

c. Código en Matlab

%FACTORIZACION CON PIVOTEO.

function X = lufact(A,B)

%Datos % - A es una matriz de orden N X N % - B es una mtriz de orden N x 1 %Resultado % - X es una matriz de orden N x 1 de AX = B.

%Inicializamos X, Y la matriz de almacenamiento temporal C y %la matriz fila R donde se registran los intercambios de filas

[N,N]=size(A); X=zeros(N,1); Y=zeros(N,1); C=zeros(1,N); R=1:N;

for p=1:N-1

%Determinación de la fila pivote para la columna q-ésima [max1,j]=max(abs(A(p:N,p)));

%Intercambio de filas q-ésima y j-ésima C=A(p,:); A(p,:)=A(j+p-1,:); A(j+p-1,:)=C; d=R(p); R(p)=R(j+p-1); R(j+p-1)=d; if A(p,p)==0 'A es singular, no hay solucion o no es unica' break end %Calculo del multiplicador que se guarda en la parte subdiagonal de A' for k=p+1:N mult=A(k,p)/A(p,p); A(k,p) = mult; A(k,p+1:N)=A(k,p+1:N)-mult*A(p,p+1:N); end end %Resolucion para hallar Y Y(1) = B(R(1)); for k=2:N Y(k)= B(R(k))-A(k,1:k-1)*Y(1:k-1); end %Resolucion para hallar X X(N)=Y(N)/A(N,N); for k=N-1:-1:1 X(k)=(Y(k)-A(k,k+1:N)*X(k+1:N))/A(k,k); end

IV.2.2. Método de Seidel a. Introducción El método de Seidel para la solución de sistemas de ecuaciones, es una generalización de la iteración del punto fijo para ecuaciones no lineales.

b. Algoritmo

Entrada: A, B, P, delta, max1. Salida: X (matriz solución de AX = B).

Pasos computacionales:

*condición inicial; Sea N = longitud (B);

Para k=1 hasta max1 Para j = 1 hasta N

Si j es una igualdad a 1 X(1) = (B(1)-A(1,2 hasta N) * P(2 hasta N)) / A(1,1);

Sí no j es una igualdad a N X(N) = (B(N)-A(N,1 hasta N-1) * (X(1 hasta N-1))') /

A(N,N); Sí

X(j) = (B(j)-A(j,1 hasta j-1)*X(1 hasta j-1)' - A(j,j+1 hasta N)*P(j+1 hasta N))/A(j,j);

Termina. Termina. Err = valor absolute de (norm(X'-P)); Relerr = err/(norm(X)+eps); P=X';

Sí (err<delta)o (relerr<delta) Termina el ciclo;

Termina. Termina.

Declara que X = X'; c. Código en Matlab

% METODO ITERATIVO GAUSS SEIDEL function X=gseid(A,B,P,delta, max1) % Datos: % - A es una matriz invertida de orden N x N % - B es una matriz de orden N x 1 % - P es una matriz de orden N x 1: el punto inicial % - delta es la tolerancia para P % - max1 es el numero máximo de iteraciones % Resultados: % - X es una matriz de orden N x 1: la aproximación a la % solución de AX = B % generada por el método iterativo de Gauss Seidel

N = length(B); for k=1:max1 for j=1:N if j==1 X(1)=(B(1)-A(1,2:N)*P(2:N))/A(1,1); elseif j==N X(N)=(B(N)-A(N,1:N-1)*(X(1:N-1))')/A(N,N); else %X contiene la aproximacion K- esima y P the (k-1)èsima X(j)=(B(j)-A(j,1:j-1)*X(1:j-1)'-A(j,j+1:N)*P(j+1:N))/A(j,j); end end err=abs(norm(X'-P)); relerr=err/(norm(X)+eps); P=X'; if (err<delta)|(relerr<delta) break end end X=X';

IV.2.3. Método de Newton-Raphson. a. Introducción El método de Newton-Raphson para la solución se sistema de ecuaciones es una generalización del mismo método para ecuaciones simples. b. Algoritmo

Entrada: Input -F es la función salvada en el M-file como F.m

JF is the Jacobian of F saved as the M-file JF.M P es la aproximación inicial a la solución delta es la tolerancia para P epsilón es la tolerancia para F(P) max1 es el número máximo de iteraciones.

Salida: P es la aproximación a la solución

iter es el número de iteraciones requerido err es el error estimado para P.

Pasos: *evaluación de funciones; Y f(P)

Para k=1 hasta el número máximo de iteraciones J Jf(P)

Por lo que Q=P-(J\Y')'; Z f(Q); Por lo que el error=normal de (Q-P); Y relerr=err/(normal(Q)+eps); P=Q; Y=Z; iter=k;

Sí el error es menor que delta ó el error relativo es menor que delta ó el valor absoluto de Y es menor que epsilón, entonces finaliza

termina Termina.

c. Código en Matlab

function [P,iter,err]=raphson(F,JF,P,delta,epsilon,max1) %Input -F es la función salvada en el M-file como F.m % -JF is the Jacobian of F saved as the M-file JF.M % -P es la aproximación inicial a la solución % -delta es la tolerancia para P % -epsilón es la tolerancia para F(P) % -max1 es el número máximo de iteraciones. %Output- P es la aproximación a la solución % - iter es el número de iteraciones requerido % - err es el error estimado para P. Y=feval(F,P); for k=1:max1 J=feval(JF,P); Q=P-(J\Y')'; Z=feval(F,Q); err=norm(Q-P); relerr=err/(norm(Q)+eps); P=Q; Y=Z; iter=k; if (err<delta)|(relerr<delta)|(abs(Y)<epsilon) break end end

V. INTERPOLACIÓN Y APROXIMACIÓN POLINOMIAL

V.1. PLANTEAMIENTO DEL PROBLEMA 1. Curva elevación-áreas-capacidades de la Presa Becerra. Embalse Curva de elevación-áreas-capacidades

Elevación (m) Área (m2) Capacidad (m3) 2318 0.02319 2,000.02320 5,000.02321 18,000.02322 29,000.02323 47,000.02324 70,000.02325 100,000.02326 126,000.02327 184,000.02328 222,000.0

2329 250,000.0

V.2. METODOS DE SOLUCION Cuando se tiene un conjunto de datos que han sido obtenidos de un experimento o por observación de un fenómeno físico. Estos datos generalmente pueden considerarse como coordenadas de puntos de una función f(x). Existen diferentes métodos para encontrar un polinomio interpolador que ajuste de la mejor forma posible un conjunto de puntos. V.2.1. Polinomio interpolador de Lagrange a. Introducción El polinomio integrador de Lagrange que pasa por los N+1 puntos (Xk,Yk), para k=0,1, ....., N, se expresa como:

( ) ( )∑=

=N

kkNk xLyxP

0,

donde:

( )

( )

( )∏

≠=

≠=

= N

kjj

jk

N

kjj

j

kN

xx

xx

xL

0

0

,

b. Algoritmo

Entrada: X, Y. Salida: C (matriz solución), L (matriz de coeficientes).

Pasos computacionales:

*condiciones iniciales; Sean w = longitud de (X); n = w-1; L = matriz nula (w,w);

Para k=1 hasta n+1 V =1;

Para j = 1 hasta n+1 Si k es igual o semejante a j

V = obtención de coeficientes de los polinomios (V,poly(X(j)))/(X(k)-X(j));

Termina. Termina.

La columna k de L = V; Termina. Cálcula los coeficientes de polinomio interpolador

C=Y*L; c. Código en Matlab

% METODO DEL POLINOMIO INTERPOLADOR DE LA GRANGE function [C,L]=lagran(X,Y) % Datos % - X es el vector que contiene la lista de las abcisas % - Y es un vector que contiene la lista de las ordenadas % Resultados % - C es la matriz que contiene los coeficientes del % polinomio interpolaodor de Lagrange % - L es la matriz que contiene los coeficientes de los polinomios % coeficientes de Lagrange w=length(X); n=w-1;

L=zeros(w,w); % Formación de los polinomios coeficientes de Lagrange for k=1:n+1 V=1; for j=1:n+1 if k~=j V=conv(V,poly(X(j)))/(X(k)-X(j)); end end L(k,:)=V; end % Cálculo de los coeficientes del polinomio % interpolador de La grange C=Y*L;

V.2.4. Polinomio de interpolación de Newton a. Introducción Este método comprende que a partir de la construcción de un polinomio interpolador de Newton de grado menor o igual que N que pasa por los puntos (Xk, Yk) = (Xk, f(Xk) para k = 0, 1, …,N.

P(x) = d 0,0 + d 1,1 (x-x0) + d 2,2 (x-x0) (x-x1) + … + d N,N (x-x0) (x-x1) … (x-xN-1) ,

Siendo

d k,j -1 - d k-1,j-1 d k,0 = yk y d k,j = ------------------

X k - X k-j b. Algoritmo

Entrada: X, Y. Salida: C (vector de coeficientes), D (tabla de diferencias divididas).

Pasos computacionales:

*condiciones iniciales; Sean n = longitud de (X); D = matriz nula (n,n); La fila 1 de la matriz D = Y';

Para j = 2 hasta n

Para k=j hasta n D(k,j) = (D(k,j-1) - D(k-1,j-1)) / (X(k) - X(k-j+1));

Termina. Termina.

C = D(n,n); Para k = (n-1) de -1 hasta 1

C = obtención de coeficientes de los polinomios (C,poly(X(k))); m = longitud de (C); C(m) = C(m) + D(k,k);

Termina. c. Código en Matlab

% METODO DEL POLINOMIO INTERPOLADOR DE NEWTON. function [C,D]=newpoly(X,Y) %Datos % - X es un vector con la lista de las abcisas % - Y es un vector con la lista de las ordenadas %Resultados % - C es un vector que contiene los coeficientes % del polinomio interpolador de newton. escrito de % forma habitual, en potencias decrecientes de x % - D es la tabla de diferencias divididas n=length(X); D=zeros(n,n); D(:,1)=Y'; %Usamos la formula (20) para hallar % la tabla de diferencias divididas for j=2:n for k=j:n D(k,j)=(D(k,j-1)-D(k-1,j-1))/(X(k)-X(k-j+1)); end end %Determine los coeficientes del polinomio interpolador de Newton C=D(n,n);

for k=(n-1):-1:1 C=conv(C,poly(X(k))); m=length(C); C(m)=C(m)+D(k,k);

end

V.2.5. Polinomio de Chebyshev. a. Introducción Este método comprende que a partir de la construcción y determinación de un polinomio interpolador de Chevyshev de grado N en el intervalo [a,b] para los nodos b - a (2k+1)pi a + b

Xk = --------- cos ( -------------) + ------------ 2 2N + 2 2

El polinomio está dado por;

d k,j -1 - d k-1,j-1 P(x) = ∑N J=0 cJ T,j 2 ------------------

X k - X k-j

b. Algoritmo

Entrada: fun, n, a, b. Salida: C, X, Y.

Pasos computacionales:

*condiciones iniciales; dado que d = pi / (2*n+2); C = matriz nula (1,n+1);

Sí el numero de argumentos de entrada es una igualdad con 2, a = -1 y b=1

Termina. Para k = 1 hasta n+1

X(k) = cos((2*k-1)*d); Termina.

X = (b-a) * X/2+ (a+b) / 2; x = X; Y = la evaluación la función (fun);

Para k =1 hasta n+1 z=(2*k-1)*d;

Para j = 1 hasta n+1 C(j) = C(j)+Y(k) * cos((j-1)*z); Termina.

Termina Calcula los coeficientes. C = 2*C / (n+1); C(1) = C(1) / 2;

c. Código en Matlab

% METODO DE LA APROXIMACION DE CHEBYSHEV function [C,X,Y]=cheby(fun,n,a,b) %Datos % - fun es la funcion que deseamos aproximar, dada como una % cadena de caracteres % - n es el grado del polinomio de aproximación % - a es el extremo izquierdo % - b es el extremo derecho %Resultados % - C es la lista de coeficientes del polinomio % - X contiene las abcisas de los nodos % - Y contiene los valores de fun en los nodos if nargin==2, a=-1;b=1;end d=pi/(2*n+2); C=zeros(1,n+1); for k=1:n+1 X(k)=cos((2*k-1)*d); end X=(b-a)*X/2+(a+b)/2; x=X; Y=eval(fun); for k =1:n+1 z=(2*k-1)*d; for j=1:n+1 C(j)=C(j)+Y(k)*cos((j-1)*z); end end C=2*C/(n+1); C(1)=C(1)/2;

VI. AJUSTE DE CURVAS

VI.1. PLANTEAMIENTO DEL PROBLEMA Consiste en obtener una curva que represente el comportamiento general de los datos experimentales o medidos, se recomienda para datos sin un grado significativo de error o ruido. La curva resultante permite estimar razonablemente valores no obtenidos o medidos.

VI.2. METODOS DE SOLUCION

VI.2.1. Regresión lineal o recta de regresión en mínimos cuadrados a. Introducción Este método permite la construcción de la recta de regresión f(x) = y = Ax + B, que mejor se ajusta en el sentido de los mínimos cuadrados a las N datos (X1, Y1),…,(XN, YN). Donde:

2

11

2

111

−=

∑∑

∑∑∑

==

===

N

kk

N

kk

N

kk

N

kk

N

kkk

xxN

yxyxNA

2

11

2

1111

2

−=

∑∑

∑∑∑∑

==

====

N

kk

N

kk

N

kkk

N

kk

N

kk

N

kk

xxN

yxxyxB

b. Algoritmo Entrada: X, Y. Salida: A, B.

Pasos computacionales:

*condiciones iniciales; Sean xmean=mean(X); ymean=mean(Y);

La sumatoria de x2 = (X-xmean) * (X-xmean)'; La sumatoria de xy = (Y-ymean) * (X-xmean)'; A = La sumatoria de xy / La sumatoria de x2; B = ymean - A * xmean;

c. Código en Matlab

% METODO DE LA RECTA DE REGRESION. function [A,B]=lsline(X,Y)

%Datos % - X es el vector de abcisas 1 x n % - Y es el vector de ordenadas 1 x n %Resultados % - A es el coeficiente de x en Ax + B % - B es el termino independiente en Ax + B xmean=mean(X); ymean=mean(Y); sumx2=(X-xmean)*(X-xmean)'; sumxy=(Y-ymean)*(X-xmean)'; A=sumxy/sumx2; B=ymean-A*xmean;

d. Función [A,B]=polyfit(X,Y,1)

VI.2.2. Linealización de relaciones no lineales.

Función y=f(x) Linealización Y=AX+B Cambio de variable 1. Función

BxAy += B

xAy +=

1 yY

xX ==

1

2. Función

CxDy+

= CDxy

Cy +

−= )(1

ABD

ACyYxyX −

=−

=== ,1,,

3. Función

BAxy

+=

1 BAx

y+=

1

yYxX 1, ==

4. Modelo del promedio de crecimiento de saturacion

BAxxy+

= Bx

Ay

+=11

y

Yx

X 1,1==

5. Función BxAy += )ln( BxAy += )ln( yYxX == ),ln(

6. Modelo exponencial (grafica semilogaritmica) AxeCy = )ln()ln( CAxy += )ln(),ln(, CByYxX ===

7. Modelo potencial AxCy = )ln()ln()ln( CxAy += BeCyYxX === ),ln(),ln(

8. Función 2)( −+= BAxy BAxy +=− 2/1 2/1, −== yYxX

9. Función DxexCy −= )ln()ln( CDx

xy

+−= ADeCxyYxX B −==== ,),ln(,

10. Función

AxCeLy

+=

1 )ln()1ln( CAx

yL

+=− BeCyLYxX =−== ),1ln(,

VII. DERIVACION NUMERICA

VII.1. PLANTEAMIENTO DEL PROBLEMA

VII.2. METODOS DE SOLUCION

VII.2.1. Derivación numérica mediante limites. a. Introducción Este método consiste en construir las aproximaciones numéricas a f’(x) mediante la generación de la sucesión:

nkparah

xfxfDxf k

kk

k ,....,0,)10(2

)10()10()(' =−−+

=≈ −

−−

Donde las iteraciones continúan hasta que: 11 −+ −≥− nnnn DDDD O toleranciaDD nn <1−− b. Algoritmo c. Código en Matlab

function [L,n]=difflim(f,x,toler) %Datos % - f es la funcion, introducida como una cadena de caracteres 'f' % - x es el punto en el que se deriva % - toler es la tolerancia para el error %Resultados % - L=[H' D' E']: % -H es el vector de lso incrementos % -D es el vector de las aproximaciones a la derivada % -E es el vector de las cotas del error % -n es la coordenada de la "mejor aproximacion" max1=15; h=1;

H(1)=h; D(1)=(feval(f,x+h)-feval(f,x-h))/(2*h); E(1)=0; R(1)=0; for n=1:2 h=h/10; H(n+1)=h; D(n+1)=(feval(f,x+h)-feval(f,x-h))/(2*h); E(n+1)=abs(D(n+1)-D(n)); R(n+1)=2*E(n+1)*(abs(D(n+1))+abs(D(n))+eps); end n=2; while((E(n)>E(n+1))&(R(n)>toler))&n<max1 h=h/10; H(n+2)=h; D(n+2)=(feval(f,x+h)-feval(f,x-h))/(2*h); E(n+2)=abs(D(n+2)-D(n+1)); R(n+2)=2*E(n+2)*(abs(D(n+2))+abs(D(n+1))+eps); n=n+1; end n=length(D)-1; L=[H' D' E'];

VII.2.2. Derivación usando el método de extrapolación de Richardson a. Introducción Este método consiste en construir las aproximaciones numéricas a f’(x) mediante la construcción de la tabla D(j,k) con k<j en la que se obtienen como solución final la derivada f’(x)=D(n,n). Los valores D(j,k) forman una matriz triangular inferior cuya primera columna se define como:

h

hxfhxfjD j

jj

12)2()2()1,( +−

−− −−+=

Y cuya fila j-esima para j>2 tiene los siguientes elementos

jkparakjDkjDkjDkjD k ≤≤−

−−−−+−= 2,

14)1,1()1,()1,(),(

b. Algoritmo

c. Código en Matlab

function [D,err,relerr,n]=diffext(f,x,delta,toler) %Datos % - f es la funcion, introducida como una cadena de caracteres 'f' % - x es el punto en el que se deriva % - delta es la tolerancia para el error % - toler es la toleranci apara el error relativo %Resultados % - D es la matriz de las aproximaciones de la derivada % - err es la cota del error % - relerr es la cota del error relativo % - n es la coordenada de la "mejor aproximacion" err=1; relerr=1; h=1; j=1; D(1,1)=(feval(f,x+h)-feval(f,x-h))/(2*h); while relerr > toler & err > delta &j <12 h=h/2; D(j+1,1)=(feval(f,x+h)-feval(f,x-h))/(2*h); for k=1:j D(j+1,k+1)=D(j+1,k)+(D(j+1,k)-D(j,k))/((4^k)-1); end err=abs(D(j+1,j+1)-D(j,j)); relerr=2*err/(abs(D(j+1,j+1))+abs(D(j,j))+eps); j=j+1; end

VII2.3. Derivación numérica mediante interpolación en N-1 nodos a. Introducción Este método consiste en construir el polinomio interpolador de Newton de grado N: ))....()((.....))(()()( 110102010 −−−−++−−+−+= NN xxxxxxaxxxxaxxaaxP Y aproximar numéricamente a f’(x0) mediante P’(x0)

b. Algoritmo c. Código en Matlab

function [A,df]=diffnew(X,Y) %Datos % - X es un vector 1 x n que contiene las abcisas % - Y es un vector 1 x n que contiene las ordenadas %Resultados % - A es unj vector 1 x n que contiene los coeficientes del % polinomio de Newton de grado N % - df es la derivada aproximada A=Y; N=length(X); for j=2:N for k=N:-1:j A(k)=(A(k)-A(k-1))/(X(k)-X(k-j+1)); end end x0=X(1); df=A(2); prod=1; n1=length(A)-1; for k=2:n1 prod=prod*(x0-X(k)); df=df+prod*A(k+1); end

VIII. INTEGRACION NUMERICA

VIII.1. PLANTEAMIENTO DEL PROBLEMA Estimar el área de la sección transversal de un escurrimiento (A), es una actividad que se requiere realizar para varios tareas dentro de la ingeniería de recurso hidráulicos, incluso en el pronostico de avenidas y en el diseño de presas. A menos que los dispositivos sondeo electrónicos están disponibles obtener perfiles continuos del fondo del cauce, el ingeniero debe confiar de las dimensiones discretas de profundidad para calcular À. Un ejemplo de una sección transversal del arroyo típica se muestra debajo.

El datos representa lugares dónde un barco era anclado y dimensiones de profundidad tomados. Distancia 6.5 13.0 19.5 26.0 32.5 39.0 46.5 52.5 59.0 65.5 72.0 78.5 Profundidad 0.0 2.0 2.0 4.0 4.0 7 5.5 4 3.5 2.8 1.4 0.0

VIII.2. METODOS DE SOLUCION

VIII.2.1. Método del trapecio A. Regla compuesta del trapecio. a. Introducción Aproxima la integral definida de la función f(x) entre dos puntos a y b de la siguiente forma:

( ) ∑∫−

=

++≈1

1

)()()(2

)(M

kk

b

axfhbfafhdxxf

Calculándose f(x) en los puntos equidistantes xk=a+kh, para k=0,1,…..M con x0=a y xM=b

b. Algoritmo c. Código en Matlab

function s=traprl(f,a,b,M) %Datos % - f es el integrando, dado como una cadena de caracteres 'f' % - a y b son los extremos inferior y superior del intervalo % de integracion % - M es el numero de subintervalos %Resultado % - s es la aproximacion obtenida con la regla compuesta del % trapecio h=(b-a)/M; s=0; for k=1:(M-1) x=a+h*k; s=s+feval(f,x); end s=h*(feval(f,a)+feval(f,b))/2+h*s;

B. Regla recursiva del trapecio. a. Introducción Considera que los puntos xk=a+kh, para k=0,1,….M con x0=a y xM=b dividen el intervalo [a,b] en 2j=2M subintervalos del mismo tamaño h=(b-a)/2. En esta situación se consideran la siguientes formulas recursivas.

( ))()(2

)0( bfafhT +=

∑=

−+−

=M

kkxfhJTJT

112 )(

2)1()( , para J=1,2,……

Y la integral definida de la función f(x) entre los puntos a y b puede calcularse de la siguiente forma

( )∑∫=

−+=J

kkk

b

a

xfxfhdxxf2

11 )()(

2)(

Utilizando la recursion del trapecio según se aumenta el numero de subintervalos de [a,b] y tomando en la iteración J un conjunto de 2J+1 puntos equidistantes. b. Algoritmo c. Código en Matlab

function T=rctrap(f,a,b,n) %Datos % - f es el integrando, dado como una cadena de caracteres 'f' % - a y b son los extremos inferior y superior del intervalo % de integracion. % - n es el numero de veces que se hace la recursion %Resultado % - T es la lista de las proximaciones obtenidas con la regla recursiva % del trapecio M=1; h=b-a; T=zeros(1,n+1); T(1)=h*(feval(f,a)+feval(f,b))/2; for j=1:n M=2*M; h=h/2; s=0; for k=1:M/2 x=a+h*(2*k-1); s=s+feval(f,x); end T(j+1)=T(j)/2+h*s; end

VIII.2.2. Método de Simpson A. Regla simple de Simpson a. Introducción Aproxima la integral definida de la función f(x) entre los puntos a y b de la siguiente forma:

( )c

baccfbfafhdxxf +=++≈∫ )(4)()(

3)(

B. Regla compuesta de Simpson aproxima la integral definida de la función f(x) entre los

puntos a y b de la siguiente forma:

( )∫ ∑ ∑−

= =−+++≈

1

1 1122 )(

34)(

32)()(

3)(

M

k

M

kkk xfhxfhbfafhdxxf

Calculándose f(x) en los puntos equidistantes xk=a+kh para k=0,1,…2M con x0=a y x2M=b b. Algoritmo c. Código en Matlab

function s=simprl(f,a,b,M) %Datos % - f is the integrand input as a string 'f' % - a and b are upper and lower limits of integration % - M is the number of subintervals %Resultado % - s is the simpson rule sum h=(b-a)/(2*M); s1=0; s2=0; for k=1:M x=a+h*(2*k-1); s1=s1+feval(f,x); end for k=1:(M-1) x=a+h*2*k; s2=s2+feval(f,x); end s=h*(feval(f,a)+feval(f,b)+4*s1+2*s2)/3;

VIII.2.3. Método de Romberg

a. Introducción Este método permite la construcción de las aproximaciones R(J,K) (para J ≥ K) a la integral: b

∫ f(x)dx ≈ R (J, K) a dando R(J+1, J+1) como respuesta final. Las aproximaciones R(J,K) se guardan en una matriz triangular inferior R: los elementos R(J,0) están en la primera columna de R y son las aproximaciones obtenidas con la regla recursiva del trapecio con 2j-1 subintervalos de [a, b]; los restantes elementos R(J,K) (que se almacena en R(J,K+1) se calculan usando el método de Romberg de manera que los elementos de la fila J-ésima de R son R(J, K-1) - R(J-1, K-1)

R(J, K) = R(J, K-1) + -------------------------------------- , 4K-1 para 1 ≤ K ≤ J. El criterio de parada del programa es que se termina de iterar en la fila (J+1)-ésima cuando |R(J,J) – R(J+1, J+1)| < tol. b. Algoritmo c. Código en Matlab

function [R,quad,err,h]=romber(f,a,b,n,tol) %Datos % - f es el integrando dado como una cadena de caracteres 'f' % - a y b son los limites inferior y superior del intervalo de integracion % - n es el numero maximo de filas de la tabla % - tol es la tolerancia %Resultados % - R es el esquema de Romberg % - quad es la aproximacion a la integral % - err es el error estimado % - es el menor de los incrementos usados M=1; h=b-a; err=1; J=0; R=zeros(4,4); R(1,1)=h*(feval(f,a)+feval(f,b))/2; while((err>tol)&(J<n))|(J<4) J=J+1;

h=h/2; s=0; for p=1:M x=a+h*(2*p-1); s=s+feval(f,x); end R(J+1,1)=R(J,1)/2+h*s; M=2*M; for K=1:J R(J+1,K+1)=R(J+1,K)+(R(J+1,K)-R(J,K))/(4^K-1); end err=abs(R(J,J)-R(J+1,K+1)); end quad=R(J+1,J+1);

IX. ECUACIONES DIFERENCIALES ORDINARIAS

IX.1. PLANTEAMIENTO DEL PROBLEMA Ecuación del flujo gradualmente graduado.

−=

3

20

cosgA

TQSS

dxdy

αφ o 2

2

0

1

1

=

c

n

QQ

QQ

Sdxdy

Donde: Q = Descarga del flujo gradualmente variado para la profundidad actual y Qn = Descarga normal para una profundidad igual a y Qn = Descarga critica para una profundidad igual a y Para canales anchos rectangulares y usando la formula de Manning

30

1

13

10

=

yy

yy

Sdxdy

c

n

Para canales anchos rectangulares y usando la formula de Chezy

3

3

0

1

1

=

yy

yy

Sdxdy

c

n

Donde: y = yn = Tirante normal yc = Tirante critico

IX.2. METODOS DE SOLUCION

IX.2.1. Método de Euler a. Introducción Este método permite la construcción de las aproximaciones a la solución del problema inicial y’ = f(t,y) con y(a) = y0 en [a, b] dadas por

yk+1 = yk + hf (tk,yk) para k = 0, 1, … , M-1.

b. Algoritmo Entrada f,a,b,ya,M Salida E Pasos computacionales: Condiciones iniciales; Sean h=(b-a)/M;

T=Matriz nula(1,M+1); Y=matriz nula(1,M+1); T=a:h:b; Y(1)=ya;

Para j = 1 hasta M Y(j+1) = Y(j)+h*feval(f,T(j),Y(j)); Termina E=[T' Y'];

c. Código en Matlab

function E=euler2(funcion,a,b,ya,M) %Datos: % - funcion = Funcion almacenada como cadena de caracteres % 'funcion' % - a y b = Extremos derecho e izquierdo del intervalo % - ya = Condicion inicial y(a) % - M = Numero de pasos %Resultados: % - E = [T' Y'] siendo T el vector de las abcisas e % Y el vector de las ordenadas h=(b-a)/M; T=zeros(1,M+1); Y=zeros(1,M+1); T=a:h:b; Y(1)=ya; for j=1:M Y(j+1)=Y(j)+h*feval(funcion,T(j),Y(j)); end E=[T' Y'];

IX.2.2. Método de Heun a. Introducción

Este método permite calcular la construcción de las aproximaciones a la solución del problema inicial y’ = f(t,y) con y(a) = y0 en [a, b] dadas por h

yk+1 = yk + --- ( f (tk,yk) + f (tk+1,yk + f (tk,yk))) para k = 0, 1, … , M-1. 2 b. Algoritmo

Entrada f,a,b,ya,M Salida funcion H Pasos computacionales: Condiciones iniciales; Sea h = (b-a)/M;

T = matriz nula(1,M+1); Y = matriz nula(1,M+1); T = a:h:b; Y(1) = ya;

Para j = 1 hasta M evaluar k1=feval(f,T(j),Y(j)); k2=feval(f,T(j+1),Y(j)+h*k1); Y(j+1)=Y(j)+(h/2)*(k1+k2);

Termina H=[T' Y'];

c. Código en Matlab

function H=heun(f,a,b,ya,M) %Datos % - f es la funcion almacenada como una cadena de caracteres 'f' % - a y b son los extremos izquierdo y derecho del intervalo % - ya es la condicion inicial y(a) % - M es el numero de pasos %Resultados % - H=[T' Y'] siendo T el vector de las abcisas e % Y el vector de las ordenadas h=(b-a)/M; T=zeros(1,M+1); Y=zeros(1,M+1); T=a:h:b; Y(1)=ya; for j=1:M k1=feval(f,T(j),Y(j));

k2=feval(f,T(j+1),Y(j)+h*k1); Y(j+1)=Y(j)+(h/2)*(k1+k2); end H=[T' Y'];

IX.2.3. Método de las series de Taylor a. Introducción Este método permite la construcción de las aproximaciones a la solución de y’ = f(t,y) con y(a) = y0 en [a, b] evaluando y’’, y’’’, e y’’’’ y usando el polinomio de Taylor en cada paso. b. Algoritmo

Entrada df,a,b,ya,M Salida funcion T4 Pasos computacionales: Condiciones iniciales; Sean h = (b-a)/M;

T = matriz nula(1,M+1); Y = matriz nula(1,M+1); T = a:h:b; Y(1) = ya;

Para j = 1 hasta M evaluar D=feval(df,T(j),Y(j)); Y(j+1)=Y(j)+h*(D(1)+h*(D(2)/2+h*(D(3)/6+h*D(4)/24))); Termina T4=[T' Y']

c. Código en Matlab

function T4=taylor(df,a,b,ya,M) %Datos % - df=[y' y'' y''' y'''']almacenada como una cadena de caracteres % 'df' siendo y'=f(t,y) % - a y b son los extremos derecho e izquierdo del intervalo % - ya es la condicion inicial y(a) % - M es el numero de pasos %Resultados % - T4=[T' Y'] siendo T el vector de las abcisas e % Y el vector de las ordenadas h=(b-a)/M;

T=zeros(1,M+1); Y=zeros(1,M+1); T=a:h:b; Y(1)=ya; for j=1:M D=feval(df,T(j),Y(j)); Y(j+1)=Y(j)+h*(D(1)+h*(D(2)/2+h*(D(3)/6+h*D(4)/24))); end T4=[T' Y'];

IX.2.4. Métodos de Runge-Kutta a. Introducción Este método permite la aproximación a la solución del problema de valor inicial y’ = f(t,y) con y(a) = y0 en [a, b] usando la fórmula; h

yk+1 = yk + --- ( k1 + 2k2 + 2k3 + k4 ). 6 b. Algoritmo

Entrada f,a,b,ya,M Salida funcion R Pasos computacionales: Condiciones iniciales; Sean h = (b-a)/M;

T=matriz nula(1,M+1); Y=matriz nula(1,M+1); T=a:h:b; Y(1)=ya;

Para j = 1 hasta M evaluar 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;

Termina Calcula el valor de R = [T' Y']

c. Código en Matlab

function [T,Z]=rks4(F,a,b,Za, M)

%Datos % - F es la función almacenada como una cadena de caracteres 'F' % - a son los extremos derecho e izquierdo del intervalo % - Za=[x(a) y(a)] es la condición inicial % - M es el numero de pasos %Resultados % - T es el vector de los nodos % - Z=[x1(t) . . . xn(t)]donde xk(t) es la aproximación % a la k-ésima variable independiente h=(b-a)/M; T=zeros(1,M+1); Z=zeros(M+1,length(Za)); T=a:h:b; Z(1,:)=Za; for j=1:M k1=h*feval(F,T(j),Z(j,:)); k2=h*feval(F,T(j)+h/2,Z(j,:)+k1/2); k3=h*feval(F,T(j)+h/2,Z(j,:)+k2/2); k4=h*feval(F,T(j)+h,Z(j,:)+k3); Z(j+1,:)=Z(j,:)+(k1+2*k2+2*k3+k4)/6; end

IX.2.5. Método de Adams-Bashforth-Moulton a. Introducción Este método permite la construcción de las aproximaciones a la solución del problema de valor inicial y’ = f(t,y) con y(a) = y0 en [a, b] usando el valor predictor. h

pk+1 = yk + --- ( -9fk-3 + 37fk-2 - 59fk-1 + 55f k ). 24

y el valor corrector

h yk+1 = yk + --- ( fk-2 - 5fk-1 + 19fk + 9f k+1 ).

24 b. Algoritmo

Entrada f,T,Y Salida A Pasos computacionales:

Condiciones iniciales; Sea n = longitud de (T); Si n<5, termina el ciclo, termina; F=matriz nula(1,4); F=evaluar(f,T(1 hasta 4),Y(1 hasta 4)); h=T(2)-T(1); Para k=4 hasta n-1

El predictor es: p=Y(k)+(h/24)*(F*[-9 37 -59 55]'); T(k+1)=T(1)+h*k; F=[F(2) F(3) F(4) feval(f,T(k+1),p)];

El corrector es : Y(k+1)=Y(k)+(h/24)*(F*[1 -5 19 9]'); F(4)=feval(f,T(k+1),Y(k+1));

Termina A=[T' Y'];

c. Código en Matlab

function A=abm(f,T,Y) %Datos % - f es la funcion almacenada como una cadena de caracteres 'f' % - T es el vector de abcisas; su dimensión es el numero de pasos % - Y es el vector de las ordenadas %Observación % - las cuatro primeras coordenadas de T e Y deben contener los % valores iniciales calculados con el método RK4 %Resultado % - A=[T' Y'] siendo T el vector de las abcisas % - Y el vector de las ordenadas n=length(T); if n<5, returm, end; F=zeros(1,4); F=feval(f,T(1:4),Y(1:4)); h=T(2)-T(1); for k=4:n-1 %Predictor p=Y(k)+(h/24)*(F*[-9 37 -59 55]'); T(k+1)=T(1)+h*k; F=[F(2) F(3) F(4) feval(f,T(k+1),p)]; %Corrector

Y(k+1)=Y(k)+(h/24)*(F*[1 -5 19 9]'); F(4)=feval(f,T(k+1),Y(k+1)); end A=[T' Y'];

IX.2.6. Método de Milne a. Introducción Este método permite la construcción de las aproximaciones a la solución del problema de valor inicial y’ = f(t,y) con y(a) = y0 en [a, b] usando el valor predictor. 4h

pk+1 = yk-3 + --- ( 2fk-2 - fk-1 + 2f k ). 3 la modificación yk - pk

mk+1 = pk+1 + 28 ------------- fk+1 = f(tk+1 , mk+1). 29 y el valor corrector h

yk+1 = yk-1 + --- ( fk-1 + 4fk + f k+1 ). 3 b. Algoritmo

Entrada f,T,Y Salida funcion M Pasos computacionales: Condiciones iniciales; Sea n = longitud (T); Si n < 5 termina el ciclo, termina. F = matriz nula(1,4); F = evaluar(f,T(1 hasta 4),Y(1 hasta 4)); h = T(2)-T(1); pold = 0; yold = 0; Para k = 4 hasta n-1

El predictor es: pnew = Y(k-3)+(4*h/3)*(F(2 hasta 4)*[2 -1 2]'); El modificador es: pmod = pnew+28*(yold-pold)/29;

T(k+1)=T(1)+h*k; F=[F(2) F(3) F(4) feval(f,T(k+1),pmod)];

El corrector es: Y(k+1)=Y(k-1)+(h/3)*(F(2 hasta 4)*[1 4 1]'); pold=pnew; yold=Y(k+1);

F(4)= evaluar(f,T(k+1),Y(k+1)); Termina

c. Código en Matlab function M=milne(f,T,Y) %Datos % - f es la funcion almacenada como una cadena de caracteres 'f' % - T es el vector de abcisas; su dimensión es el numero de pasos % - Y es el vector de las ordenadas %Observación % - las cuatro primeras coordenadas de T e Y deben contener los % valores iniciales calculados con el método RK4 %Resultado % - M=[T' Y'] siendo T el vector de las abcisas % - Y el vector de las ordenadas n=length(T); if n<5, returm, end; F=zeros(1,4); F=feval(f,T(1:4),Y(1:4)); h=T(2)-T(1); pold=0; yold=0; for k=4:n-1 %Predictor pnew=Y(k-3)+(4*h/3)*(F(2:4)*[2 -1 2]'); %Modifier pmod=pnew+28*(yold-pold)/29; T(k+1)=T(1)+h*k; F=[F(2) F(3) F(4) feval(f,T(k+1),pmod)]; %Corrector Y(k+1)=Y(k-1)+(h/3)*(F(2:4)*[1 4 1]'); pold=pnew; yold=Y(k+1); F(4)=feval(f,T(k+1),Y(k+1)); end M=[T' Y'];

IX.2.7. Método de Hamming a. Introducción Este método permite la construcción de las aproximaciones a la solución del problema de valor inicial y’ = f(t,y) con y(a) = y0 en [a, b] usando el valor predictor.

4h pk+1 = yk-3 + --- ( 2fk-2 - fk-1 + 2f k ).

3 una modificación y el valor corrector -yk-2 +9yk 3h

yk+1 = ---------------- + ------ (-fk-1 + 2fk + f k+1 ). 8 8 b. Algoritmo

Entrada f,T,Y Salida funcion H Pasos computacionales: Condiciones iniciales; Sea n=longitud(T); Si n<5, regresa, sino termina el ciclo. F=matriz nula(1,4); Evalua la función: F=feval(f,T(1 hasta 4),Y(1 hasta 4)); h=T(2)-T(1); pold=0; cold=0; Para k=4 hasta n-1

El predictor es: pnew=Y(k-3)+(4*h/3)*(F(2 hasta 4)*[2 -1 2]'); El modificador es: pmod=pnew+112*(cold-pold)/121;

T(k+1)=T(1)+h*k; F=[F(2) F(3) F(4) feval(f,T(k+1),pmod)];

El corrector es : cnew=(9*Y(k)-Y(k-2)+3*h*(F(2:4)*[-1 2 1]'))/8; Y(k+1)=cnew+9*(pnew-cnew)/121; pold=pnew; cold=cnew; F(4)=feval(f,T(k+1),Y(k+1));

Termina. c. Código en Matlab

function H=hamming1(f,T,Y)

%Datos % - f es la funcion almacenada como una cadena de caracteres 'f' % - T es el vector de abcisas; su dimensión es el numero de pasos % - Y es el vector de las ordenadas %Observación % - las cuatro primeras coordenadas de T e Y deben contener los % valores iniciales calculados con el método RK4 %Resultado % - H=[T' Y'] siendo T el vector de las abcisas % - Y el vector de las ordenadas n=length(T); if n<5, returm, end; F=zeros(1,4); F=feval(f,T(1:4),Y(1:4)); h=T(2)-T(1); pold=0; cold=0; for k=4:n-1 %Predictor pnew=Y(k-3)+(4*h/3)*(F(2:4)*[2 -1 2]'); %Modifier pmod=pnew+112*(cold-pold)/121; T(k+1)=T(1)+h*k; F=[F(2) F(3) F(4) feval(f,T(k+1),pmod)]; %Corrector cnew=(9*Y(k)-Y(k-2)+3*h*(F(2:4)*[-1 2 1]'))/8; Y(k+1)=cnew+9*(pnew-cnew)/121; pold=pnew; cold=cnew; F(4)=feval(f,T(k+1),Y(k+1)); end H=[T' Y'];

X. SOLUCION NUMERICA DE ECUACIONES EN DERIVADAS PARCIALES

X.1. PLANTEAMIENTO DEL PROBLEMA Problemas físicos que involucran mas de una variable se pueden expresar frecuentemente usando ecuaciones que contienen derivadas parciales. Una ecuación diferencial en la que aparecen dos o más variables independientes se llama ecuación en derivadas parciales.

X.1.1. Ecuación diferencial parcial elíptica (función potencial)

En ingeniería las ecuaciones elípticas se usan para caracterizar problemas de estado estable (independiente del tiempo) y con valores en la frontera; por ejemplo:

1. Distribución estacionaria de calor en una región plana 2. La energía potencial de un punto en el plano bajo la acción de fuerzas gravitacionales

en el plano 3. Problemas estacionarios en dos dimensiones acerca de fluidos incompresibles

),(),(),(),(),(2

2

2

2

yxgyxuyxfy

yxux

yxu=+

∂∂

+∂

∂ ; Ecuación de Helmholts

),(),(),(2

2

2

2

yxgy

yxux

yxu=

∂∂

+∂

∂ ; Ecuación de Poisson

Donde, ),( yxg es la función que describe la entrada del problema en la región R cuya frontera denotaremos por S, cuando 0),( =yxg

0),(),(2

2

2

2

=∂

∂+

∂∂

yyxu

xyxu ; para 1010 <<<≤ yyx Ecuación de la Laplace

Cuando la temperatura dentro de la región esta determinada por la distribución de temperaturas en la frontera de la región, la condición de frontera de Dirichlet y esta dada por: ),(),( yxfyxu = , para toda (x,y) en S

Donde: u(x,y) = régimen permanente de la distribución de flujo o temperatura en una región.

σρkk =' = coeficiente de conductividad térmica (cal/s cm C)

k = coeficiente de conductividad térmica ρ = densidad del material σ = calor especifico

Condiciones de frontera ( )xfxu 1)0,( = ; para )(100 abajoxyy ≤≤=

( )xfxu 2)1,( = ; para )(101 arribaxyy ≤≤= ( )xfyu 3),0( = ; para )(100 izquierdalaayyx ≤≤= ( )xfyu 4),1( = ; para )(101 derechalaayyx ≤≤=

X.1.1.1. Problema de Dirichlet Cuando se conocen los valores que debe tomar la derivada normal de la función u(x,y) en la frontera de una región rectangular R del plano.

0),(=

∂∂

Nyxu

X.1.1.2. Problema de Neumann Cuando se conocen los valores que debe tomar la función u(x,y) en la frontera de una región rectangular R del plano. X.1.2. Ecuación diferencial parcial parabólica (ecuación de conducción o difusión) Se emplean para caracterizar problemas dependientes del tiempo X.1.2.1. Modelo unidimensional del flujo de calor en un alambre (barra larga y delgada) aislado de longitud L

0),(),(2

2'' =

∂∂

−∂

∂x

txukt

txu ; para ∞<<<≤ tyLx 00

Donde: u(x,t) = temperatura en la posición x del alambre en el instante t.

σρkk ='' = coeficiente de difusividad térmica y esta determinado por las propiedades de

conductividad del calor del material de que esta compuesta la barra y se supone que es independiente de la posición de la barra. k = coeficiente de conductividad térmica ρ = densidad del material σ = calor especifico Condición inicial = distribución inicial del calor (temperatura) en la barra ( )xfxu =)0,( ; para Lxyt ≤≤= 00 Condiciones de frontera en los extremos del alambre 1),0( Ctu = ; para ∞<≤= tyx 00 2),( CtLu = ; para ∞<≤= tyLx 0 X.1.2.2. Modelo bidimensional de la conducción del calor en una placa

0),(),(2

2'' =

∂∂

−∂

∂x

txukt

txu ; para ∞<<<≤ tyLx 00

X.1.3. Ecuación diferencial parcial hiperbólica Ejemplo: a). Modelo unidimensional de la cuerda vibrante (ecuación de la onda)

Supongamos que una cuerda elastica de longitud L se estira tensamente entre dos soportes al mismo nivel horizontal. Si la cuerda se pone en movimiento de tal marera que vibre en un plano vertical, entonces el desplazamiento vertical u(x,t) de un punto x en el tiempo t satisface la ecuación diferencial parcial:

0),(1),(2

2

2

2

=∂

∂−

∂∂

ttxu

cxtxu ; para ∞<<<≤ tyLx 00 , siempre y cuando los efectos

de resistencia sean despreciables y la amplitud no sea muy grande. Donde:

u(x,t) = desplazamiento de la cuerda

ρTc = = constante

T = tensión de la cuerda ρ = masa de la cuerda por unidad de longitud

Condiciones iniciales de la posición y la velocidad de la cuerda ( )xfxu =)0,( ; para Lxyt ≤≤= 00

( )xgtxu

=∂

∂ )0,( ; para Lxyt <<= 00

Condiciones de frontera o valores en los extremos de la cuerda 0),0( =tu ; para ∞<≤= tyx 00

0),( =tLu ; para ∞<≤= tyLx 0

X.2. METODOS DE SOLUCION 1. Ecuación diferencial parcial elíptica Modelo unidimensional a) Métodos iterativos a.1) Resolución de Dirichlet 2. Ecuación diferencial parcial parabólica Modelo unidimensional a) Método explícito b) Método implícito c) Método de Crack-Nicolson Modelo Bidimensional a) Esquema estándar explicito b) Esquema estándar implícito

c) Esquema implícito de dirección alternada (IDA) 3. Ecuación diferencial parcial hiperbólica Modelo unidimensional X.2.1.a.1. Resolución de Dirichlet a. Introducción Si por ejemplo, se deseará resolver la ecuación de Laplace utilizando la resolución de Dirichlet, se construiría una aproximación a la solución de

uxx(x,y) + uyy(x,y) = 0 en

R = { (x,y) : 0 ≤ x ≤ a, 0 ≤ y ≤ b} con las condiciones de contorno u(x,0) = f1(x), u(x,b) = f2(x), para 0 ≤ x ≤ a y u(0,y) = f3(y), u(a,y) = f4(y) para 0 ≤ y ≤ b. Se supone que ∆x = ∆y = h y que existen dos números naturales n y m tales que a = nh y b = mh. b. Algoritmo

Entrada: f1, f2, f3, f4, a, b, h, tol, max1Y. Salida: U.

Pasos computacionales:

Determinar el incremento en el eje X, usando el cociente del valor del extremo del eje con el tamaño de paso, sumarle una unidad por el tratamiento que Matlab tiene acerca del inicio de la malla computacional.

Determinar el incremento en el eje Y, usando el cociente del valor del extremo del eje con el tamaño de paso, sumarle una unidad por el tratamiento que Matlab tiene acerca del inicio de la malla computacional.

Discretización del problema: cálculo del valor inicial en los puntos interiores de la malla, definido como el valor de la media de los 2n + 2m – 4 valores en el contorno dado por f1,f2,f3,f4.

Declaración de la malla solución, incluyendo el valor inicial en cada nodo. Asignar los valores de la condición de frontera correspondientes a las partes superior, inferior, izquierda y derecha de la malla solución.

Calcular los valores de los nodos que se encuentran en las esquinas de las mallas, dependiendo de la posición de la esquina, utilizar:

u1,1 =( u2,1+u1,2)/2; u1,m =( u2,m+u1,m-1)/2; un,1 =( un-1,1+un,2)/2; u1,1 =( un-1,m+un,m-1)/2 Obtención del parámetro de sobrerelajación, utilizando: w = 4/(2+sqrt(4-(cos(pi/(n-1))+cos(pi/(m-1)))^2)); Iniciar el proceso iterativo para calcular el valor residual de cada uno de los nodos de la malla:

relx = w*(U(i,j+1)+U(i,j-1)+U(i+1,j)+U(i-1,j)-4*U(i,j))/4 donde i es la posición del nodo en el eje de las abscisas y j declara la posición que tiene el nodo en el eje de las ordenadas. El proceso se interrumpe cuando el término residual se aproxima o reduce a cero.

Debido al tratamiento de Matlab, invertir la matriz solución (malla computacional) y graficar.

c. Código en Matlab

function U=dirich(f1,f2,f3,f4,a,b,h,tol,max1) % ________________________________________________________ % Esta funcion encuentra la solución de Dirichlet a la ecuacion % de Laplace % u (x, y) + u (x, y) = 0, % xx yy % % con las condiciones de frontera: % % u(x, 0) = f1, u(x, b) = f2 para toda 0 <= x <= a, y % % u(0, y) = f3, u(a, y) = f4 para toda 0 <= y <= b. % % Los subíndices xx y yy indican la segunda derivada parcial de u(x,y) % con respecto a x y y, respectivamente. % % Sintaxis para utilizar la funcion: % >> U = dirich(f1,f2,f3,f4,a,b,h,tol,max1) % % Parametros de entrada: % f1: es el valor de frontera correspondiente a la parte inferior % de la misma. % f2: es el valor de frontera correspondiente a la parte superior % de la misma. % f3: es el valor de frontera correspondiente a la parte izquierda % de la misma. % f4: es el valor de frontera correspondiente a la parte derecha % de la misma. % a: es el extremo superior de [0,a] (intervalo del valores en el % eje de las abscisas). % b: es el extremo superior de [0,b] (intervalo del valores en el % eje de las ordenadas). % h: tamaño del paso. % tol: tolerancia de la convergencia. % max1: numero maximo de iteraciones, % Parametros de salida: % U: es la matriz solucion. % Requerimientos: % f1,f2,f3,f4: deben ser manejados como funciones % independientes del este script y deben contener los valores % numericos correspondientes a cada condicion de frontera. % Ejemplo:

% >> U = dirich(‘f1’, ‘f2’, ‘f3’, ‘f4’, 4, 4, 0.1, 0.0001, 200) % _______________________________________________________

n=fix(a/h)+1; m=fix(b/h)+1; ave=(a*(feval(f1,0)+feval(f2,0))+b*(feval(f3,0)+… feval(f4,0)))/(2*a+2*b); U=ave*ones(n,m); U(1,1:m)=feval(f3,0:h:(m-1)*h)'; U(n,1:m)=feval(f4,0:h:(m-1)*h)'; U(1:n,1)=feval(f1,0:h:(n-1)*h); U(1:n,m)=feval(f2,0:h:(n-1)*h); U(1,1)=(U(1,2)+U(2,1))/2; U(1,m)=(U(1,m-1)+U(2,m))/2; U(n,1)=(U(n-1,1)+U(n,2))/2; U(n,m)=(U(n-1,m)+U(n,m-1))/2; w = 4/(2+sqrt(4-(cos(pi/(n-1))+cos(pi/(m-1)))^2)); err = 1; cnt = 0; while((err > tol) & (cnt <= max1)) err=0; for j = 2:m-1 for i = 2:n-1 relx = w*(U(i,j+1)+U(i,j-1)+U(i+1,j)+U(i-1,j)-4*U(i,j))/4; U(i,j) = U(i,j)+relx; if (err <= abs(relx)) err = abs(relx); end end end cnt=cnt+1; end U=flipud(U');

X.2.2.a. Método de diferencias finitas explícitas. a. Introducción El método de diferencias progresivas finitas básicamente parte de la solución de ecuaciones del tipo

ut(x,t) = c2uxx(x,t) en

R = { (x,t) : 0 ≤ x ≤ a, 0 ≤ t ≤ b}

con u(x,0) = f(x) para 0 ≤ x ≤ a y u(0,t) =c1, u(a,t) = c2 para 0 ≤ t ≤ b. b. Algoritmo

Entrada: f, c1, c2, a, b, c, n, m. Salida: U.

Pasos computacionales:

Determinar el incremento en el eje correspondiente a la variable espacial. Determinar el incremento en el eje correspondiente a la variable temporal. De la ecuación general de diferencias explícitas progresivas:

ui,j+1=(1-2r)ui,j +r(ui-1,j+ui+1,j) obtener la variable r y el término (1-2r). Declaración de la malla solución, incluyendo el valor inicial de cada nodo como cero.

Asignar los valores de la condición de frontera correspondientes a las partes inferior y superior de la malla solución.

Calcular los valores de los nodos que se encuentran en la primera fila. Iniciar el proceso iterativo para calcular el valor de cada uno de los nodos de la malla, utilizando la ecuación general de diferencias explícitas progresivas.

Debido al tratamiento de Matlab, invertir la matriz solución (malla computacional) y graficar.

c. Código en Matlab

function U = forwdif(f,c1,c2,a,b,c,n,m) % _____________________________________________________ % Funcion que tu puedes aplicar para usar el metodo explicito de % diferencias finitas. % Parametros de entrada: % f = contiene la funcion a calcular. % c1 = es la primer condicion de frontera u(0,t). % c2 = es la segunda condicion de frontera u(a,t). % a = es la longitud de la variable espacial. % b = es la longitud de la variable temporal % c = Es la constante de Courant constant (depende de la % ecuacion). % m = numero de columnas. % n = numero de filas. % Parametros de salida: % U = matriz solucion % _____________________________________________________ h = a / ( n - 1 ); k = b / ( m - 1 ); r = c ^ 2 * ( k / h ^ 2); s = 1 - 2 * r; U = zeros(n,m);

U(1,1:m) = 0; U(n,1:m) = 0; U(2:n-1,1)= feval('f', h:h:(n-2) * h)'; for j =2:m for i =2:n-1 U(i,j)= s * U(i , j-1) + r * (U (i-1 , j-1) + U(i+1, j-1)); end end U = U';

X.2.2.b. Método de Crack-Nicholson. a. Introducción El método de Crack-Nicholson parte de las aproximaciones que se pueden generar de la solución de ecuaciones del tipo

ut(x,t) = c2uxx(x,t) en

R = { (x,t) : 0 ≤ x ≤ a, 0 ≤ t ≤ b} con u(x,0) = f(x) para 0 ≤ x ≤ a y u(0,t) =c1, u(a,t) = c2 para 0 ≤ t ≤ b. b. Algoritmo

Entrada: f, c1, c2, a, b, c, n, m. Salida: U.

Pasos computacionales:

Determinar el incremento en el eje correspondiente a la variable espacial. Determinar el incremento en el eje correspondiente a la variable temporal. De la ecuación en diferencias implícitas:

-rui-1,j+1+(2+2r)ui,j+1-rui+1,j+1=rui-1,j+(2-2r)ui,j +ui+1,j obtener la variable r y los términos (2-2r) y (2+2r) . Declaración de la malla solución, incluyendo el valor inicial de cada nodo como cero.

Asignar los valores de la condición de frontera correspondientes a las partes inferior y superior de la malla solución.

Calcular los valores de los nodos que se encuentran en la primera fila. Formar la diagonal principal para la resolución del sistema AX = B. Crear un arreglo numérico (elementos de la diagonal principal de la matriz de coeficientes) y asignar el valor del término (2+2r) a cada elemento del mismo; en los extremos del arreglo asignar como valo, la unidad.

Crear un arreglo numérico unitario negativo de dimensiones 1 x n-1 (subdiagonal de la matriz de coeficientes). El último elemento del arreglo deberá tener un valor nulo.

Crear un arreglo numérico unitario negativo de dimensiones 1 x n-1 (superdiagonal de la matriz de coeficientes). El primer elemento del arreglo deberá tener un valor nulo.

Crear una matriz computacional de dimensiones n x m (términos independientes del sistema lineal), donde al primer y el último elemento de la primera columna se les asignará los valores correspondientes a las condiciones de frontera inicial y final respectivamente; mediante iteraciones y utilizando

bi=ui-1,j-1+ui+1,j-1+(2/r-2)ui,j-1; obtener los valores correspondientes a las filas correspondientes a la primer columna. Resolver el sistema tridiagonal para cada columna y los valores conseguidos, enviarlos a la matriz solución del método de Crank-Nicholson. Iterar hasta obtener todos los valores correspondientes a la dimension de la matriz solución.

Debido al tratamiento de Matlab, invertir la matriz solución (malla computacional) y graficar.

c. Código en Matlab

function U=crnich(f,c1,c2,a,b,c,n,m) %Metodo de Crank-Nicholson para la ecuacion del calor %Entradas % - f = u(x,0) como una cadena de caracteres 'f' % - c1 = u(0,t) y c2 = u(a,t) % - a y b extremos derechos de los intervalos [0,a] y [0,b] % - c constante de la ecuacion del calor % - n y m numero de nodos en [0,a] y [0,b] %Salidas % - U matriz solucion h=a/(n-1); k=b/(m-1); r=c^2*k/h^2; s1=2+2/r; s2=2/r-2; U=zeros(n,m); U(1,1:m)=c1; U(n,1:m)=c2; U(2:n-1,1)=feval(f,h:h:(n-2)*h)'; Vd(1,1:n)=s1*ones(1,n); Vd(1)=1; Vd(n)=1; Va=-ones(1,n-1); Va(n-1)=0; Vc=-ones(1,n-1); Vc(1)=0; Vb(1)=c1; Vb(n)=c2;

for j=2:m for i=2:n-1 Vb(i)=U(i-1,j-1)+U(i+1,j-1)+s2*U(i,j-1); end X=trisys(Va,Vd,Vc,Vb); U(1:n,j)=X'; end U=U'

X.2.3. Método de diferencias finitas. a. Introducción El método de diferencias finitas puede ser usado para resolver ecuaciones del

utt(x,t) = c2uxx(x,t) en

R = { (x,t) : 0 ≤ x ≤ a, 0 ≤ t ≤ b} Como por ejemplo la ecuación de la onda, con u(0,t) = 0, u(a,t) = 0 para 0 ≤ t ≤ b y u(x,0) =f(x), u(x,0) = g(x) para 0 ≤ x ≤ a. b. Algoritmo

Entrada: funcion_f, funcion_g, a, b, c, n, m. Salida: U.

Pasos computacionales:

Determinar el incremento en el eje correspondiente a la variable espacial. Determinar el incremento en el eje correspondiente a la variable temporal. De la ecuación en diferencias finitas:

ui,j+1 = (2-2r2)ui,j +r2(ui+1,j+ ui-1,j,)-rui,j-1 obtener la variable r y los términos (2-2r2). A partir de la ecuación de los elementos de la segunda fila:

ui,2=(1-r2)fi +kgi+(r2/2)(fi+1+fi-1) Calcular los valores de (1-r2) y r2/2. Declaración de la malla solución, incluyendo el valor inicial de cada nodo como cero.

Iterar tanto la primer como la segunda fila de la malla solución; los valores de los elementos de la primer fila se obtendran del valor que toma la función f, correspondiente al valor de la variable independiente d el nodo anterior al nodo donde se desea conocer el valor. Para determinar los valores de los elementos de la segunda fila, se debe aplicar la ecuación que lleva el mismo nombre.

Iterar la ecuación de diferencias finitas para encontrar los valores de los elementos de la matriz solución.

c. Código en Matlab

function U = finedif(funcion_f,funcion_g,a,b,c,n,m) %Resolucion de la ecuacion de la onda por el metodo de las diferencias %finitas

%Entradas % - funcion_f = u(x,0) como una cadena de caracteres 'funcion_f' % - funcion_g = ut(x,0) como una cadena de caracteres 'funcion_g' % - a y b extremos superiores de los intervalos [0,a] y [0,b] % - c constante de la ecuacion de la onda % - n y m numero de nodos en [0,a] y [0,b] %Salidas % - U matriz solucion h = a/(n-1); k = b/(m-1); r = c*k/h; r2=r^2; r22=r^2/2; s1 = 1 - r^2; s2 = 2 - 2*r^2; U = zeros(n,m); for i=2:n-1 U(i,1)=feval(funcion_f,h*(i-1)); U(i,2)=s1*feval(funcion_f,h*(i-1))+k*feval(funcion_g,h*(i-1)) ... +r22*(feval(funcion_f,h*i)+feval(funcion_f,h*(i-2))); end for j=3:m, for i=2:(n-1), U(i,j) = s2*U(i,j-1)+r2*(U(i-1,j-1)+U(i+1,j-1))-U(i,j-2); end end U=U';

REFERENCIAS BIBLIOGRÁFICAS

• Mathews H, John. METODOS NUMERICOS CON MATLAB. Editorial

Prentice Hall. Universidad de Sevilla. 2000. • Nakamura, Shoichiro. ANALISIS NUMERICO Y VISUALIZACION

GRAFICA CON MATLAB. Pearson educación. Universidad de Ohio. 2001.

• García, Javier., APRENDA MATLAB COMO SI ESTUVIERA EN PRIMERO. Macmillan. Universidad Politécnica de Madrid, 2003.

• Rodríguez, Ignacio, et all. TALLER DE PROGRAMACION DE MATLAB.

XIII Foro de Matemáticas en la D. A. C. B. – UJAT. 2002. • Sigmon, Kermit. INTRODUCCION AL MATHLAB. Departamento de

Matemáticas de la Universidad de Florida. 1992. • Brazalez, Alfonso. TUTORIAL COMPLETO DE MATLAB, articulo de

divulgación Universidad de Sevilla. 2001. • D. Hanselman and B. Litte_eld, THE STUDENT EDITION OF MATLAB:

version 4, Prentice-Hall, 1995. • A. Biran and M. Breiner, MATLAB FOR ENGINEERS, Addison-Wesley,

1995. • Eva P�art-Enander, Anders Sj�oberg, Bo Melin and Pernilla Isaksson,

THE MATLAB HANDBOOK, Addison-Wesley, 1996. • W. H. Press, S. A. Teukolsky, W. T. Vetterling and B. P. Flannery,

NUMERICAL RECIPES IN FORTRAN, 2da. Edición.

ANEXO

VII CONGRESO INTERNACIONAL DE INGENIERÍA HIDRÁULICA CAMAGÜEY, CUBA, OCTUBRE, DEL 2005.

DESARROLLO DE CODIGOS EN MATLAB, PARA RESOLVER PROBLEMAS EN HIDRAULICA”

M. en C. Lucio Fragoso Sandoval2, M. en C. J. Roberto Ruiz y Zurvia Flores, M. en C. A. Bruno Juárez León e Ing. Adriana Guadalupe Porres López3

RESUMEN Tradicionalmente en la enseñanza de la hidráulica se ha dejado que el alumno genere sus propios códigos para resolver problemas en este campo, teniendo que rehacerse cada semestre tales códigos. Por ello, investigadores de la Escuela Superior de Ingeniería y Arquitectura, Unidad Zacatenco del Instituto Politécnico Nacional, desarrollaron este proyecto que nos permite estandarizar los procedimientos en la generación de códigos en Matlab, mismos que se pueden reutilizar, y son fáciles de exportar a otros lenguajes de programación como lo es el lenguaje C, o bien Basic, o quizá Fortran, y que incluso son fáciles de interpretar. En este proyecto se desarrollaron diversas herramientas que podrán ser utilizadas en el curso de Métodos Numéricos y aplicadas a otras materias de Hidráulica, así como en el desarrollo de otros proyectos de investigación y para el desarrollo de tesis de grado. A través de este proyecto se llevo a cabo en el ambiente del programa Matlab, el desarrollo de diferentes códigos, para la solución de problemas de metodología numérica, según el tipo de problema sobre hidráulica que se pretenda analizar y resolver. De igual manera se desarrollo un manual de usuario que contiene un breviario del objetivo principal de cada codigo, así como su pseudocódigo y algoritmo que nos explican la actividad paso a paso que desarrolla cada programa.

2 Profesor Investigador de la Escuela Superior de Ingeniería y Arquitectura, Unidad Zacatenco, del Instituto Politécnico Nacional. Edificio No. 12 de

la Unidad Profesional Zacatenco, Col. Lindavista, C. P. 07738, México D. F. 5729-6000, Ext. 53-037. 3 Becario PIFI Escuela Superior de Ingeniería y Arquitectura, Unidad Zacatenco, del Instituto Politécnico Nacional. Edificio No. 12 de la Unidad

Profesional Zacatenco, Col. Lindavista, C. P. 07738, México D. F. 5729-6000, Ext. 53-037.