Fix bug #1848: taytorat leaks internal gensyms from multivar expansions
[maxima.git] / doc / info / es / Numerical.es.texi
bloba7d7d9b66da61d49d382de19ecb45842c7e0ba26
1 @c English version 2011-08-21
2 @menu
3 * Introducción a la transformada rápida de Fourier::
4 * Funciones y variables para la transformada rápida de Fourier::
5 * Funciones para la resolución numérica de ecuaciones::
6 * Introducción a la resolución numérica de ecuaciones diferenciales::
7 * Funciones para la resolución numérica de ecuaciones diferenciales::
8 @end menu
10 @node Introducción a la transformada rápida de Fourier, Funciones y variables para la transformada rápida de Fourier, Métodos numéricos, Métodos numéricos
11 @section Introducción a la transformada rápida de Fourier
13 El paquete @code{fft} contiene funciones para el cálculo numérico (no simbólico)
14 de la transformada rápida de Fourier.
21 @node Funciones y variables para la transformada rápida de Fourier, Funciones para la resolución numérica de ecuaciones, Introducción a la transformada rápida de Fourier, Métodos numéricos
22 @section Funciones y variables para la transformada rápida de Fourier
24 @deffn {Función} polartorect (@var{magnitude_array}, @var{phase_array})
26 Transforma valores complejos de la forma @code{r %e^(%i t)} a la forma
27 @code{a + b %i}, siendo @var{r} el módulo y @var{t} la fase.
28 Ambos valores @var{r} y @var{t} son arrays unidimensionales cuyos
29 tamños son iguales a la misma potencia de dos.
31 Los valores originales de los arrays de entrada son reemplazados por
32 las partes real e imaginaria, @code{a} y @code{b}, de los correspondientes
33 números complejos. El resultado se calcula como
35 @example
36 a = r cos(t)
37 b = r sin(t)
38 @end example
40 @code{polartorect} es la función inversa de @code{recttopolar}.
42 Para utilizar esta función ejecútese antes @code{load(fft)}.
43 Véase también @code{fft}.
45 @end deffn
49 @deffn {Función} recttopolar (@var{real_array}, @var{imaginary_array})
51 Transforma valores complejos de la forma @code{a + b %i} a la forma
52 @code{r %e^(%i t)}, siendo @var{a} la parte real y @var{a} la imaginaria.
53 Ambos valores @var{a} y @var{b} son arrays unidimensionales cuyos
54 tamños son iguales a la misma potencia de dos.
56 Los valores originales de los arrays de entrada son reemplazados por
57 los módulos y las fases, @code{r} y @code{t}, de los correspondientes
58 números complejos. El resultado se calcula como
60 @example
61 r = sqrt(a^2 + b^2)
62 t = atan2(b, a)
63 @end example
65 El ángulo calculado pertence al rango de @code{-%pi} a @code{%pi}. 
67 @code{recttopolar} es la función inversa de @code{polartorect}.
69 Para utilizar esta función ejecútese antes @code{load(fft)}.
70 Véase también @code{fft}.
72 @end deffn
76 @deffn {Función} inverse_fft (@var{y})
78 Calcula la transformada inversa rápida de Fourier.
80 @var{y} es una lista o array (declarado o no) que contiene los datos a
81 transformar. El número de elementos debe ser una potencia de dos.
82 Los elementos deben ser números literales (enteros, racionales,
83 de punto flotante o decimales grandes), constantes simbólicas,
84 expresiones del tipo @code{a + b*%i}, siendo @code{a} y @code{b}
85 números literales, o constantes simbólicas.
87 La función @code{inverse_fft} devuelve un nuevo objeto del
88 mismo tipo que @var{y}, el cual no se ve modificado. Los
89 resultados se calculan siempre como decimales o expresiones @code{a + b*%i},
90 siendo @code{a} y @code{b} decimales.
92 La transformada inversa discreta de Fourier se define como se indica
93 a continuación. Si @code{x} es el resultado de la transformada inversa,
94 entonces para @code{j} entre 0 y @code{n - 1} se tiene
96 @example
97 x[j] = sum(y[k] exp(-2 %i %pi j k / n), k, 0, n - 1)
98 @end example
100 Para utilizar esta función ejecútese antes @code{load(fft)}.
102 Véanse también @code{fft} (transformada directa), @code{recttopolar} y @code{polartorect}.
104 Ejemplos:
106 Datos reales.
108 @c ===beg===
109 @c load (fft) $
110 @c fpprintprec : 4 $
111 @c L : [1, 2, 3, 4, -1, -2, -3, -4] $
112 @c L1 : inverse_fft (L);
113 @c L2 : fft (L1);
114 @c lmax (abs (L2 - L));
115 @c ===end===
116 @example
117 (%i1) load (fft) $
118 (%i2) fpprintprec : 4 $
119 (%i3) L : [1, 2, 3, 4, -1, -2, -3, -4] $
120 (%i4) L1 : inverse_fft (L);
121 (%o4) [0.0, 14.49 %i - .8284, 0.0, 2.485 %i + 4.828, 0.0, 
122                        4.828 - 2.485 %i, 0.0, - 14.49 %i - .8284]
123 (%i5) L2 : fft (L1);
124 (%o5) [1.0, 2.0 - 2.168L-19 %i, 3.0 - 7.525L-20 %i, 
125 4.0 - 4.256L-19 %i, - 1.0, 2.168L-19 %i - 2.0, 
126 7.525L-20 %i - 3.0, 4.256L-19 %i - 4.0]
127 (%i6) lmax (abs (L2 - L));
128 (%o6)                       3.545L-16
129 @end example
131 Datos complejos.
133 @c ===beg===
134 @c load (fft) $
135 @c fpprintprec : 4 $
136 @c L : [1, 1 + %i, 1 - %i, -1, -1, 1 - %i, 1 + %i, 1] $
137 @c L1 : inverse_fft (L);
138 @c L2 : fft (L1);
139 @c lmax (abs (L2 - L));
140 @c ===end===
141 @example
142 (%i1) load (fft) $
143 (%i2) fpprintprec : 4 $                 
144 (%i3) L : [1, 1 + %i, 1 - %i, -1, -1, 1 - %i, 1 + %i, 1] $
145 (%i4) L1 : inverse_fft (L);
146 (%o4) [4.0, 2.711L-19 %i + 4.0, 2.0 %i - 2.0, 
147 - 2.828 %i - 2.828, 0.0, 5.421L-20 %i + 4.0, - 2.0 %i - 2.0, 
148 2.828 %i + 2.828]
149 (%i5) L2 : fft (L1);
150 (%o5) [4.066E-20 %i + 1.0, 1.0 %i + 1.0, 1.0 - 1.0 %i, 
151 1.55L-19 %i - 1.0, - 4.066E-20 %i - 1.0, 1.0 - 1.0 %i, 
152 1.0 %i + 1.0, 1.0 - 7.368L-20 %i]
153 (%i6) lmax (abs (L2 - L));                    
154 (%o6)                       6.841L-17
155 @end example
157 @end deffn
159 @deffn {Función} fft (@var{x})
161 Calcula la transformada rápida compleja de Fourier.
163 @var{x} es una lista o array (declarado o no) que contiene los datos a
164 transformar. El número de elementos debe ser una potencia de dos.
165 Los elementos deben ser números literales (enteros, racionales,
166 de punto flotante o decimales grandes), constantes simbólicas,
167 expresiones del tipo @code{a + b*%i}, siendo @code{a} y @code{b}
168 números literales, o constantes simbólicas.
170 La función @code{fft} devuelve un nuevo objeto del
171 mismo tipo que @var{x}, el cual no se ve modificado. Los
172 resultados se calculan siempre como decimales o expresiones @code{a + b*%i},
173 siendo @code{a} y @code{b} decimales.
175 La transformada discreta de Fourier se define como se indica
176 a continuación. Si @code{y} es el resultado de la transformada inversa,
177 entonces para @code{k} entre 0 y @code{n - 1} se tiene
179 @example
180 y[k] = (1/n) sum(x[j] exp(+2 %i %pi j k / n), j, 0, n - 1)
181 @end example
183 Si los datos @var{x} son reales, los coeficientes reales @code{a} y @code{b}
184 se pueden calcular de manera que 
186 @example
187 x[j] = sum(a[k]*cos(2*%pi*j*k/n)+b[k]*sin(2*%pi*j*k/n), k, 0, n/2)
188 @end example
192 @example
193 a[0] = realpart (y[0])
194 b[0] = 0
195 @end example
197 y, para k entre 1 y n/2 - 1,
199 @example
200 a[k] = realpart (y[k] + y[n - k])
201 b[k] = imagpart (y[n - k] - y[k])
202 @end example
206 @example
207 a[n/2] = realpart (y[n/2])
208 b[n/2] = 0
209 @end example
211 Para utilizar esta función ejecútese antes @code{load(fft)}.
213 Véanse también @code{inverse_fft} (transformada inversa), @code{recttopolar} y @code{polartorect}.
215 Ejemplos:
217 Datos reales.
219 @c ===beg===
220 @c load (fft) $
221 @c fpprintprec : 4 $
222 @c L : [1, 2, 3, 4, -1, -2, -3, -4] $
223 @c L1 : fft (L);
224 @c L2 : inverse_fft (L1);
225 @c lmax (abs (L2 - L));
226 @c ===end===
227 @example
228 (%i1) load (fft) $
229 (%i2) fpprintprec : 4 $
230 (%i3) L : [1, 2, 3, 4, -1, -2, -3, -4] $
231 (%i4) L1 : fft (L);
232 (%o4) [0.0, - 1.811 %i - .1036, 0.0, .6036 - .3107 %i, 0.0, 
233                          .3107 %i + .6036, 0.0, 1.811 %i - .1036]
234 (%i5) L2 : inverse_fft (L1);
235 (%o5) [1.0, 2.168L-19 %i + 2.0, 7.525L-20 %i + 3.0, 
236 4.256L-19 %i + 4.0, - 1.0, - 2.168L-19 %i - 2.0, 
237 - 7.525L-20 %i - 3.0, - 4.256L-19 %i - 4.0]
238 (%i6) lmax (abs (L2 - L));
239 (%o6)                       3.545L-16
240 @end example
242 Datos complejos.
244 @c ===beg===
245 @c load (fft) $
246 @c fpprintprec : 4 $
247 @c L : [1, 1 + %i, 1 - %i, -1, -1, 1 - %i, 1 + %i, 1] $
248 @c L1 : fft (L);
249 @c L2 : inverse_fft (L1);
250 @c lmax (abs (L2 - L));
251 @c ===end===
252 @example
253 (%i1) load (fft) $
254 (%i2) fpprintprec : 4 $
255 (%i3) L : [1, 1 + %i, 1 - %i, -1, -1, 1 - %i, 1 + %i, 1] $
256 (%i4) L1 : fft (L);
257 (%o4) [0.5, .3536 %i + .3536, - 0.25 %i - 0.25, 
258 0.5 - 6.776L-21 %i, 0.0, - .3536 %i - .3536, 0.25 %i - 0.25, 
259 0.5 - 3.388L-20 %i]
260 (%i5) L2 : inverse_fft (L1);
261 (%o5) [1.0 - 4.066E-20 %i, 1.0 %i + 1.0, 1.0 - 1.0 %i, 
262 - 1.008L-19 %i - 1.0, 4.066E-20 %i - 1.0, 1.0 - 1.0 %i, 
263 1.0 %i + 1.0, 1.947L-20 %i + 1.0]
264 (%i6) lmax (abs (L2 - L));
265 (%o6)                       6.83L-17
266 @end example
268 Cálculo de los coeficientes del seno y coseno.
270 @c ===beg===
271 @c load (fft) $
272 @c fpprintprec : 4 $
273 @c L : [1, 2, 3, 4, 5, 6, 7, 8] $
274 @c n : length (L) $
275 @c x : make_array (any, n) $
276 @c fillarray (x, L) $
277 @c y : fft (x) $
278 @c a : make_array (any, n/2 + 1) $
279 @c b : make_array (any, n/2 + 1) $
280 @c a[0] : realpart (y[0]) $
281 @c b[0] : 0 $
282 @c for k : 1 thru n/2 - 1 do
283 @c    (a[k] : realpart (y[k] + y[n - k]),
284 @c     b[k] : imagpart (y[n - k] - y[k]));
285 @c a[n/2] : y[n/2] $
286 @c b[n/2] : 0 $
287 @c listarray (a);
288 @c listarray (b);
289 @c f(j) := sum (a[k] * cos (2*%pi*j*k / n) + b[k] * sin (2*%pi*j*k / n), k, 0, n/2) $
290 @c makelist (float (f (j)), j, 0, n - 1);
291 @c ===end===
292 @example
293 (%i1) load (fft) $
294 (%i2) fpprintprec : 4 $
295 (%i3) L : [1, 2, 3, 4, 5, 6, 7, 8] $
296 (%i4) n : length (L) $
297 (%i5) x : make_array (any, n) $
298 (%i6) fillarray (x, L) $
299 (%i7) y : fft (x) $
300 (%i8) a : make_array (any, n/2 + 1) $
301 (%i9) b : make_array (any, n/2 + 1) $
302 (%i10) a[0] : realpart (y[0]) $
303 (%i11) b[0] : 0 $
304 (%i12) for k : 1 thru n/2 - 1 do
305    (a[k] : realpart (y[k] + y[n - k]),
306     b[k] : imagpart (y[n - k] - y[k]));
307 (%o12)                        done
308 (%i13) a[n/2] : y[n/2] $
309 (%i14) b[n/2] : 0 $
310 (%i15) listarray (a);
311 (%o15)          [4.5, - 1.0, - 1.0, - 1.0, - 0.5]
312 (%i16) listarray (b);
313 (%o16)           [0, - 2.414, - 1.0, - .4142, 0]
314 (%i17) f(j) := sum (a[k] * cos (2*%pi*j*k / n) + b[k] * sin (2*%pi*j*k / n), k, 0, n/2) $
315 (%i18) makelist (float (f (j)), j, 0, n - 1);
316 (%o18)      [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]
317 @end example
319 @end deffn
330 @node Funciones para la resolución numérica de ecuaciones, Introducción a la resolución numérica de ecuaciones diferenciales, Funciones y variables para la transformada rápida de Fourier, Métodos numéricos
331 @section Funciones para la resolución numérica de ecuaciones
335 @deffn {Función} horner (@var{expr}, @var{x})
336 @deffnx {Función} horner (@var{expr})
337 Cambia el formato de @var{expr} según la regla de Horner utilizando @var{x} como variable principal, si ésta se especifica. El argumento @code{x} se puede omitir, en cuyo caso se considerará como variable principal la de @var{expr} en su formato racional canónico (CRE).
339 La función @code{horner} puede mejorar las estabilidad si @code{expr} va a ser numéricamente evaluada. También es útil si Maxima se utiliza para generar programas que serán ejecutados en Fortran. Véase también @code{stringout}.
341 @example
342 (%i1) expr: 1e-155*x^2 - 5.5*x + 5.2e155;
343                            2
344 (%o1)            1.0E-155 x  - 5.5 x + 5.2E+155
345 (%i2) expr2: horner (%, x), keepfloat: true;
346 (%o2)            (1.0E-155 x - 5.5) x + 5.2E+155
347 (%i3) ev (expr, x=1e155);
348 Maxima encountered a Lisp error:
350  floating point overflow
352 Automatically continuing.
353 To reenable the Lisp debugger set *debugger-hook* to nil.
354 (%i4) ev (expr2, x=1e155);
355 (%o4)                       7.0E+154
356 @end example
358 @end deffn
361 @deffn {Función} find_root (@var{expr}, @var{x}, @var{a}, @var{b}, [@var{abserr}, @var{relerr}])
362 @deffnx {Función} find_root (@var{f}, @var{a}, @var{b}, [@var{abserr}, @var{relerr}])
363 @deffnx {Función} bf_find_root (@var{expr}, @var{x}, @var{a}, @var{b}, [@var{abserr}, @var{relerr}])
364 @deffnx {Función} bf_find_root (@var{f}, @var{a}, @var{b}, [@var{abserr}, @var{relerr}])
365 @deffnx {Variable opcional} find_root_error
366 @deffnx {Variable opcional} find_root_abs
367 @deffnx {Variable opcional} find_root_rel
369 Calcula una raíz de la expresión @var{expr} o de
370 la función @var{f} en el intervalo cerrado @math{[@var{a}, @var{b}]}.
371 La expresión @var{expr} puede ser una ecuación, en cuyo caso 
372 @code{find_root} busca una raíz de
373 @code{lhs(@var{expr}) - rhs(@var{expr})}.
375 Dado que Maxima puede evaluar @var{expr} o @var{f} en 
376 @math{[@var{a}, @var{b}]}, entonces, si @var{expr} o @var{f} es
377 continua, @code{find_root} encuentrará la raíz
378 buscada, o raíces, en caso de existir varias.
380 La función @code{find_root} aplica al principio la
381 búsqueda por bipartición. Si la expresión es lo suficientemente
382 suave, entonces @code{find_root} aplicará el método
383 de interpolación lineal.
385 @code{bf_find_root} es una versión de @code{find_root} para números
386 reales de precisión arbitraria (bigfloat). La función se 
387 evalúa utilizando la aritmética de estos números, devolviendo
388 un resultado numérico de este tipo. En cualquier otro aspecto,
389 @code{bf_find_root} es idéntica a @code{find_root}, siendo la
390 explicación que sigue igualmente válida para @code{bf_find_root}. 
392 La precisión de @code{find_root} está controlada por @code{abserr} y
393 @code{relerr}, que son claves opcionales para @code{find_root}. 
394 Estas claves toman la forma @code{key=val}. Las claves disponibles son:
396 @table @code
397 @item abserr
398 Error absoluto deseado de la función en la raíz. El
399 valor por defecto es @code{find_root_abs}. 
400 @item relerr
401 Error relativo deseado de la raíz. El valor por defecto
402 es @code{find_root_rel}.
403 @end table
405 @code{find_root} se detiene cuando la función alcanza un valor menor o
406 igual que @code{abserr}, o si las sucesivas aproximaciones @var{x_0}, @var{x_1}
407 difieren en no más que @code{relerr * max(abs(x_0), abs(x_1))}. Los
408 valores por defecto de @code{find_root_abs} y @code{find_root_rel} son
409 ambos cero.
411 @code{find_root} espera que la función en cuestión tenga signos
412 diferentes en los extremos del intervalo.
413 Si la función toma valores numéricos en ambos extremos y estos
414 números son del mismo signo, entonces
415 el comportamiento de @code{find_root} se controla con @code{find_root_error}.
416 Cuando @code{find_root_error} vale @code{true}, @code{find_root}
417 devuelve un mensaje de error; en caso contrario, @code{find_root}
418 devuelve el valor de @code{find_root_error}. El valor por defecto
419 de @code{find_root_error} es @code{true}.
421 Si en algún momento del proceso de búsqueda @var{f} alcanza un valor
422 no numérico, @code{find_root} devuelve una expresión parcialmente evaluada.
424 Se ignora el orden de @var{a} y @var{b}; la región de búsqueda es
425 @math{[min(@var{a}, @var{b}), max(@var{a}, @var{b})]}.
427 Ejemplos:
428 @c PREVIOUS EXAMPLE STUFF -- MAY WANT TO BRING TRANSLATE BACK INTO THE EXAMPLE
429 @c f(x):=(mode_declare(x,float),sin(x)-x/2.0);
430 @c interpolate(sin(x)-x/2,x,0.1,%pi)       time= 60 msec
431 @c interpolate(f(x),x,0.1,%pi);            time= 68 msec
432 @c translate(f);
433 @c interpolate(f(x),x,0.1,%pi);            time= 26 msec
434 @c interpolate(f,0.1,%pi);                 time=  5 msec
436 @c ===beg===
437 @c f(x) := sin(x) - x/2;
438 @c find_root (sin(x) - x/2, x, 0.1, %pi);
439 @c find_root (sin(x) = x/2, x, 0.1, %pi);
440 @c find_root (f(x), x, 0.1, %pi);
441 @c find_root (f, 0.1, %pi);
442 @c find_root (exp(x) = y, x, 0, 100);
443 @c find_root (exp(x) = y, x, 0, 100), y = 10;
444 @c log (10.0);
445 @c fpprec:32;
446 @c 32;
447 @c bf_find_root (exp(x) = y, x, 0, 100), y = 10;
448 @c log(10b0);
449 @c ===end===
450 @example
451 (%i1) f(x) := sin(x) - x/2;
452                                         x
453 (%o1)                  f(x) := sin(x) - -
454                                         2
455 (%i2) find_root (sin(x) - x/2, x, 0.1, %pi);
456 (%o2)                   1.895494267033981
457 (%i3) find_root (sin(x) = x/2, x, 0.1, %pi);
458 (%o3)                   1.895494267033981
459 (%i4) find_root (f(x), x, 0.1, %pi);
460 (%o4)                   1.895494267033981
461 (%i5) find_root (f, 0.1, %pi);
462 (%o5)                   1.895494267033981
463 (%i6) find_root (exp(x) = y, x, 0, 100);
464                             x
465 (%o6)           find_root(%e  = y, x, 0.0, 100.0)
466 (%i7) find_root (exp(x) = y, x, 0, 100), y = 10;
467 (%o7)                   2.302585092994046
468 (%i8) log (10.0);
469 (%o8)                   2.302585092994046
470 (%i9) fpprec:32;
471 (%o9)                           32
472 (%i10) bf_find_root (exp(x) = y, x, 0, 100), y = 10;
473 (%o10)                  2.3025850929940456840179914546844b0
474 (%i11) log(10b0);
475 (%o11)                  2.3025850929940456840179914546844b0
476 @end example
478 @end deffn
482 @deffn {Función} newton (@var{expr}, @var{x}, @var{x_0}, @var{eps})
483 Devuelve una solución aproximada de @code{@var{expr} = 0} obtenida
484 por el método de Newton, considerando @var{expr} como una función
485 de una variable, @var{x}.
486 La búsqueda comienza con @code{@var{x} = @var{x_0}} y continúa
487 hasta que se verifique @code{abs(@var{expr}) < @var{eps}}, donde
488 @var{expr} se evalúa con el valor actual de @var{x}.
490 La función @code{newton} permite que en @var{expr} haya variables
491 no definidas, siempre y cuando la condición de terminación
492 @code{abs(@var{expr}) < @var{eps}} pueda reducirse a un valor
493 lógico @code{true} o @code{false}; de este modo, no es necesario
494 que @var{expr} tome un valor numérico.
496 Ejecútese @code{load(newton1)} para cargar esta función.
498 Véanse también @code{realroots}, @code{allroots}, @code{find_root} y @code{mnewton}.
500 Ejemplos:
502 @c ===beg===
503 @c load (newton1);
504 @c newton (cos (u), u, 1, 1/100);
505 @c ev (cos (u), u = %);
506 @c assume (a > 0);
507 @c newton (x^2 - a^2, x, a/2, a^2/100);
508 @c ev (x^2 - a^2, x = %);
509 @c ===end===
510 @example
511 (%i1) load (newton1);
512 (%o1) /usr/share/maxima/5.10.0cvs/share/numeric/newton1.mac
513 (%i2) newton (cos (u), u, 1, 1/100);
514 (%o2)                   1.570675277161251
515 (%i3) ev (cos (u), u = %);
516 (%o3)                 1.2104963335033528E-4
517 (%i4) assume (a > 0);
518 (%o4)                        [a > 0]
519 (%i5) newton (x^2 - a^2, x, a/2, a^2/100);
520 (%o5)                  1.00030487804878 a
521 (%i6) ev (x^2 - a^2, x = %);
522                                            2
523 (%o6)                6.098490481853958E-4 a
524 @end example
526 @end deffn
534 @node Introducción a la resolución numérica de ecuaciones diferenciales, Funciones para la resolución numérica de ecuaciones diferenciales, Funciones para la resolución numérica de ecuaciones, Métodos numéricos
535 @section Introducción a la resolución numérica de ecuaciones diferenciales
537 Las ecuaciones diferenciales ordinarias (EDO) que se resuelven con las funciones de esta
538 sección deben tener la forma
539 @ifnottex
540 @example
541        dy
542        -- = F(x,y)
543        dx
544 @end example
545 @end ifnottex
546 @tex
547 $${{dy}\over{dx}} = F(x,y)$$
548 @end tex
549 la cual es una EDO de primer orden. Las ecuaciones diferenciales de orden 
550 @var{n} deben escribirse como un sistema de @var{n} ecuaciones de primer
551 orden del tipo anterior. Por ejemplo, una EDO de segundo orden debe escribirse
552 como un sistema de dos ecuaciones,
553 @ifnottex
554 @example
555        dx               dy
556        -- = G(x,y,t)    -- = F(x,y,t) 
557        dt               dt
558 @end example
559 @end ifnottex
560 @tex
561 $${{dx}\over{dt}} = G(x,y,t) \qquad {{dy}\over{dt}} = F(x,y,t)$$
562 @end tex
564 El primer argumento de las funciones debe ser una lista con las expresiones
565 de los miembros derechos de las EDOs. Las variables cuyas derivadas se representan
566 por las expresiones anteriores deben darse en una segunda lista. En el caso antes
567 citado, las variables son @var{x} y @var{y}. La variable independiente, @var{t}
568 en los mismos ejemplos anteriores, pueden darse mediante una opción adicional. 
569 Si las expresiones dadas no dependen de esa variable independiente, el sistema
570 recibe el nombre de autónomo.
578 @node Funciones para la resolución numérica de ecuaciones diferenciales, , Introducción a la resolución numérica de ecuaciones diferenciales, Métodos numéricos
579 @section Funciones para la resolución numérica de ecuaciones diferenciales
583 @deffn {Función} plotdf (@var{dydx}, ...options...)
584 @deffnx {Función} plotdf (@var{dvdu}, @code{[}@var{u},@var{v}@code{]}, ...options...)
585 @deffnx {Función} plotdf (@code{[}@var{dxdt},@var{dydt}@code{]}, ...options...)
586 @deffnx {Función} plotdf (@code{[}@var{dudt},@var{dvdt}@code{]}, @code{[}@var{u},@var{v}@code{]}, ...options...)
587 Dibuja un campo de direcciones en dos dimensiones @var{x} y @var{y}.
589 @var{dydx}, @var{dxdt} y @var{dydt} son expresiones que dependen de @var{x} y
590 @var{y}. Además de esas dos variables, las dos expresiones pueden depender de
591 un conjunto de parámetros, con valores numéricos que son dados por medio
592 de la opción @code{parameters} (la sintaxis de esa opción se explica mas al
593 frente), o con un rango de posibles valores definidos con la opción
594 @var{sliders}.
596 Varias otras opciones se pueden incluir dentro del comando, o
597 seleccionadas en el menú.  Haciendo click en un punto del gráfico se
598 puede hacer que sea dibujada la curva integral que pasa por ese punto;
599 lo mismo puede ser hecho dando las coordenadas del punto con la opción
600 @code{trajectory_at} dentro del comando plotdf. La dirección de
601 integración se puede controlar con la opción @code{direction}, que
602 acepta valores de @emph{forward}, @emph{backward} ou @emph{both}. El
603 número de pasos realizado en la integración numérica se controla
604 con la opción @code{nsteps} y el incremento del tiempo en cada paso
605 con la opción @code{tstep}. Se usa el método de Adams Moulton para
606 hacer la integración numérica; también es posible cambiar para el
607 método de Runge-Kutta de cuarto orden con ajuste de pasos.
609 @b{Menú de la ventana del gráfico:}
611 El menú de la ventana gráfica dispone de las siguientes opciones:
612 @emph{Zoom}, que permite cambiar el comportamiento del ratón, de
613 manera que hará posible el hacer zoom en la región del gráfico
614 haciendo clic con el botón izquierdo. Cada clic agranda la imagen
615 manteniendo como centro de la misma el punto sobre el cual se ha hecho
616 clic. Manteniendo pulsada la tecla @key{Shift} mientras se hace clic,
617 retrocede al tamaño anterior. Para reanudar el cálculo de las
618 trayectorias cuando se hace clic, seleccine la opción @emph{Integrate}
619 del menú.
621 La opción @emph{Config} del menú se puede utilizar para cambiar
622 la(s) EDO(S) y algunos otros ajustes. Después de hacer los cambios, se
623 debe utilizar la opción @emph{Replot} para activar los nuevos ajustes.
624 Si en el campo @emph{Trajectory at} del menú de diálogo de
625 @emph{Config} se introducen un par de coordenadas y luego se pulsa la
626 tecla @key{retorno}, se mostrará una nueva curva integral, además de
627 las ya dibujadas.  Si se selecciona la opción @emph{Replot}, sólo se
628 mostrará la última curva integral seleccionada.
630 Manteniendo pulsado el botón derecho del ratón mientras se mueve el
631 cursor, se puede arrastrar el gráfico horizontal y verticalmente.
632 Otros parámetros, como pueden ser el número de pasos, el valor
633 inicial de @var{t}, las coordenadas del centro y el radio, pueden
634 cambiarse en el submenú de la opción @emph{Config}.
636 Con la opción @emph{Save}, se puede obtener una copia del gráfico en
637 una impresora Postscript o guardarlo en un fichero Postscript. Para
638 optar entre la impresión o guardar en fichero, se debe seleccionar
639 @emph{Print Options} en la ventana de diálogo de @emph{Config}. Una
640 vez cubiertos los campos de la ventana de diálogo de @emph{Save},
641 será necesario seleccionar la opción @emph{Save} del primer menú
642 para crear el fichero o imprimir el gráfico.
644 @b{Opciones gráficas:}
646 La función @code{plotdf} admite varias opciones, cada una de las cuales
647 es una lista de dos o más elementos. El primer elemento es el nombre de
648 la opción, y el resto está formado por el valor o valores asignados
649 a dicha opción.
651 La función @code{plotdf} reconoce las siguientes opciones:
653 @itemize @bullet
654 @item
655 @dfn{tstep} establece la amplitud de los incrementos en la
656 variable independiente @var{t}, utilizados para calcular la curva
657 integral. Si se aporta sólo una expresión @var{dydx}, la variable
658 @var{x} será directamente proporcional a @var{t}.
659 El valor por defecto es 0.1.
661 @item
662 @dfn{nsteps} establece el número de pasos de longitud
663 @code{tstep} que se utilizarán en la variable independiente para
664 calcular la curva integral.
665 El valor por defecto es 100.
667 @item
668 @dfn{direction} establece la dirección de la variable
669 independiente que será seguida para calcular una curva integral.
670 Valores posibles son: @code{forward}, para hacer que la variable
671 independiente aumente @code{nsteps} veces, con incrementos @code{tstep};
672 @code{backward}, para hacer que la variable independiente
673 disminuya; @code{both}, para extender la curva integral @code{nsteps}
674 pasos hacia adelante y @code{nsteps} pasos hacia atrás.
675 Las palabras @code{right} y @code{left} se pueden utilizar como
676 sinónimos de @code{forward} y @code{backward}.
677 El valor por defecto es @code{both}.
679 @item
680 @dfn{tinitial} establece el valor inicial de la variable
681 @var{t} utilizado para calcular curvas integrales. Puesto que las
682 ecuaciones diferenciales son autónomas, esta opción sólo
683 aparecerá en los gráficos de las curvas como funciones de @var{t}.
684 El valor por defecto es 0.
686 @item
687 @dfn{versus_t} se utiliza para crear una segunda ventana
688 gráfica, con el gráfico de una curva integral, como dos funciones
689 @var{x}, @var{y}, de variable independiente @var{t}. Si se le da a
690 @code{versus_t} cualquier valor diferente de 0, se mostrará la
691 segunda ventana gráfica, la cual incluye otro menú, similar
692 al de la ventana principal.
693 El valor por defecto es 0.
695 @item
696 @dfn{trajectory_at} establece las coordenadas @var{xinitial}
697 y @var{yinitial} para el extremo inicial de la curva integral.
698 No tiene asignado valor por defecto.
700 @item
701 @dfn{parameters} establece una lista de parámetros,
702 junto con sus valores numéricos, que son utilizados en la
703 definición de la ecuación diferencial. Los nombres de los
704 parámetros y sus valores deben escribirse en formato de cadena
705 de caracteres como una secuencia de pares @code{nombre=valor}
706 separados por comas.
708 @item
709 @dfn{sliders} establece una lista de parámetros que
710 se cambiarán interactivamente utilizando barras de deslizamiento,
711 así como los rangos de variación de dichos parámetros.
712 Los nombres de los parámetros y sus rangos deben escribirse en formato
713 de cadena de caracteres como una secuencia de pares @code{nombre=min:max}
714 separados por comas.
716 @item
717 @dfn{xfun} establece una cadena de caracteres con funciones
718 de @var{x} separadas por puntos y comas para ser representadas por
719 encima del campo de direcciones. Estas funciones serán interpretadas
720 por Tcl, no por Maxima.
722 @item
723 @dfn{xradius} es la mitad de la longitud del rango de valores
724 a representar en la dirección x.
725 El valor por defecto es 10.
727 @item
728 @dfn{yradius} es la mitad de la longitud del rango de valores
729 a representar en la dirección y.
730 El valor por defecto es 10.
732 @item
733 @dfn{xcenter} es la coordenada x del punto situado en el centro
734 del gráfico.
735 El valor por defecto es 0.
737 @item
738 @dfn{ycenter} es la coordenada y del punto situado en el centro
739 del gráfico.
740 El valor por defecto es 0.
742 @item
743 @dfn{width} establece el ancho de la ventana gráfica en
744 píxeles.
745 El valor por defecto es 500.
747 @item
748 @dfn{height} establece la altura de la ventana gráfica en
749 píxeles.
750 El valor por defecto es 500.
752 @end itemize
754 @b{Ejemplos:}
756 NOTA: Dependiendo de la interface que se use para Maxima, las funciones
757 que usan @code{openmath}, incluida @code{plotdf}, pueden desencadenar un
758 fallo si terminan en punto y coma, en vez del símbolo de
759 dólar. Para evitar problemas, se usará el símbolo de
760 dólar en todos ejemplos.
762 @itemize @bullet
763 @item
764 Para mostrar el campo de direcciones de la ecuación diferencial
765 @math{y' = exp(-x) + y} y la solución que pasa por @math{(2, -0.1)}:
766 @example
767 (%i1) load("plotdf")$
769 (%i2) plotdf(exp(-x)+y,[trajectory_at,2,-0.1]);
770 @end example
772 @ifnotinfo
773 @image{@value{figuresfolder}/plotdf1,8cm}
774 @end ifnotinfo
776 @item
777 Para mostrar el campo de direcciones de la ecuación 
778 @math{diff(y,x) = x - y^2} y la solución de condición
779 inicial @math{y(-1) = 3}, se puede utilizar la sentencia:
780 @example
781 (%i3) plotdf(x-y^2,[xfun,"sqrt(x);-sqrt(x)"],
782           [trajectory_at,-1,3], [direction,forward],
783           [yradius,5],[xcenter,6]);
784 @end example
785 El gráfico también muestra la función @math{y = sqrt(x)}.
787 @ifnotinfo
788 @image{@value{figuresfolder}/plotdf2,8cm}
789 @end ifnotinfo
791 @item
792 El siguiente ejemplo muestra el campo de direcciones de un oscilador
793 armónico, definido por las ecuaciones @math{dx/dt = y} y
794 @math{dy/dt = -k*x/m}, y la curva integral que pasa por
795 @math{(x,y) = (6,0)}, con una barra de deslizamiento que 
796 permitirá cambiar el valor de @math{m} interactivamente
797 (@math{k} permanece fijo a 2):
798 @example
799 (%i4) plotdf([y,-k*x/m],[parameters,"m=2,k=2"],
800             [sliders,"m=1:5"], [trajectory_at,6,0]);
801 @end example
803 @ifnotinfo
804 @image{@value{figuresfolder}/plotdf3,8cm}
805 @end ifnotinfo
807 @item
808 Para representar el campo de direcciones de la ecuación de
809 Duffing, @math{m*x''+c*x'+k*x+b*x^3 = 0}, se introduce la
810 variable @math{y=x'} y se hace:
811 @example
812 (%i5) plotdf([y,-(k*x + c*y + b*x^3)/m],
813               [parameters,"k=-1,m=1.0,c=0,b=1"],
814               [sliders,"k=-2:2,m=-1:1"],[tstep,0.1]);
815 @end example
817 @ifnotinfo
818 @image{@value{figuresfolder}/plotdf4,8cm}
819 @end ifnotinfo
821 @item
822 El campo de direcciones de un péndulo amortiguado,
823 incluyendo la solución para condiciones iniciales dadas,
824 con una barra de deslizamiento que se puede utilizar para
825 cambiar el valor de la masa, @math{m}, y con el gráfico
826 de las dos variables de estado como funciones del tiempo:
828 @example
829 (%i6) plotdf([y,-g*sin(x)/l - b*y/m/l],
830          [parameters,"g=9.8,l=0.5,m=0.3,b=0.05"],
831          [trajectory_at,1.05,-9],[tstep,0.01],
832          [xradius,6],[yradius,14],
833          [xcenter,-4],[direction,forward],[nsteps,300],
834          [sliders,"m=0.1:1"], [versus_t,1]);
835 @end example
837 @ifnotinfo
838 @image{@value{figuresfolder}/plotdf5,8cm}@image{@value{figuresfolder}/plotdf6,8cm}
839 @end ifnotinfo
841 @end itemize
843 @end deffn
847 @deffn {Función} ploteq (@var{exp}, ...options...)
849 Dibuja curvas equipotenciales para @var{exp}, que debe ser una expresión
850 dependiente de dos variables. Las curvas se obtienen integrando la ecuación
851 diferencial que define las trayectorias ortogonales a las soluciones del 
852 sistema autónomo que se obtiene del gradiente de la expresión dada.
853 El dibujo también puede mostrar las curvas integrales de ese sistema
854 de gradientes (opción @code{fieldlines}).
856 Este programa también necesita Xmaxima, incluso si se ejecuta Maxima desde
857 una consola, pues el dibujo se creará por el código Tk de Xmaxima.
858 Por defecto, la región dibujada estará vacía hasta que el
859 usuario haga clic en un punto, dé sus coordenadas a través del menú o
860 mediante la opción @code{trajectory_at}.
862 La mayor parte de opciones aceptadas por @code{plotdf} se pueden utilizar
863 también con @code{ploteq} y el aspecto del interfaz es el mismo que el
864 descrito para @code{plotdf}.
866 Ejemplo:
868 @c ===beg===
869 @c V: 900/((x+1)^2+y^2)^(1/2)-900/((x-1)^2+y^2)^(1/2)$
870 @c ploteq(V,[x,-2,2],[y,-2,2],[fieldlines,"blue"])$
871 @c ===end===
872 @example
873 (%i1) V: 900/((x+1)^2+y^2)^(1/2)-900/((x-1)^2+y^2)^(1/2)$
874 (%i2) ploteq(V,[x,-2,2],[y,-2,2],[fieldlines,"blue"])$
875 @end example
877 Haciendo clic sobre un punto se dibujará la curva equipotencial que pasa por
878 ese punto (en rojo) y la trayectoria ortogonal (en azul).
880 @end deffn
884 @deffn {Función} rk (@var{ODE}, @var{var}, @var{initial}, @var{dominio})
885 @deffnx {Función} rk ([@var{ODE1},...,@var{ODEm}], [@var{v1},...,@var{vm}], [@var{init1},...,@var{initm}], @var{dominio})
887 La primera forma se usa para resolver numéricamente una ecuación
888 diferencial ordinaria de primer orden (EDO), y la segunda forma resuelve
889 numéricamente un sistema de @var{m} de esas ecuaciones, usando el método
890 de Runge-Kutta de cuarto orden. @var{var} representa la variable dependiente.
891 EDO debe ser una expresión que dependa únicamente de las variables
892 independiente y dependente, y define la derivada de la variable dependiente
893 en función de la variable independiente.
895 La variable independiente se representa con @var{dominio}, que debe ser
896 una lista con cuatro elementos, como por ejemplo:
897 @example
898 [t, 0, 10, 0.1]
899 @end example
900 el primer elemento de la lista identifica la variable independiente, el
901 segundo y tercer elementos son los valores inicial y final para esa
902 variable, y el último elemento da el valor de los incrementos que
903 deberán ser usados dentro de ese intervalo.
905 Si se van a resolver @var{m} ecuaciones, deberá haber @var{m}
906 variables dependientes @var{v1}, @var{v2}, ..., @var{vm}. Los valores
907 iniciales para esas variables serán @var{inic1},
908 @var{inic2}, ..., @var{inicm}. Continuará existiendo apenas una
909 variable independiente definida por la lista @var{domain}, como en
910 el caso anterior. @var{EDO1}, ..., @var{EDOm} son las expresiones que
911 definen las derivadas de cada una de las variables dependientes en
912 función de la variable independiente. Las únicas variables que
913 pueden aparecer en cada una de esas expresiones son la variable
914 independiente y cualquiera de las variables dependientes. Es importante
915 que las derivadas @var{EDO1}, ..., @var{EDOm} sean colocadas en la lista
916 en el mismo orden en que fueron agrupadas las variables dependientes;
917 por ejemplo, el tercer elemento de la lista será interpretado como la
918 derivada de la tercera variable dependiente.
920 El programa intenta integrar las ecuaciones desde el valor inicial de la
921 variable independiente, hasta el valor final, usando incrementos
922 fijos. Si en algún paso una de las variables dependientes toma un
923 valor absoluto muy grande, la integración será suspendida en ese
924 punto.  El resultado será una lista con un número de elementos igual
925 al número de iteraciones realizadas. Cada elemento en la lista de
926 resultados es también una lista con @var{m}+1 elementos: el valor de
927 la variable independiente, seguido de los valores de las variables
928 dependientes correspondientes a ese punto.
930 @end deffn