142
142
<body lang="es" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
145
<a name="SEC214"></a>
144
<a name="interpol"></a>
145
<a name="SEC220"></a>
146
146
<table cellpadding="1" cellspacing="1" border="0">
147
<tr><td valign="middle" align="left">[<a href="maxima_55.html#SEC213" title="Previous section in reading order"> < </a>]</td>
148
<td valign="middle" align="left">[<a href="#SEC215" title="Next section in reading order"> > </a>]</td>
147
<tr><td valign="middle" align="left">[<a href="maxima_55.html#SEC219" title="Previous section in reading order"> < </a>]</td>
148
<td valign="middle" align="left">[<a href="#SEC221" title="Next section in reading order"> > </a>]</td>
149
149
<td valign="middle" align="left"> </td>
150
<td valign="middle" align="left">[<a href="maxima_55.html#SEC211" title="Beginning of this chapter or previous chapter"> << </a>]</td>
150
<td valign="middle" align="left">[<a href="maxima_55.html#SEC218" title="Beginning of this chapter or previous chapter"> << </a>]</td>
151
151
<td valign="middle" align="left">[<a href="maxima.html#SEC_Top" title="Up section"> Up </a>]</td>
152
<td valign="middle" align="left">[<a href="maxima_57.html#SEC217" title="Next chapter"> >> </a>]</td>
152
<td valign="middle" align="left">[<a href="maxima_57.html#SEC223" title="Next chapter"> >> </a>]</td>
153
153
<td valign="middle" align="left"> </td>
154
154
<td valign="middle" align="left"> </td>
155
155
<td valign="middle" align="left"> </td>
156
156
<td valign="middle" align="left"> </td>
157
157
<td valign="middle" align="left">[<a href="maxima.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
158
158
<td valign="middle" align="left">[<a href="maxima_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
159
<td valign="middle" align="left">[<a href="maxima_76.html#SEC287" title="Index">Index</a>]</td>
159
<td valign="middle" align="left">[<a href="maxima_78.html#SEC302" title="Index">Index</a>]</td>
160
160
<td valign="middle" align="left">[<a href="maxima_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
162
<h1 class="chapter"> 56. lbfgs </h1>
162
<h1 class="chapter"> 56. interpol </h1>
164
164
<table class="menu" border="0" cellspacing="0">
165
<tr><td align="left" valign="top"><a href="#SEC215">56.1 Introducción a lbfgs</a></td><td> </td><td align="left" valign="top">
165
<tr><td align="left" valign="top"><a href="#SEC221">56.1 Introducción a interpol</a></td><td> </td><td align="left" valign="top">
167
<tr><td align="left" valign="top"><a href="#SEC216">56.2 Funciones y variables para lbfgs</a></td><td> </td><td align="left" valign="top">
167
<tr><td align="left" valign="top"><a href="#SEC222">56.2 Funciones y variables para interpol</a></td><td> </td><td align="left" valign="top">
172
<a name="Introducci_00f3n-a-lbfgs"></a>
173
<a name="SEC215"></a>
174
<table cellpadding="1" cellspacing="1" border="0">
175
<tr><td valign="middle" align="left">[<a href="#SEC214" title="Previous section in reading order"> < </a>]</td>
176
<td valign="middle" align="left">[<a href="#SEC216" title="Next section in reading order"> > </a>]</td>
177
<td valign="middle" align="left"> </td>
178
<td valign="middle" align="left">[<a href="#SEC214" title="Beginning of this chapter or previous chapter"> << </a>]</td>
179
<td valign="middle" align="left">[<a href="#SEC214" title="Up section"> Up </a>]</td>
180
<td valign="middle" align="left">[<a href="maxima_57.html#SEC217" title="Next chapter"> >> </a>]</td>
181
<td valign="middle" align="left"> </td>
182
<td valign="middle" align="left"> </td>
183
<td valign="middle" align="left"> </td>
184
<td valign="middle" align="left"> </td>
185
<td valign="middle" align="left">[<a href="maxima.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
186
<td valign="middle" align="left">[<a href="maxima_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
187
<td valign="middle" align="left">[<a href="maxima_76.html#SEC287" title="Index">Index</a>]</td>
188
<td valign="middle" align="left">[<a href="maxima_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
190
<h2 class="section"> 56.1 Introducción a lbfgs </h2>
192
<p>La función <code>lbfgs</code> implementa el llamado algoritmo L-BFGS [1]
193
para resolver problemas de minimización sin restricciones mediante una
194
técnica <i>cuasi-Newton con memoria limitada</i> (BFGS). El término
195
memoria limitada procede del hecho de que se almacena una aproximación
196
de rango bajo de la inversa de la matriz hessiana, en lugar de la matriz
197
completa. El programa fue originalmente escrito en Fortran [2] por
198
Jorge Nocedal, incorporando algunas funciones escritas originalmente
199
por Jorge J. Moré y David J. Thuente, traducidas posteriormente a Lisp
200
automáticamente con el programa <code>f2cl</code>. El paquete <code>lbfgs</code>
201
contiene el código traducido, junto con una función interfaz que para
202
controlar ciertos detalles.
207
<p>[1] D. Liu and J. Nocedal. "On the limited memory BFGS method for large
208
scale optimization". <i>Mathematical Programming B</i> 45:503-528 (1989)
210
<p>[2] <a href="http://netlib.org/opt/lbfgs_um.shar">http://netlib.org/opt/lbfgs_um.shar</a>
213
<a name="Funciones-y-variables-para-lbfgs"></a>
214
<a name="SEC216"></a>
215
<table cellpadding="1" cellspacing="1" border="0">
216
<tr><td valign="middle" align="left">[<a href="#SEC215" title="Previous section in reading order"> < </a>]</td>
217
<td valign="middle" align="left">[<a href="maxima_57.html#SEC217" title="Next section in reading order"> > </a>]</td>
218
<td valign="middle" align="left"> </td>
219
<td valign="middle" align="left">[<a href="#SEC214" title="Beginning of this chapter or previous chapter"> << </a>]</td>
220
<td valign="middle" align="left">[<a href="#SEC214" title="Up section"> Up </a>]</td>
221
<td valign="middle" align="left">[<a href="maxima_57.html#SEC217" title="Next chapter"> >> </a>]</td>
222
<td valign="middle" align="left"> </td>
223
<td valign="middle" align="left"> </td>
224
<td valign="middle" align="left"> </td>
225
<td valign="middle" align="left"> </td>
226
<td valign="middle" align="left">[<a href="maxima.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
227
<td valign="middle" align="left">[<a href="maxima_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
228
<td valign="middle" align="left">[<a href="maxima_76.html#SEC287" title="Index">Index</a>]</td>
229
<td valign="middle" align="left">[<a href="maxima_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
231
<h2 class="section"> 56.2 Funciones y variables para lbfgs </h2>
234
<dt><u>Función:</u> <b>lbfgs</b><i> (<var>FOM</var>, <var>X</var>, <var>X0</var>, <var>epsilon</var>, <var>iprint</var>)</i>
235
<a name="IDX1886"></a>
237
<dd><p>Encuentra una solución aproximada para el problema de minimización
238
sin restricciones de la función objetivo <var>FOM</var> para la lista de
239
variables <var>X</var>, partiendo de los estimadores iniciales <var>X0</var>,
240
de tal manera que <em>norm grad FOM < epsilon max(1, norm X)</em>.
242
<p>El algoritmo utilizado es una técnica <i>cuasi-Newton con memoria limitada</i>
243
(BFGS) [1]. El término <i>memoria limitada</i> procede del hecho de que se almacena
244
una aproximación de rango bajo de la inversa de la matriz hessiana, en lugar
245
de la matriz completa.
246
Cada iteración del algoritmo es una búsqueda a lo largo de una recta,
247
cuya dirección se calcula a partir de la matriz inversa aproximada del
248
hessiano. La función objetivo decrece siempre tras cada búsqueda
249
exitosa a lo largo de la recta; además, casi siempre decrece también
250
el módulo del gradiente de la función.
252
<p>El argumento <var>iprint</var> controla los mensajes de progreso que envía
253
la función <code>lbfgs</code>.
256
<dl compact="compact">
257
<dt> <code>iprint[1]</code></dt>
258
<dd><p><code><var>iprint</var>[1]</code> controla la frecuencia con la que se emiten los mensajes.
259
</p><dl compact="compact">
260
<dt> <code>iprint[1] < 0</code></dt>
261
<dd><p>No se envían mensajes.
263
<dt> <code>iprint[1] = 0</code></dt>
264
<dd><p>Mensajes únicamente en la primera y última iteraciones.
266
<dt> <code>iprint[1] > 0</code></dt>
267
<dd><p>Imprime un mensaje cada <code><var>iprint</var>[1]</code> iteraciones.
271
<dt> <code>iprint[2]</code></dt>
272
<dd><p><code><var>iprint</var>[2]</code> controla la cantidad de información contenida en los mensajes.
273
</p><dl compact="compact">
274
<dt> <code>iprint[2] = 0</code></dt>
275
<dd><p>Imprime contador de iteraciones, número de evaluaciones de <var>FOM</var>, valor de <var>FOM</var>,
276
módulo del gradiente de <var>FOM</var> y amplitud del paso.
278
<dt> <code>iprint[2] = 1</code></dt>
279
<dd><p>Igual que <code><var>iprint</var>[2] = 0</code>, incluyendo <var>X0</var> y el gradiente de <var>FOM</var> evaluado en <var>X0</var>.
281
<dt> <code>iprint[2] = 2</code></dt>
282
<dd><p>Igual que <code><var>iprint</var>[2] = 1</code>, incluyendo los valores de <var>X</var> en cada iteración.
284
<dt> <code>iprint[2] = 3</code></dt>
285
<dd><p>Igual que <code><var>iprint</var>[2] = 2</code>, incluyendo el gradiente de <var>FOM</var> en cada iteración.
291
<p>Las columnas devueltas por <code>lbfgs</code> son las siguientes:
293
<dl compact="compact">
294
<dt> <code>I</code></dt>
295
<dd><p>Número de iteraciones. Se incremente tras cada búsqueda a lo
298
<dt> <code>NFN</code></dt>
299
<dd><p>Número de evaluaciones de la función objetivo.
301
<dt> <code>FUNC</code></dt>
302
<dd><p>Valor de la función objetivo al final de cada iteración.
304
<dt> <code>GNORM</code></dt>
305
<dd><p>Módulo del gradiente de la función objetivo al final de
306
cada iteración.
308
<dt> <code>STEPLENGTH</code></dt>
309
<dd><p>Un parámetro interno del algoritmo de búsqueda.
313
<p>Para más información sobre el algoritmo se puede acudir a los
314
comentarios en el código original en Fortran [2].
316
<p>Véanse también <code>lbfgs_nfeval_max</code> y <code>lbfgs_ncorrections</code>.
320
<p>[1] D. Liu and J. Nocedal. "On the limited memory BFGS method for large
321
scale optimization". <i>Mathematical Programming B</i> 45:503-528 (1989)
323
<p>[2] <a href="http://netlib.org/opt/lbfgs_um.shar">http://netlib.org/opt/lbfgs_um.shar</a>
327
<p>La misma función objetivo utilizada por FGCOMPUTE en el programa
328
sdrive.f del paquete LBFGS de Netlib. Nótese que las variables en
329
cuestión están subindicadas. La función objetivo tiene un
330
mínimo exacto igual a cero en <em>u[k] = 1</em>, para
331
<em>k = 1, ..., 8</em>.
332
</p><pre class="example">(%i1) load (lbfgs);
333
(%o1) /usr/share/maxima/5.10.0cvs/share/lbfgs/lbfgs.mac
334
(%i2) t1[j] := 1 - u[j];
337
(%i3) t2[j] := 10*(u[j + 1] - u[j]^2);
339
(%o3) t2 := 10 (u - u )
343
(%i5) FOM : sum (t1[2*j - 1]^2 + t2[2*j - 1]^2, j, 1, n/2);
345
(%o5) 100 (u - u ) + (1 - u ) + 100 (u - u ) + (1 - u )
348
+ 100 (u - u ) + (1 - u ) + 100 (u - u ) + (1 - u )
350
(%i6) lbfgs (FOM, '[u[1],u[2],u[3],u[4],u[5],u[6],u[7],u[8]],
351
[-1.2, 1, -1.2, 1, -1.2, 1, -1.2, 1], 1e-3, [1, 0]);
352
*************************************************
353
N= 8 NUMBER OF CORRECTIONS=25
355
F= 9.680000000000000D+01 GNORM= 4.657353755084532D+02
356
*************************************************
357
</pre><pre class="example"> I NFN FUNC GNORM STEPLENGTH
359
1 3 1.651479526340304D+01 4.324359291335977D+00 7.926153934390631D-04
360
2 4 1.650209316638371D+01 3.575788161060007D+00 1.000000000000000D+00
361
3 5 1.645461701312851D+01 6.230869903601577D+00 1.000000000000000D+00
362
4 6 1.636867301275588D+01 1.177589920974980D+01 1.000000000000000D+00
363
5 7 1.612153014409201D+01 2.292797147151288D+01 1.000000000000000D+00
364
6 8 1.569118407390628D+01 3.687447158775571D+01 1.000000000000000D+00
365
7 9 1.510361958398942D+01 4.501931728123680D+01 1.000000000000000D+00
366
8 10 1.391077875774294D+01 4.526061463810632D+01 1.000000000000000D+00
367
9 11 1.165625686278198D+01 2.748348965356917D+01 1.000000000000000D+00
368
10 12 9.859422687859137D+00 2.111494974231644D+01 1.000000000000000D+00
369
11 13 7.815442521732281D+00 6.110762325766556D+00 1.000000000000000D+00
370
12 15 7.346380905773160D+00 2.165281166714631D+01 1.285316401779533D-01
371
13 16 6.330460634066370D+00 1.401220851762050D+01 1.000000000000000D+00
372
14 17 5.238763939851439D+00 1.702473787613255D+01 1.000000000000000D+00
373
15 18 3.754016790406701D+00 7.981845727704576D+00 1.000000000000000D+00
374
16 20 3.001238402309352D+00 3.925482944716691D+00 2.333129631296807D-01
375
17 22 2.794390709718290D+00 8.243329982546473D+00 2.503577283782332D-01
376
18 23 2.563783562918759D+00 1.035413426521790D+01 1.000000000000000D+00
377
19 24 2.019429976377856D+00 1.065187312346769D+01 1.000000000000000D+00
378
20 25 1.428003167670903D+00 2.475962450826961D+00 1.000000000000000D+00
379
21 27 1.197874264861340D+00 8.441707983493810D+00 4.303451060808756D-01
380
22 28 9.023848941942773D-01 1.113189216635162D+01 1.000000000000000D+00
381
23 29 5.508226405863770D-01 2.380830600326308D+00 1.000000000000000D+00
382
24 31 3.902893258815567D-01 5.625595816584421D+00 4.834988416524465D-01
383
25 32 3.207542206990315D-01 1.149444645416472D+01 1.000000000000000D+00
384
26 33 1.874468266362791D-01 3.632482152880997D+00 1.000000000000000D+00
385
27 34 9.575763380706598D-02 4.816497446154354D+00 1.000000000000000D+00
386
28 35 4.085145107543406D-02 2.087009350166495D+00 1.000000000000000D+00
387
29 36 1.931106001379290D-02 3.886818608498966D+00 1.000000000000000D+00
388
30 37 6.894000721499670D-03 3.198505796342214D+00 1.000000000000000D+00
389
31 38 1.443296033051864D-03 1.590265471025043D+00 1.000000000000000D+00
390
32 39 1.571766603154336D-04 3.098257063980634D-01 1.000000000000000D+00
391
33 40 1.288011776581970D-05 1.207784183577257D-02 1.000000000000000D+00
392
34 41 1.806140173752971D-06 4.587890233385193D-02 1.000000000000000D+00
393
35 42 1.769004645459358D-07 1.790537375052208D-02 1.000000000000000D+00
394
36 43 3.312164100763217D-10 6.782068426119681D-04 1.000000000000000D+00
395
</pre><pre class="example">
396
THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.
398
(%o6) [u = 1.000005339815974, u = 1.000009942839805,
400
u = 1.000005339815974, u = 1.000009942839805,
402
u = 1.000005339815974, u = 1.000009942839805,
404
u = 1.000005339815974, u = 1.000009942839805]
409
<p>Un problema de regresión. La función objetivo es el cuadrado medio
410
de la diferencia entre la predicción <em>F(X[i])</em> y el valor observado
411
<em>Y[i]</em>. La función <em>F</em> es monótona y acotada (llamada en ocasiones
412
"sigmoidal"). En este ejemplo, <code>lbfgs</code> calcula valores aproximados para los
413
parámetros de <em>F</em> y <code>plot2d</code> hace una representación gráfica
414
comparativa de <em>F</em> junto con los datos observados.
416
<pre class="example">(%i1) load (lbfgs);
417
(%o1) /usr/share/maxima/5.10.0cvs/share/lbfgs/lbfgs.mac
418
(%i2) FOM : '((1/length(X))*sum((F(X[i]) - Y[i])^2, i, 1,
421
sum((F(X ) - Y ) , i, 1, length(X))
423
(%o2) -----------------------------------
425
(%i3) X : [1, 2, 3, 4, 5];
426
(%o3) [1, 2, 3, 4, 5]
427
(%i4) Y : [0, 0.5, 1, 1.25, 1.5];
428
(%o4) [0, 0.5, 1, 1.25, 1.5]
429
(%i5) F(x) := A/(1 + exp(-B*(x - C)));
431
(%o5) F(x) := ----------------------
432
1 + exp((- B) (x - C))
435
(%o6) ((----------------- - 1.5) + (----------------- - 1.25)
436
- B (5 - C) - B (4 - C)
439
+ (----------------- - 1) + (----------------- - 0.5)
440
- B (3 - C) - B (2 - C)
444
+ --------------------)/5
447
(%i7) estimates : lbfgs (FOM, '[A, B, C], [1, 1, 1], 1e-4, [1, 0]);
448
*************************************************
449
N= 3 NUMBER OF CORRECTIONS=25
451
F= 1.348738534246918D-01 GNORM= 2.000215531936760D-01
452
*************************************************
454
</pre><pre class="example">I NFN FUNC GNORM STEPLENGTH
455
1 3 1.177820636622582D-01 9.893138394953992D-02 8.554435968992371D-01
456
2 6 2.302653892214013D-02 1.180098521565904D-01 2.100000000000000D+01
457
3 8 1.496348495303005D-02 9.611201567691633D-02 5.257340567840707D-01
458
4 9 7.900460841091139D-03 1.325041647391314D-02 1.000000000000000D+00
459
5 10 7.314495451266917D-03 1.510670810312237D-02 1.000000000000000D+00
460
6 11 6.750147275936680D-03 1.914964958023047D-02 1.000000000000000D+00
461
7 12 5.850716021108205D-03 1.028089194579363D-02 1.000000000000000D+00
462
8 13 5.778664230657791D-03 3.676866074530332D-04 1.000000000000000D+00
463
9 14 5.777818823650782D-03 3.010740179797255D-04 1.000000000000000D+00
464
</pre><pre class="example">
465
THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.
467
(%o7) [A = 1.461933911464101, B = 1.601593973254802,
468
C = 2.528933072164854]
469
(%i8) plot2d ([F(x), [discrete, X, Y]], [x, -1, 6]), ''estimates;
475
<dt><u>Variable:</u> <b>lbfgs_nfeval_max</b>
476
<a name="IDX1887"></a>
478
<dd><p>Valor por defecto: 100
480
<p>La variable <code>lbfgs_nfeval_max</code> almacena el número máximo de
481
evaluaciones de la función objetivo en <code>lbfgs</code>. Cuando se
482
alcanza el valor <code>lbfgs_nfeval_max</code>, <code>lbfgs</code> devuelve
483
el resultado logrado en la última iteración exitosa.
488
<dt><u>Variable:</u> <b>lbfgs_ncorrections</b>
489
<a name="IDX1888"></a>
491
<dd><p>Valor por defecto: 25
493
<p>La variable <code>lbfgs_ncorrections</code> almacena el número de correcciones
494
aplicadas a la matriz inversa aproximada del hessiano, la cual es gestionada
495
por <code>lbfgs</code>.
500
<table cellpadding="1" cellspacing="1" border="0">
501
<tr><td valign="middle" align="left">[<a href="#SEC214" title="Beginning of this chapter or previous chapter"> << </a>]</td>
502
<td valign="middle" align="left">[<a href="maxima_57.html#SEC217" title="Next chapter"> >> </a>]</td>
503
<td valign="middle" align="left"> </td>
504
<td valign="middle" align="left"> </td>
505
<td valign="middle" align="left"> </td>
506
<td valign="middle" align="left"> </td>
507
<td valign="middle" align="left"> </td>
508
<td valign="middle" align="left">[<a href="maxima.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
509
<td valign="middle" align="left">[<a href="maxima_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
510
<td valign="middle" align="left">[<a href="maxima_76.html#SEC287" title="Index">Index</a>]</td>
172
<a name="Introducci_00f3n-a-interpol"></a>
173
<a name="SEC221"></a>
174
<table cellpadding="1" cellspacing="1" border="0">
175
<tr><td valign="middle" align="left">[<a href="#SEC220" title="Previous section in reading order"> < </a>]</td>
176
<td valign="middle" align="left">[<a href="#SEC222" title="Next section in reading order"> > </a>]</td>
177
<td valign="middle" align="left"> </td>
178
<td valign="middle" align="left">[<a href="#SEC220" title="Beginning of this chapter or previous chapter"> << </a>]</td>
179
<td valign="middle" align="left">[<a href="#SEC220" title="Up section"> Up </a>]</td>
180
<td valign="middle" align="left">[<a href="maxima_57.html#SEC223" title="Next chapter"> >> </a>]</td>
181
<td valign="middle" align="left"> </td>
182
<td valign="middle" align="left"> </td>
183
<td valign="middle" align="left"> </td>
184
<td valign="middle" align="left"> </td>
185
<td valign="middle" align="left">[<a href="maxima.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
186
<td valign="middle" align="left">[<a href="maxima_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
187
<td valign="middle" align="left">[<a href="maxima_78.html#SEC302" title="Index">Index</a>]</td>
188
<td valign="middle" align="left">[<a href="maxima_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
190
<h2 class="section"> 56.1 Introducción a interpol </h2>
192
<p>El paquete <code>interpol</code> desarrolla los métodos de interpolación polinómica de Lagrange, lineal y de <i>splines</i> cúbicos.
195
<p>Para comentarios, fallos o sugerencias, contactar con <var>'mario ARROBA edu PUNTO xunta PUNTO es'</var>.
200
<a name="Funciones-y-variables-para-interpol"></a>
201
<a name="SEC222"></a>
202
<table cellpadding="1" cellspacing="1" border="0">
203
<tr><td valign="middle" align="left">[<a href="#SEC221" title="Previous section in reading order"> < </a>]</td>
204
<td valign="middle" align="left">[<a href="maxima_57.html#SEC223" title="Next section in reading order"> > </a>]</td>
205
<td valign="middle" align="left"> </td>
206
<td valign="middle" align="left">[<a href="#SEC220" title="Beginning of this chapter or previous chapter"> << </a>]</td>
207
<td valign="middle" align="left">[<a href="#SEC220" title="Up section"> Up </a>]</td>
208
<td valign="middle" align="left">[<a href="maxima_57.html#SEC223" title="Next chapter"> >> </a>]</td>
209
<td valign="middle" align="left"> </td>
210
<td valign="middle" align="left"> </td>
211
<td valign="middle" align="left"> </td>
212
<td valign="middle" align="left"> </td>
213
<td valign="middle" align="left">[<a href="maxima.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
214
<td valign="middle" align="left">[<a href="maxima_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
215
<td valign="middle" align="left">[<a href="maxima_78.html#SEC302" title="Index">Index</a>]</td>
216
<td valign="middle" align="left">[<a href="maxima_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
218
<h2 class="section"> 56.2 Funciones y variables para interpol </h2>
222
<dt><u>Función:</u> <b>lagrange</b><i> (<var>points</var>)</i>
223
<a name="IDX2111"></a>
225
<dt><u>Función:</u> <b>lagrange</b><i> (<var>points</var>, <var>option</var>)</i>
226
<a name="IDX2112"></a>
228
<dd><p>Calcula el polinomio de interpolación por el método de Lagrange. El argumento <var>points</var> debe ser:
232
una matriz de dos columnas, <code>p:matrix([2,4],[5,6],[9,3])</code>,
234
una lista de pares de números, <code>p: [[2,4],[5,6],[9,3]]</code>,
236
una lista de números, <code>p: [4,6,3]</code>, en cuyo caso las abscisas se asignarán automáticamente a 1, 2, 3, etc.
239
<p>En los dos primeros casos los pares se ordenan con respecto a la primera coordenada antes de proceder a los cálculos.
241
<p>Mediante el argumento <var>option</var> es posible seleccionar el nombre de la variable independiente, que por defecto es <code>'x</code>; para definir otra, escríbase algo como <code>varname='z</code>.
243
<p>Téngase en cuenta que cuando se trabaja con polinomios de grado alto, los
244
cálculos con números decimales en coma flotante pueden ser muy inestables.
248
<pre class="example">(%i1) load(interpol)$
249
(%i2) p:[[7,2],[8,2],[1,5],[3,2],[6,7]]$
251
(x - 7) (x - 6) (x - 3) (x - 1)
252
(%o3) -------------------------------
254
(x - 8) (x - 6) (x - 3) (x - 1)
255
- -------------------------------
257
7 (x - 8) (x - 7) (x - 3) (x - 1)
258
+ ---------------------------------
260
(x - 8) (x - 7) (x - 6) (x - 1)
261
- -------------------------------
263
(x - 8) (x - 7) (x - 6) (x - 3)
264
+ -------------------------------
267
(x - 7) (x - 6) (x - 3) (x - 1)
268
(%o4) f(x) := -------------------------------
270
(x - 8) (x - 6) (x - 3) (x - 1)
271
- -------------------------------
273
7 (x - 8) (x - 7) (x - 3) (x - 1)
274
+ ---------------------------------
276
(x - 8) (x - 7) (x - 6) (x - 1)
277
- -------------------------------
279
(x - 8) (x - 7) (x - 6) (x - 3)
280
+ -------------------------------
282
(%i5) /* Evaluate the polynomial at some points */
283
expand(map(f,[2.3,5/7,%pi]));
285
919062 73 %pi 701 %pi 8957 %pi
286
(%o5) [- 1.567535, ------, ------- - -------- + ---------
292
(%o6) [- 1.567535, 10.9366573451538, 2.89319655125692]
293
(%i7) load(draw)$ /* load draw package */
294
(%i8) /* Plot the polynomial together with points */
297
key = "Lagrange polynomial",
298
explicit(f(x),x,0,10),
301
key = "Sample points",
303
(%i9) /* Change variable name */
304
lagrange(p, varname=w);
305
(w - 7) (w - 6) (w - 3) (w - 1)
306
(%o9) -------------------------------
308
(w - 8) (w - 6) (w - 3) (w - 1)
309
- -------------------------------
311
7 (w - 8) (w - 7) (w - 3) (w - 1)
312
+ ---------------------------------
314
(w - 8) (w - 7) (w - 6) (w - 1)
315
- -------------------------------
317
(w - 8) (w - 7) (w - 6) (w - 3)
318
+ -------------------------------
325
<dt><u>Función:</u> <b>charfun2</b><i> (<var>x</var>, <var>a</var>, <var>b</var>)</i>
326
<a name="IDX2113"></a>
328
<dd><p>Devuelve <code>true</code> si el número <var>x</var> pertenece al intervalo <em>[a, b)</em>, y <code>false</code> en caso contrario.
333
<dt><u>Función:</u> <b>linearinterpol</b><i> (<var>points</var>)</i>
334
<a name="IDX2114"></a>
336
<dt><u>Función:</u> <b>linearinterpol</b><i> (<var>points</var>, <var>option</var>)</i>
337
<a name="IDX2115"></a>
339
<dd><p>Calcula rectas de interpolación. El argumento <var>points</var> debe ser:
343
una matriz de dos columnas, <code>p:matrix([2,4],[5,6],[9,3])</code>,
345
una lista de pares de números, <code>p: [[2,4],[5,6],[9,3]]</code>,
347
una lista de números, <code>p: [4,6,3]</code>, en cuyo caso las abscisas se asignarán automáticamente a 1, 2, 3, etc.
350
<p>En los dos primeros casos los pares se ordenan con respecto a la primera coordenada antes de proceder a los cálculos.
352
<p>Mediante el argumento <var>option</var> es posible seleccionar el nombre de la variable independiente, que por defecto es <code>'x</code>; para definir otra, escríbase algo como <code>varname='z</code>.
356
<pre class="example">(%i1) load(interpol)$
357
(%i2) p: matrix([7,2],[8,3],[1,5],[3,2],[6,7])$
358
(%i3) linearinterpol(p);
360
(%o3) (-- - ---) charfun2(x, minf, 3)
362
+ (x - 5) charfun2(x, 7, inf) + (37 - 5 x) charfun2(x, 6, 7)
364
+ (--- - 3) charfun2(x, 3, 6)
369
(%o4) f(x) := (-- - ---) charfun2(x, minf, 3)
371
+ (x - 5) charfun2(x, 7, inf) + (37 - 5 x) charfun2(x, 6, 7)
373
+ (--- - 3) charfun2(x, 3, 6)
375
(%i5) /* Evaluate the polynomial at some points */
376
map(f,[7.3,25/7,%pi]);
378
(%o5) [2.3, --, ----- - 3]
381
(%o6) [2.3, 2.952380952380953, 2.235987755982989]
382
(%i7) load(draw)$ /* load draw package */
383
(%i8) /* Plot the polynomial together with points */
386
key = "Linear interpolator",
387
explicit(f(x),x,-5,20),
390
key = "Sample points",
392
(%i9) /* Change variable name */
393
linearinterpol(p, varname='s);
395
(%o9) (-- - ---) charfun2(s, minf, 3)
397
+ (s - 5) charfun2(s, 7, inf) + (37 - 5 s) charfun2(s, 6, 7)
399
+ (--- - 3) charfun2(s, 3, 6)
407
<dt><u>Función:</u> <b>cspline</b><i> (<var>points</var>)</i>
408
<a name="IDX2116"></a>
410
<dt><u>Función:</u> <b>cspline</b><i> (<var>points</var>, <var>option1</var>, <var>option2</var>, ...)</i>
411
<a name="IDX2117"></a>
413
<dd><p>Calcula el polinomio de interpolación por el método de los <i>splines</i> cúbicos. El argumento <var>points</var> debe ser:
417
una matriz de dos columnas, <code>p:matrix([2,4],[5,6],[9,3])</code>,
419
una lista de pares de números, <code>p: [[2,4],[5,6],[9,3]]</code>,
421
una lista de números, <code>p: [4,6,3]</code>, en cuyo caso las abscisas se asignarán automáticamente a 1, 2, 3, etc.
424
<p>En los dos primeros casos los pares se ordenan con respecto a la primera coordenada antes de proceder a los cálculos.
426
<p>Esta función dispone de tres opciones para acomodarse a necesidades concretas:
430
<code>'d1</code>, por defecto <code>'unknown</code>, es la primera derivada en <em>x_1</em>; si toma el valor <code>'unknown</code>, la segunda derivada en <em>x_1</em> se iguala a 0 (<i>spline</i> cúbico natural); en caso de tomar un valor numérico, la segunda derivada se calcula en base a este número.
433
<code>'dn</code>, por defecto <code>'unknown</code>, es la primera derivada en <em>x_n</em>; si toma el valor <code>'unknown</code>, la segunda derivada en <em>x_n</em> se iguala a 0 (<i>spline</i> cúbico natural); en caso de tomar un valor numérico, la segunda derivada se calcula en base a este número.
436
<code>'varname</code>, por defecto <code>'x</code>, es el nombre de la variable independiente.
441
<pre class="example">(%i1) load(interpol)$
442
(%i2) p:[[7,2],[8,2],[1,5],[3,2],[6,7]]$
443
(%i3) /* Unknown first derivatives at the extremes
444
is equivalent to natural cubic splines */
447
1159 x 1159 x 6091 x 8283
448
(%o3) (------- - ------- - ------ + ----) charfun2(x, minf, 3)
451
2587 x 5174 x 494117 x 108928
452
+ (- ------- + ------- - -------- + ------) charfun2(x, 7, inf)
455
4715 x 15209 x 579277 x 199575
456
+ (------- - -------- + -------- - ------) charfun2(x, 6, 7)
459
3287 x 2223 x 48275 x 9609
460
+ (- ------- + ------- - ------- + ----) charfun2(x, 3, 6)
464
(%i5) /* Some evaluations */
465
map(f,[2.3,5/7,%pi]), numer;
466
(%o5) [1.991460766423356, 5.823200187269903, 2.227405312429507]
467
(%i6) load(draw)$ /* load draw package */
468
(%i7) /* Plotting interpolating function */
471
key = "Cubic splines",
472
explicit(f(x),x,0,10),
475
key = "Sample points",
477
(%i8) /* New call, but giving values at the derivatives */
478
cspline(p,d1=0,dn=0);
480
1949 x 11437 x 17027 x 1247
481
(%o8) (------- - -------- + ------- + ----) charfun2(x, minf, 3)
484
1547 x 35581 x 68068 x 173546
485
+ (- ------- + -------- - ------- + ------) charfun2(x, 7, inf)
488
607 x 35147 x 55706 x 38420
489
+ (------ - -------- + ------- - -----) charfun2(x, 6, 7)
492
3895 x 1807 x 5146 x 2148
493
+ (- ------- + ------- - ------ + ----) charfun2(x, 3, 6)
495
(%i8) /* Defining new interpolating function */
497
(%i9) /* Plotting both functions together */
500
key = "Cubic splines (default)",
501
explicit(f(x),x,0,10),
503
key = "Cubic splines (d1=0,dn=0)",
504
explicit(g(x),x,0,10),
507
key = "Sample points",
513
<dt><u>Función:</u> <b>ratinterpol</b><i> (<var>points</var>, <var>numdeg</var>)</i>
514
<a name="IDX2118"></a>
516
<dt><u>Función:</u> <b>ratinterpol</b><i> (<var>points</var>, <var>numdeg</var>, <var>option1</var>, <var>option2</var>, ...)</i>
517
<a name="IDX2119"></a>
519
<dd><p>Genera el interpolador racional para los datos dados por <var>points</var> y con
520
grado <var>numdeg</var> en el numerador; el grado del denominador se calcula
521
automáticamente. El argumento <var>points</var> debe ser:
525
una matriz de dos columnas, <code>p:matrix([2,4],[5,6],[9,3])</code>,
527
una lista de pares de números, <code>p: [[2,4],[5,6],[9,3]]</code>,
529
una lista de números, <code>p: [4,6,3]</code>, en cuyo caso las abscisas se asignarán automáticamente a 1, 2, 3, etc.
532
<p>En los dos primeros casos los pares se ordenan con respecto a la primera coordenada antes de proceder a los cálculos.
534
<p>Esta función dispone de dos opciones para acomodarse a necesidades concretas:
537
<code>'denterm</code>, por defecto <code>1</code>, es el término independente del polinomio en el denominador.
540
<code>'varname</code>, por defecto <code>'x</code>, es el nombre de la variable independiente.
545
<pre class="example">(%i1) load(interpol)$
547
(%i3) p:[[7.2,2.5],[8.5,2.1],[1.6,5.1],[3.4,2.4],[6.7,7.9]]$
548
(%i4) for k:0 thru length(p)-1 do
550
explicit(ratinterpol(p,k),x,0,9),
553
title = concat("Grado del numerador = ",k),
558
<table cellpadding="1" cellspacing="1" border="0">
559
<tr><td valign="middle" align="left">[<a href="#SEC220" title="Beginning of this chapter or previous chapter"> << </a>]</td>
560
<td valign="middle" align="left">[<a href="maxima_57.html#SEC223" title="Next chapter"> >> </a>]</td>
561
<td valign="middle" align="left"> </td>
562
<td valign="middle" align="left"> </td>
563
<td valign="middle" align="left"> </td>
564
<td valign="middle" align="left"> </td>
565
<td valign="middle" align="left"> </td>
566
<td valign="middle" align="left">[<a href="maxima.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
567
<td valign="middle" align="left">[<a href="maxima_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
568
<td valign="middle" align="left">[<a href="maxima_78.html#SEC302" title="Index">Index</a>]</td>
511
569
<td valign="middle" align="left">[<a href="maxima_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
515
This document was generated by <em>Robert Dodier</em> on <em>agosto, 25 2007</em> using <a href="http://texi2html.cvshome.org/"><em>texi2html 1.76</em></a>.
573
This document was generated by <em>Robert Dodier</em> on <em>diciembre, 14 2008</em> using <a href="http://texi2html.cvshome.org/"><em>texi2html 1.76</em></a>.