I1M2015: Cálculo numérico en Maxima
En la tercera parte de la clase de hoy de Informática de 1º del Grado en Matemáticas hemos comentado las soluciones a los ejercicios de la relación 25 en la que se propone definir en Maxima los procedimientos de cálculo numérico definidos en Haskell en la relación 21.
Los ejercicios y su solución se muestran a continuación
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
/* --------------------------------------------------------------------- Introducción --------------------------------------------------------------------- En esta relación se programan en Maxima funciones para resolver los siguientes problemas de cálculo numérico: + diferenciación numérica, + cálculo de la raíz cuadrada mediante el método de Herón, + cálculo de los ceros de una función por el método de Newton y + cálculo de funciones inversas. */ /* --------------------------------------------------------------------- Diferenciación numérica ------------------------------------------------------------------- */ /* --------------------------------------------------------------------- Ejercicio 1.1. Definir la función derivada tal que derivada(a,f,x) es el valor de la derivada de la función f en el punto x con aproximación a. Por ejemplo, (%i2) derivada (0.001,sin,%pi); (%o2) - 0.99999983333334 (%i3) derivada (0.001,cos,%pi); (%o3) 4.999999583255033E-4 ------------------------------------------------------------------- */ derivada (a,f,x) := (f(x+a)-f(x))/a$ /* --------------------------------------------------------------------- Ejercicio 1.2. Definir las funciones derivadaBurda, derivadaFina y derivadaSuper tales que + derivadaBurda (f,x) es el valor de la derivada de la función f en el punto x con aproximación 0.01, + derivadaFina (f,x) es el valor de la derivada de la función f en el punto x con aproximación 0.0001. + derivadaSuper (f,x) es el valor de la derivada de la función f en el punto x con aproximación 0.000001. Por ejemplo, (%i4) derivadaBurda (cos,%pi); (%o4) 0.0049999583334736 (%i5) derivadaFina (cos,%pi); (%o5) 4.999999969612645E-5 (%i6) derivadaSuper (cos,%pi); (%o6) 5.000444502911705E-7 ------------------------------------------------------------------- */ derivadaBurda (f,x) := derivada (0.01, f,x)$ derivadaFina (f,x) := derivada (0.0001, f,x)$ derivadaSuper (f,x) := derivada (0.000001,f,x)$ /* --------------------------------------------------------------------- Ejercicio 1.3. Definir la función derivadaFinaDelSeno tal que (derivadaFinaDelSeno x) es el valor de la derivada fina del seno en x. Por ejemplo, (%i7) derivadaFinaDelSeno (%pi); (%o7) - 0.99999999833333 ------------------------------------------------------------------- */ derivadaFinaDelSeno (x) := derivadaFina (sin,x)$ /* --------------------------------------------------------------------- Cálculo de la raíz cuadrada ------------------------------------------------------------------- */ /* --------------------------------------------------------------------- Ejercicio 2. El método de Herón para calcular la raíz cuadrada de un número se basa en las siguientes propiedades: + Si y es una aproximación de la raíz cuadrada de x, entonces (y+x/y)/2 es una aproximación mejor. + El límite de la sucesión definida por x(0) = 1 x(n+1) = (x(n)+x/x(n))/2 es la raíz cuadrada de x. Definir, por iteración con unless, la función raiz tal que raiz(x) es la raíz cuadrada de x calculada usando la propiedad anterior. Por ejemplo, (%i8) raiz (9); (%o8) 3.000000001396984 ------------------------------------------------------------------- */ raiz (x) := block ([y:1], unless abs (y*y-x) < 0.00001 do y : 0.5*(y+x/y), y)$ /* --------------------------------------------------------------------- Ceros de una función ------------------------------------------------------------------- */ /* --------------------------------------------------------------------- Ejercicio 3. Los ceros de una función pueden calcularse mediante el método de Newton basándose en las siguientes propiedades: + Si b es una aproximación para el punto cero de f, entonces b-f(b)/f'(b) es una mejor aproximación. + el límite de la sucesión x(n) definida por x(0) = 1 x(n+1) = x(n)-f(x(n))/f'(x(n)) es un cero de f. Definir, por iteración con unless, la función puntoCero tal que puntoCero(f) es un cero de la función f calculado usando el método anterior. Por ejemplo, (%i9) puntoCero (cos); (%o9) 1.570796326794957 ------------------------------------------------------------------- */ puntoCero (f) := block ([b:1], unless abs (f(b)) < 0.00001 do b : b - f(b) / derivadaFina (f,b), float (b))$ /* --------------------------------------------------------------------- Funciones inversas ------------------------------------------------------------------- */ /* --------------------------------------------------------------------- Ejercicio 4.1. En este ejercicio se usará la función puntoCero para definir la inversa de distintas funciones. Definir, usando puntoCero, la función raizCuadrada tal que raizCuadrada x es la raíz cuadrada de x. Por ejemplo, (%i10) raizCuadrada (9); (%o10) 3.000000002941184 ------------------------------------------------------------------ */ raizCuadrada (a) := block ( local (f), f (x) := x^2-a, puntoCero (f))$ /* --------------------------------------------------------------------- Ejercicio 4.2. Definir, usando puntoCero, la función raizCubica tal que raizCubica (x) es la raíz cúbica de x. Por ejemplo, (%i11) raizCubica (27); (%o11) 3.000000000019604 ------------------------------------------------------------------- */ raizCubica (a) := block ( local (f), f (x) := x^3-a, puntoCero (f))$ /* --------------------------------------------------------------------- Ejercicio 4.3. Definir, usando puntoCero, la función arcoseno tal que arcoseno(x) es el arcoseno de x. Por ejemplo, (%i12) arcoseno (1); (%o12) 1.566548942830657 ------------------------------------------------------------------ */ arcoseno (a) := block ( local (f), f (x) := sin (x) - a, puntoCero (f))$ /* --------------------------------------------------------------------- Ejercicio 4.4. Definir, usando puntoCero, la función arcocoseno tal que arcocoseno(x) es el arcoseno de x. Por ejemplo, (%i13) arcocoseno (0); (%o13) 1.570796326794957 ------------------------------------------------------------------ */ arcocoseno (a) := block ( local (f), f (x) := cos (x) - a, puntoCero (f))$ /* --------------------------------------------------------------------- Ejercicio 4.5. Definir, usando puntoCero, la función inversa tal que inversa(g,a) es el valor de la inversa de g en a Por ejemplo, (%i14) cuadrado (x) := x^2$ (%i15) inversa (cuadrado,9); (%o15) 3.000000002941184 (%i16) inversa (lambda ([x], x^2), 9); (%o16) 3.000000002941184 ------------------------------------------------------------------ */ inversa (g,a) := block ( local (f), f (x) := g (x) - a, puntoCero (f))$ /* --------------------------------------------------------------------- Ejercicio 4.6. Redefinir, usando inversa, las funciones raizCuadrada, raizCubica, arcoseno y arcocoseno. Por ejemplo, (%i17) raizCuadradaI (9); (%o17) 3.000000002941184 (%i18) raizCubicaI (9); (%o18) 2.080083824207376 (%i19) arcosenoI (1); (%o19) 1.566548942830657 (%i20) arcocosenoI (0); (%o20) 1.570796326794957 ------------------------------------------------------------------ */ raizCuadradaI (a) := inversa (lambda ([x], x^2), a)$ raizCubicaI (a) := inversa (lambda ([x], x^3), a)$ arcosenoI (a) := inversa (sin, a)$ arcocosenoI (a) := inversa (cos, a)$ |