2.1.-Resol.ec. no lineales.nb 126 OPERADORES LÓGICOS Y RELACIONALES. CICLOS Y ESTRUCTURAS DE CONTROL. MÉTODOS DE RESOLUCIÓN DE UNA ECUACIÓN NO LINEAL. Operadores lógicos y relacionales Los operadores lógicos son: ! p : Contrario de p. Resulta verdadero si p es falso y al reves. p && q : ( And lógico ) Es verdadero si p y q son verdaderos y falso en caso contrario. p fifi q : (Or lógico ) Es verdadero si p o q o ambos son verdaderos. Los operadores relacionales son : x == y ( x igual a y) x != y ( x distinto de y) x > y ; x < y; x >= y; x <= y. El resultado de una operación lógica o relacional es un valor lógico verdadero o falso. à El comando If Mediante este comando se evalua una expresión u otra según que una determinada condición sea verdadera o falsa. Su forma es : If[condición, t, f] Si la condición es verdadera se evalúa la expresión t, y si es falsa la f. x = 7; y = 10; If@x ≥ y, x ^ 2, y ^ 3D 1000 2.1.-Resol.ec. no lineales.nb 127 Ciclos y estructuras de Control La ejecución de un programas de Mathematica implica la evaluación de una sucesión de expresiones de Mathematica. En programas sencillos las expresiones a evaluar se suelen encontrar separadas por ; y se evalúan una tras otra. A menudo, sin embargo, puede ser necesario evaluar un mismo grupo de expresiones varias veces, en una especie de "ciclo". Esto es lo que ocurre en muchos métodos iterativos. Entre otros, Mathematica dispone de los siguientes comandos para implementar ciclos: Do, For y While. El comando más sencillo es el Do que se parece mucho al comando Table. La sintaxis de estos comandos es la siguiente: 1º.- Do Do[expr,{i,imax}] Do[expr,{i,imin,imax,di}] Do[expr,{n}]. Este comando es muy parecido al comando Table con la diferencia de que no se gnera una lista, simplemente se evalúa expr tantas veces como indique el contador i. 2º.- For For[start,test,incr,body] El comando For tiene cuatro partes: - start : se inicializan con el valor deseado las variables que intervienen en el ciclo. Irán separadas por ;. - test : condición lógica que será evaluada cada vez que se recorra el ciclo. Cuando test es falso se sale del ciclo. - incr : sirve para incrementar el contador utilizado. - body : está constituído por el conjunto de acciones, separadas por ; , que se ejecutan cada vez que se recorre el ciclo. 3º.- While While[test,body] Se evalúan las acciones que forman body mientras la expresión lógica contenida en test sea verdadera. Como ejemplo de utilización de estos comandos se presentan algunos métodos de resolución de una ecuación no lineal. Método de la bisección Ejemplo . Obtener, mediante el método de la bisección , una solución aproximada de la ecuación : è!!!!!!!! !!!!! x2 + 1 = tanHxL, 0 < x < p ê 2 En cada iteración se calcula también la longitud del intervalo. El proceso finalizará cuando la longitud del intervalo sea menor que 0.001 o el valor de la función en el resultado de la última iteración sea menor que 0.001. Solución: En primer lugar realizamos la representación gráfica para obtener un intervalo [a,b] en el que la función cambie de signo 2.1.-Resol.ec. no lineales.nb f@x_D = − 128 è!!!!!!!! !!!!! x2 + 1 + Tan@xD; Plot@f@xD, 8x, 0, π ê 2<, PlotRange → 8−1, 1<D 1 0.75 0.5 0.25 0.25 0.5 0.75 1 1.25 1.5 -0.25 -0.5 -0.75 -1 Graphics Tomamos el intervalo [0.8,1] a = 0.8; b = 1; c = Ha + bL ê 2; lon = Abs@b − aD; While@lon > 0.001 fl Abs@ f@cDD > .001, If@f@cD ∗ f@aD < 0, b = c, a = cD; c = Ha + bL ê 2; lon = Abs@b − aD; Print@c, " ", lon, " ", f@cDDD 0.95 0.1 0.925 0.0190712 0.05 0.9375 −0.0352361 0.025 0.94375 −0.00866004 0.0125 0.00505648 −0.00183845 0.940625 0.00625 0.942188 0.003125 0.941406 0.0015625 0.00159977 −0.000121639 2.1.-Resol.ec. no lineales.nb 129 Método de Newton-Raphson Ejemplo Hallar mediante el método de Newton y con un error menor que 10-4 las raices positivas de la ec.: 0.5 exê3 - sen(x) = 0. Solución En primer lugar representamos gráficamente la función para determinar una buena aproximación inicial. f@x_D = 0.5 ∗ Exp@x ê 3D − Sin@xD; Plot@f@xD, 8x, 0, 4<D 1.5 1.25 1 0.75 0.5 0.25 1 2 3 4 Graphics A la vista de la gráfica, dos buenas aproximaciones son : 0.6 y 2. Utilizamos esta vez el comando While para realizar las iteraciones del método de Newton-Raphson. Se utiliza como condición que la diferencia en valor absoluto entre las dos últimas iteraciones sea menor que eps y que el nº de iteraciones sea inferior a nmax. xv = 0.6; error = 1; eps = 10−15 ; nmax = 50; n = 1; 2.1.-Resol.ec. no lineales.nb 130 While@error > eps && n < nmax, xn = SetPrecision@xv − f@xvD ê f '@xvD, 15D; error = Abs@xn − xvD; Print@"En la iter. ", n, " la sol.aprox.es ", xnD; xv = xn; n ++D En la iter. 1 la sol.aprox.es 0.674077259515817 En la iter. 2 la sol.aprox.es 0.677206926997974 En la iter. 3 la sol.aprox.es 0.677212889956926 En la iter. 4 la sol.aprox.es 0.677212889978624 En la iter. 5 la sol.aprox.es 0.677212889978625 Método de la secante Ejemplo Hallar mediante el método de la secante y con un error relativo inferior al 0.001% el valor aproximado de la raiz de la ec.: e-x - x = 0 partiendo de x0 =0 y x1 =1, y sabiendo que la solución exacta es r=0.56714329. El número máximo de iteraciones a realizar es 30. Solución En primer lugar representamos gráficamente la función 2.1.-Resol.ec. no lineales.nb 131 f@x_D = Exp@−xD − x; Plot@f@xD, 8x, 0, 2<D 1 0.5 0.5 1 1.5 2 -0.5 -1 -1.5 Graphics Utilizamos el comando While para realizar las iteraciones del método de la secante. Se utiliza como condición que la diferencia en valor absoluto entre el valor exacto y el valor aproximado obtenido en la iteración dividida por el valor exacto sea menor que 0.00001 y que el nº de iteraciones sea inferior a nmax. x0 = 0.; x1 = 1; error = 1; eps = 10−5 ; nmax = 30; n = 1; r = 0.56714329; While@error > eps && n < nmax, x2 = SetPrecision@x1 − f@x1D ∗ Hx1 − x0L ê Hf@x1D − f@x0DL, 9D; error = Abs@r − x2D ê r; Print@"En la iter. ", n, " la sol.aprox.es ", x2D; x0 = x1; x1 = x2; n ++D En la iter. 1 la sol.aprox.es 0.612699837 En la iter. 2 la sol.aprox.es 0.563838389 En la iter. 3 la sol.aprox.es 0.567170358 En la iter. 4 la sol.aprox.es 0.567143307 Los comandos Solve y FindRoot Una expresión como x^2 + 2 x - 7 ã 0 representa en Mathematica una ecuación.Podemos utilizar el comando Solve para obtener los valores de x que verifican la ecuación: 2.1.-Resol.ec. no lineales.nb 132 Solve[x^2 + 2x - 7 == 0, x] 99x → −1 − 2 è!!! è!!! 2 =, 9x → −1 + 2 2 == Si se quiere el valor aproximado : NSolve[x^2 + 2x - 7 == 0, x] 88x → −3.82843<, 8x → 1.82843<< El resultado es una lista de reglas en las que se asigna a x los valores de las raices. Para extraer de la solución el resultado : sol=NSolve[x^2 + 2x - 7 == 0, x];a=x/.sol[[1]] −3.82843 El comando Solve siempre intenta dar como resultado fórmulas explícitas para la solución de una ecuación. Sin embargo, si la ecuación es un poco compleja esto resultará imposible. Para ecuaciones algebráicas de grado menor o igual que 4 Mathematica proporciona el reusltado exacto, pero puede que esto sea imposible para grados mayores. Mathematica también puede resolver ecuaciones con funciones trascendentes . En muchos de estos casos da un mensaje indicando que en el resultado no están todas las soluciones, Solve[ Sin[x] == 1.5 , x ] — Solve::ifun : Inverse functions are being used by Solve, so some solutions may not be found; use Reduce for complete solution information. More… 88x → 1.5708 − 0.962424 << Se puede obtener una solución numérica de la ecuación mediante el comando FindRoot. Este comando implementa una versión del método de Newton-Raphson y necesita una aproximación inicial. En la práctica esta aproximación se obtiene a partir de la representación gráfica. FindRoot[ Cos[x] == x, {x, 1} ] 8x → 0.739085< 2.1.-Resol.ec. no lineales.nb 133 Ejercicios 1º.- Comprobar gráficamente que la función f(x) = x- 0.2 sen(x) - 0,5 tiene una única raiz real en el intervalo [0.5 , 1]. Aplicar los métodos de la bisección y Newton-Raphson, contando en cada caso el número de iteraciones que se han realizado , para determinar la raiz con una precisión de 10-4 . Establecer un nº máximo de iteraciones a realizar igual a 50. 2º.- Representar en una misma gráfica las funciones f(x) = 2 cos(x) y g(x) = ex para obtener aproximaciones iniciales de las raices de 2cos(x) - ex = 0. ¿Cuántas raíces tiene?. ¿Cuántas son positivas?. Determinar las raices positivas con una precisión de 10-8 utilizando el método de Newton-Raphson . 3º.- Comprobar de forma gráfica que la ecuación . 4 sen(x) = 1+x tiene tres raices reales : r1 <r2 <r3 . A continuación determinar con una precisión de 10-6 , a) r1 utilizando el mdo de la secante. " " " " " bisección. b) r2 " " " " Newton. c) r3 4º.- Encontrar una raiz aproximada de la ecuación : x3 - x - 1 = 0 en el intervalo [1 , 2] con una precisión de 10-10 primero por el método de Newton y luego por el de la secante. Contar el nº de iteraciones que se han realizado en ambos casos para comprobar cuál de los dos métodos tiene una convergencia más rápida. 5º.-Utilizando Do, representar sucesivamente las gráficas de sen(nx) para n desde 1 hasta 5 6º.-Siendo Sn la suma de los n primeros números naturales. ¿Cúal es el mayor valor de n tal que Sn<11?. En este caso, ¿Cuanto es exactamente la suma Sn?. Repetir el ejercicio de forma que Sn<10^4. 2.1.-Resol.ec. no lineales.nb 134 2 3 x x 7º.-Sabiendo que ex = 1 + x + ÅÅÅÅ ÅÅ + ÅÅÅÅ ÅÅ +.... . Encontrar el polinomio que nos da, para x=5, una valor aproximado de 2! 3! -4 5 e con un error menor que 10 . Utilizar como criterio de parada que el valor absoluto del sumando a añadir sea menor que 10-4 . El nº de operaciones se puede optimizar teniendo en cuenta que el nuevo sumando que hay que x3 x2 ÅÅ = ( ÅÅÅÅ ÅÅ )* ÅÅÅÅ3x , es decir , term = term/n y añadir es igual al último que se ha añadido dividido por n. Por ejemplo : ÅÅÅÅ 3! 2! a continuación : suma = suma +term. 8º.- La sucesión 8an } de los números de Fibonacci verifica que an = an-1 +an-2 , siendo a0 = a1 = 1. Crear una lista que contenga a los 20 primeros términos de la sucesión. Calcular los términos de la sucesión que sean menores que 1000.