Algoritmos para Funciones de Bessel
Algoritmos para Funciones de Bessel
3.1 INTRODUCCIÓN
Con el planteamiento físico del problema vimos que la mayor complicación surge de la
necesidad de calcular y representar la función b(V,s) de cada modo, así como sus derivadas
primera y segunda respecto de V. Para ello debemos calcular la constante de propagación
axial correspondiente a la frecuencia adimensional V, lo que nos lleva a encontrar los ceros
de la ecuación de dispersión. Esta es una ecuación algebraica que implica el cálculo de las
funciones de Bessel de primera especie. Con esta constante obtenemos el valor de b(V,s) y
sólo nos queda calcular, numéricamente, sus derivadas. Matemáticamente, todo esto nos
genera, seis problemas fundamentales:
5) El cálculo de la función b(V,s) es muy laborioso de por sí, por lo que es necesario
un sistema de interpolación que nos permita obtener los valores de la función de
forma rápida, con precisión adecuada. Si se requiere el uso intensivo de la derivada,
o es preciso obtener derivadas de orden superior a uno, se hace necesario utilizar las
derivadas analíticas de la función de interpolación en lugar de la original. En este
caso, hemos de calcular con frecuencia tanto la primera, como la segunda derivada
de b(V,s). Por ello, el sistema de interpolación debe facilitar su cálculo.
8
En fibras monomodo, el valor de Vmax está limitado, teóricamente, a 2,4048. Para tratar las fibras multimodo
a salto de índice hemos ampliado a 20 el rango de V. Por tanto, grosso modo, n ∈ [0, Vmax], con Vmax ≤ 20.
9
Por robustez entendemos que garantice la convergencia y que avise adecuadamente si esta no se produce. La
rapidez dependerá del orden de convergencia, entendido como la relación entre los dígitos de precisión
obtenidos respecto del número de evaluaciones realizadas en cada iteración. La fiabilidad implica que, en caso
de convergencia, la solución obtenida es la que estábamos buscando y no otra.
10
La cantidad de cálculo varía exponencialmente con el orden de derivada.
31
6) Definir el criterio al elegir los puntos que se utilizarán en la representación de cada
función, para obtener, en el menor tiempo posible, imágenes fieles de las mismas.
32
Por último, hemos de decidir la precisión requerida, simple o doble11. En el primer caso
trabajaríamos con variables tipo Single, en el segundo usaríamos el tipo Double. El primer
tipo de variables ocupa la mitad de memoria y las operaciones son muchísimo más rápidas.
Además, los algoritmos serán más sencillos y rápidos de ejecutar. Necesitamos unos tres
dígitos de precisión en los resultados.
Ya vimos que Hn(u) puede estar en la base de dos etapas de cálculo. Primero, solución
numérica de la ecuación de dispersión para obtener las curvas de propagación axial
adimensional. Segundo, y más desfavorable, cálculo de la dispersión intramodal derivando
dos veces las curvas anteriores. Suponiendo que los algoritmos de cálculo de Hn(u) nos
ofrecen resultados exactos hasta el último bit. Si en la solución de la ecuación “gastamos”
un dígito de precisión y en las dos derivaciones “consumimos” otros tres, podríamos usar
variables tipo Single. De todas formas, la cosa va muy justa, por lo que es prudente estudiar
también los algoritmos en doble precisión12.
El cálculo de Jn(u) sólo es necesario, en principio, para tener los valores de los campos
en el núcleo, por lo que su uso es directo, y la precisión simple es suficiente.
2 .( n − 1)
2) Recurrencia. J n ( u ) = J n −1 ( u ) − J n − 2 ( u ) ∀ n
u
Estudiaremos el sentido en que la relación es estable13. Hay dos tramos:
11
Precisión simple significa unos 7 dígitos de precisión. En doble precisión tenemos unos 15 dígitos.
12
Empezamos con algoritmos de precisión simple (variables Single). Todo fue bien hasta que llegamos a las
curvas de dispersión intramodal. Tuvimos que cambiarlo todo a doble precisión (variables Double).
13
En este caso, estabilidad significa que los errores de truncamiento no se amplifican al recorrer la relación.
Cuando una relación de recurrencia es inestable en un sentido significa que estable en el otro.
14
Tomamos estos valores iniciales pues lim J k (u) = 0 , ∀u ≤ n.
k→∞
33
El único problema es elegir adecuadamente m. Para ello tenemos una regla
heurística, por la que m = n + P.n1/2, donde P es una constante cuyo valor es igual
al número de dígitos de precisión que deseamos alcanzar. En este caso tenemos
que realizar m iteraciones. Si queremos calcular Hn(u) no hace falta normalizar
pues al dividir la función de orden n por la de orden n-1 desaparece la constante
de normalización. En este caso, realizaremos P.n1/2 iteraciones.
Sea una función f(x) dada mediante una expresión en fracciones continuas y sea
fn el resultado de evaluar, de izquierda a derecha, la expresión hasta los
coeficientes an y bn. Por ejemplo, para f3, evaluaríamos hasta b3, esperando que el
resto de la expresión, los puntos suspensivos, sea despreciable frente a b3.
a1
f(x) = b 0 +
a2
b1 +
a3
b2 +
b3 + ⋅⋅ ⋅
El método de Steed consiste en ir calculando los incrementos de fj, ∆fj = fj – fj-1.
Por inducción se pueden demostrar las siguientes relaciones:
∆fj = ([Link] –1).∆fj-1 y Dj = 1/(bj + [Link]-1), ∀j = 2,...,n. Con D1 = 1/b1, ∆f1 = a1/b1 y
n
f0 = b0. Evidentemente fn = f0 + ∑ ? f j
j=1
34
La condición de finalización será: |(∆fj)/fj-1| < ε, con ε la precisión requerida en
los cálculos. Esta condición no es de validez general, pero sirve perfectamente
para los casos que vamos a estudiar.
• f0 = b0
• Si f0 = 0, entonces f0 = δ
• C0 = f0
• D0 = 0
• Bucle para j =1, 2,...
o Dj = bj + [Link]-1
o Si Dj = 0, entonces Dj = δ
o Cj = bj + aj/Cj-1
o Si Cj = 0, entonces Cj = δ
o Dj = 1/Dj
o ∆j = [Link]
o fj = fj-1.∆j
o Condición de salida del bucle
Si |∆j –1| < ε, entonces:
Fin
• Repetición del bucle
35
4) Expansiones en series.
Expansión asintótica de Hankel para argumentos grandes ≡ u >> n:
Jn(u) ≈
2
{Pn (u).cos( ? ) − Q n (u).sen( ? )}, con ? = u − p n + 1 .
pu 2 2
∞
(n,2k) ∞
(n,2k + 1)
donde Pn(u) ≈ ∑ ( − 1) k y Qn(u) ≈ ∑ ( − 1) k .
k =0 (2.u) 2k
k=0 (2.u) 2k +1
(u) los términos k-ésimos de Pn(u) y Qn(u) y µ = 4.n :
2
Sean TPnk (u) y TQn
k
TPnk (u) = -
(µ - (4.k - 1) ).(µ - (4.k - 3) ) T
2 2
k -1
(u) ∀k ≥ 2
(2k − 2 )(. 2k − 3 )(. 8.u ) 2 Pn
k
TQn (u) = -
(µ - (4.k + 1)2 ).(µ - (4.k - 1)2 ) T k -1 (u) ∀k ≥ 2
(2k − 1).2 k.(8.u )2 Qn
Precisión simple.
En primer lugar, el método de las fracciones continuas calcula Hn(u) directamente, pero
necesitamos otra relación para calcular Jn(u). El método de recurrencia va calculando una
sucesión de ordenes hasta llegar a n, por lo que obtenemos Jn-1(u) y Jn(u) simultáneamente y
sólo con dividir obtenemos Hn(u). Además, en este caso no hace falta normalizar, pues al
dividir eliminamos la constante de normalización., y por tanto, no es necesario seguir hasta
n = 0, ahorrándonos n iteraciones.
36
1
FC ( u)
Rec( 13 , u)
Tiempos
0.5
Rec( 10 , u)
0 5 10 15
u
Evidentemente, dado un n fijo existirá un valor de u, al que denominaremos Un(n), para
el que el tiempo de ejecución de las fracciones continuas es igual al de recurrencia.
Variando n dentro del intervalo máximo de trabajo, [0, Vmax = 20], e imponiendo un ajuste
exponencial llegamos a:
na
Un(n) = C a −1 , con a = 2.2, b = 20 y C = 1.1
n +b
Para sacar el máximo rendimiento usaríamos fracciones continuas para 0 < u < Un(n) y
recurrencia para Un(n) < u. Dado que Un(n) < n, ∀n: 0 < n ≤ Vmax ≤ 20 y que trabajaremos
con u > n, el método más rápido es el de recurrencia ascendente. Finalmente, puesto que la
diferencia entre n y Un(n) es grande, asumir que el resultado experimental obtenido es un
comportamiento intrínseco a los algoritmos utilizados, tiene validez en general y que no
depende del hardware utilizado.
15
Recurrencia
hacia arriba
10
Un ( n)
n Recurrencia
hacia abajo
5
Fracciones
continuas
0 2 4 6 8 10 12 14
n
37
Resumiendo:
Hn(u):
- Recurrencia ascendente.
Jn(u):
- ∀n: si 0 ≤ u < n, recurrencia descendente. Si n ≤ u, recurrencia ascendente.
Precisión doble.
Hn(u): fracciones continuas en todo el rango utilizando el método de Lentz modificado.
Jn(u): ya vimos que no será necesario su cálculo con tanta precisión.
Por último destacar que obtenemos precisión relativa lejos de los ceros de Jn(u) = 0.
Cuando nos acercamos a esos puntos la precisión obtenida es absoluta. Lo mismo sucede
con Hn(u) pero con los ceros de Jn(u) = 0 y los de Jn-1(u) = 0.
Pasamos ahora a considerar los diversos métodos para el cálculo de Gn(w) y Kn(w):
Kn(w) = ∑
w
+ ( − 1) n +1 ln I n (w) +
2 w k = 0 (-1) k! 2
k
2
(−1) n w
n ∞
[? (k + 1) + ? (n + k + 1)] w 2k , ∀n∈{0}∪ N, ∀w, con:
+
2 2
∑
k =0 k!(n + k)!
2
n −1
1
ψ(n) = -γ + ∑ ∀n∈N, siendo γ = 0.57721..., la constante de Euler.
k =1 k
n 2k
w ∞ 1 w
In(w) = ∑ ,∀n∈{0}∪ N, ∀w
2 k =0 k!(n + k)! 2
La expansión es complicada, sobre todo para n medio o grande. Sólo vale para w
pequeños. La usaremos para evaluar K0(w) y K1(w), con 0< w < wo y wo ≈ 1.
2 .( n − 1)
2) Recurrencia. K n ( w ) = K n −1 ( w ) + K n − 2 ( w ) ∀ n
w
Hay que estudiar el sentido de la estabilidad:
38
3) Fracciones continuas. Para Gn(w), por la relación de recurrencia llegamos a:
1
G n (w) = ⇒ b0 = 0, bi = -2.(n-1+i)/w ∀i ≥ 1 ai = 1 ∀i ≥ 1
2.n
− + G n +1 (w)
w
La evaluaremos mediante el algoritmo de Steed, ya que, podemos demostrar que
bj + [Link]-1 es siempre un número negativo y alejado de 0.
El problema es que cuando w→ 0+ Gn(w)→2.(n-1)/w y por tanto, bi será de igual
orden que la expresión a su derecha y no se verificará la condición en la que se
basan los algoritmos de fracciones continuas.
p −w ∞
(n, k)
4) Expansión asintótica para u grande ≡ u >> n. Kn(w) = e 1 + ∑ k .
2.w k =1 (2.u)
La precisión alcanzable depende de lo grande que sea u respecto de n. A mayor
u/n, mayor precisión. Como u y n están en el rango de 0 a 20 la relación u/n no
va a ser muy elevada, por lo que esta expresión sólo será útil en precisión simple
y para calcular K0(w) y K1(w) en la zona w > wo, con wo > 1.
39
∞
z m ( w)
Si definimos: A(w) = ∑ C m 1 1
, entonces z 0 ( w) =
m =1 z 0 ( w) ν+
1
2
1 + A(w)
( 2.w)
Si queremos tener simultáneamente Kν(w), Kν+1(w) hay un método para calcular
A(w) al mismo tiempo que ejecutamos el algoritmo de Steed.
∞
z1 (w )
Si
z 0 (w )
= ∑ ∆h
m =0
m
, con los términos ∆hm calculados por el algoritmo de Steed.
N
z m ( w)
Sea AN la aproximación a A(w) tras sumar N términos. A N (w) = ∑C
m =1
m
z 0 ( w)
N m
Podemos poner A N (w) = ∑T
m =1
m .∆ h m , con Tm (w) = ∑C
k =1
k .t k , los coeficientes tk
verifican la siguiente ley de recurrencia tk+1 = (tk-1 –bk. tk)/ ak+1, con t0 = 0 y t1 = 1.
Otra limitación de este método es que, tanto la relación en fracciones continuas
como la condición de normalización de Temme, son válidas para ν: |ν| ≤ ½. Por
tanto, con ν∈{0}∪N y |ν| ≤ ½, sólo está ν = 0 obteniendo G1(w), K0(w) y K1(w).
p0 = Γ (1 + ν ) , q0 = Γ (1 − ν )
1 w 1 w
2 2 2 2
p.? senh (s ) 2
f0 = cosh (s ).G1 (? ) + ln .G2 (? ) , con σ = ν.ln(2/w), además
sen (p.? ) s w
1 1 1 1
G1 (? ) = y G2 (? ) =
1 1
− + .
2.? G(1 - ? ) G(1 + ? ) 2 G(1 - ? ) G(1 + ? )
senh (s ) sen (x )
Sabiendo que: G2 (0 ) = 1 , lim G1 (? ) = − ? , lim = 1 y lim = 1.
?→0 s →0 s x→0 x
Para ν=0, simplifica y llegar a: p0=½, pk=qk∀k≥0, f0 = -γ + ln(2/w) y f0 = -γ f0 = -
γ.
De nuevo, este método sólo será válido si ν: |ν| ≤ ½. Por tanto, con ν∈{0}∪N y
|ν| ≤ ½, sólo está ν = 0, con lo que podremos calcular G1(w), K0(w) y K1(w).
Podríamos usar fracciones continuas cuando w > wt y series ascendentes para w < wt. El
problema es saber cuando usar un sistema u otro, pues wt depende del orden . Además, esto
sólo sirve para calcular Gn(w). Por ello usaremos recurrencia ascendente en todo el rango
de trabajo y para cualquier precisión. La forma de calcular K0(w) y K1(w) dependerá de la
precisión que queramos obtener.
40
Para precisión simple, tomaremos un valor de referencia wo, que nos divida la semi-
recta positiva en dos partes. La zona 0< w ≤ wo, donde usaremos una aproximación basada
en el desarrollo en series ascendentes. wo< w, para la cual es útil una aproximación basada
en la expansión asintótica para órdenes grandes. Para precisión doble, al no ser uniforme la
expansión asintótica, tendríamos que ir a un wo muy grande y Vmax < wo, o bien, tener un
orden polinómico muy alto en la aproximación. Si wo es grande, tendríamos que trabajar
sólo con la aproximación basada en el desarrollo en series ascendentes, lo que nos llevaría a
usar polinomios de grado elevado. Tanto en un caso como en otro acabamos usando
polinomios de grado elevado, y por tanto, sensibles al redondeo y a las cancelaciones. En
resumen, no podemos usar este método para doble precisión.
Para precisión doble usaremos las funciones hipergeométricas confluentes y las series
para argumentos pequeños.
15
V2 =u2 + w2, por lo que en el corte, cuando w→0, u→V.
16
En las soluciones a las ecuaciones para obtener las frecuencias de corte nunca se incluye la solución x = 0, a
no ser que se indique expresamente lo contrario.
41
H 1 (u) K
0= − ; Ecuación de dispersión en el corte
u w
w 2 .ln + ?
2
K.u(V)
−?
w(V) = 2.e [V ]
2
- u(V) 2 .H1 (u(V))
que nos sirve para obtener las derivadas en el corte17.
En este caso no podemos obtener una expresión funcional del tipo b(V,s), pero
de todas formas el rango de validez de la aproximación es pequeño, por lo que no
nos es de utilidad práctica.
yA =
(
s2 −1
2
)
; B=
s2 −1
2
( 1 ) s2 −1
+
2
1
−
(
s2 +1 )2
(
2. s 2 + 1 )2.s 2 .(l − 1) 4.l.(l − 2) s 2 + 1
8.l 16.s 2 .(l − 2)
Así tenemos:
Para l = 1,Vc es la solución a la ecuación J1(x) = 0, equivalente a H1(x) = 0.
En este caso si se incluye la solución Vc = 0.
Para l ≥ 2, Vc es la solución a la ecuación (s2 +1).(l-1).Jl-1(x) - [Link](x) = 0, o
lo que es lo mismo, (s2 +1).(l-1) – [Link](x) = 0. Teniendo en cuenta las
17
Junto a: u´(V)= [V-w(V).w´(V)]/u(V), que se obtiene derivando respecto de V la expresión: V2 =u2 + w2.
42
relaciones de recurrencia de las funciones de Bessel podemos ponerlo como,
[Link]-2(x) + (s2 –1). Jl-1(x) = 0, o, x + (s2 –1).Hl-1(x) = 0. Si s→1, la ecuación
tiende a Jl-2(x) = 0, o, Hl-1(x) = ∞.
• l = 1:
s 2 +1
− +?
2.u(V).H (u(V))
1
w(V) = 2.e , nos permite obtener las derivadas
s 2 +1
− +?
2.V.H (V)
1
w(V) = 2.e , usamos esta forma directa en lugar de la ecuación de
dispersión, pues su rango de utilidad es suficientemente amplio. Este rango se
calcula haciendo que los términos que despreciamos en el desarrollo de la
ecuación en el corte sean menores que la precisión de cálculo. Estos términos
son del orden de [Link](w). Sea wo: -[Link](wo) = Pm, con Pm la precisión
máxima alcanzable, 0 < Pm < 1. Sea K = -ln(wo/2)-γ, entonces el valor límite
de frecuencia adimensional para el que se puede utilizar las simplificaciones
en el corte, Vo, verificará:
s 2 +1
wo = w(Vo), o sea: Vo .H 1 (Vo ) = . Tiene infinitas soluciones, tomamos
2.K
la más próxima a la frecuencia adimensional de corte del modo en cuestión.
• l = 2:
2 s 2 +1 A 2.A
−1 + − −?
w(V) = 2.e [V - u(V) ] ( )
2. s +1 u(V)
2 2 u(V).H 2 2
2 (u(V))
, de aquí podemos obtener las
derivadas en el corte.
No hay expresión explícita para b(V,s).
• l ≥ 3:
(l - 1).(s 2 + 1)
−1
u(V).H l (u(V))
w(V) = , de aquí obtenemos las derivadas en el corte.
A.u(V) − 2 + B
(l - 1).(s 2 + 1)
−1
V.H l (V)
w(V) = , no la usaremos al ser muy pequeño el rango útil.
A.V −2 + B
43
La frecuencia adimensional de corte es la solución de la ecuación:
J1(x) = 0 equivalente a H1(x) = ∞.
1
− + ?
u(V).H1 (u(V))
w(V) = 2.e , nos permite obtener las derivadas. De hecho este
caso es igual al de HE1,k, poniendo s = 1.
1
− + ?
V.H1 (V)
w(V) = 2.e , usamos esta forma directa en lugar de la ecuación de
dispersión, pues su rango de utilidad es suficientemente amplio. Este rango se
calcula exactamente igual que para HE1,k, poniendo s = 1.
• m≥1
u
0= + rm (w) ; Ecuación de dispersión en el corte.
H m (u)
w 2
− ln + ? .w m =1
Donde: rm (w) = 2
2
w
m≥2
2.(m − 1)
o m = 1:
u(V)
−?
w(V) = 2.e [V ]
2
- u(V) 2 .H1 (u(V))
, para obtener las derivadas en el corte.
No hay expresión explícita para b(V,s).
o m ≥ 2:
2.(m - 1).u(V)
w(V) = − , para obtener las derivadas en el corte.
H m (u(V))
2.(m - 1).V
w(V) = − , no la usaremos al ser pequeño el rango útil.
H m (V)
44
Para la ecuación de dispersión partiremos con el valor inicial dado por la aproximación
de guía débil del apartado [Link], “Expresión analítica para la constante de propagación
axial”. Este valor inicial es válido para nuestro rango de trabajo, s ∈ [1,smax]. El algoritmo
converge de forma bastante rápida, 2 ó 3 evaluaciones en casi todo el rango. El problema
está, sobre todo, en la zona de corte y fundamentalmente para los modos LP0,1 y HE1,1. En
ese caso utilizamos los resultados del apartado anterior. Para mayor seguridad, acotamos el
cero y utilizamos un híbrido entre el Newton-Raphson (N-R) y el algoritmo de bisección,
lento pero seguro. De esta forma, la bisección sólo entra cuando el N-R se sale de la
acotación o no converge con suficiente rapidez. El criterio de control es sencillo y no
penaliza prácticamente el algoritmo.
Modos EH y TE (l = 0):
2
l (1 + s 2 ) l s2 −1 − l l2 1 1 s2 1
t (u, w, s) = 2 +
l
− g l
(w) − + g l
(w) + + .
2 2
+ 2
u 2.s w
2 2
2.s w
2 2
s u
2 2
w u w
con tl(u,w,s) < 0 en todo el rango u,w ∈ [0,V]
Modos HE y TM (l = 0):
2
l (1 + s 2 ) l s2 −1 l l2 1 1 s2 1
t l (u, w, s) = 2 + + g l (w) − + g l (w) + + .
2 2
+ 2
u 2.s w
2 2
2.s w
2 2
s u
2 2
w u w
con tl(u,w,s) > 0 en todo el rango u,w ∈ [0,V].
45
Modos LP:
- K 0 (w ) - K 0 (w) −1
m = 0, − g -1 ( w ) = = = 2 1
w.K −1 ( w ) w.K 1 ( w ) w .g ( w )
t m (u, w) = −g m −1 (w);
- K m (w)
m ≥ 1, − g m −1 ( w ) =
w.K m −1 ( w )
m
con t (u,w) < 0 en todo el rango u,w∈ [0,V].
Kl − 1(w) Kl + 1(w)
con : g l (w) ≡ ; g l (w) ≡ , V2 =u2 + w2: 0 ≤ u,w ≤ V
[Link](w) [Link] (w)
, w ∈ [0, V ], s ∈ (1,+∞ )
1 1 K 1 (w)
TM; t 0 (u, w, s) = 2 g 0 (w) = − 2
s s w.K 0 (w)
- K 0 (w) - K 0 (w ) −1
LP; m = 0, − g -1 ( w ) = = = 2 1
, w ∈ [0, V ]
w.K −1 ( w ) w.K 1 ( w ) w .g ( w )
m −1 - K m (w )
m ≥ 1, − g ( w ) =
w.K m −1 ( w )
Se puede demostrar que todas estas funciones valen -∞ cuando w = 0, tienen
signo negativo y son monótonas decrecientes en todo el rango de definición.
Para V = 10.
0 2 4 6 8 10
0.1
− K0 ( w( u) )
0.2
w( u) ⋅ K1 ( w( u) )
− K1 ( w( u) )
0.3
w( u) ⋅ K0 ( w( u) )
− Kn ( 3 , w( u) )
w( u) ⋅ Kn ( 2 , w( u) ) 0.4
0.5
0.6
46
Modos EH:
Cuando u → 0+ y w → V-:
s 2 + 1 K l +1 (V)
t l (0, V, s) = −
2.s 2 V.K l (V)
lim t l (0, V, s) = - ∞
V →0 +
Cuando w → 0+ y u → V-:
t l (V,0, s) = −∞
0 2 4 6 8 10
0.2
t3 ( 10 , u) 0.4
t3 ( 8 , u)
t3 ( 4 , u)
0.6
0.8
Modos HE:
Cuando u → 0+ y w → V-:
s 2 + 1 K l −1 (V)
t l (0, V, s) =
2.s 2 V.K l (V)
+∞ l =1
2
lim t l (0, V, s) = s + 1 1
V →0 + l≥2
2.s 2 2.(l − 1)
Cuando w → 0+ y u → V-:
+∞ l =1
t (V,0, s) =
l
1
l≥2
(l − 1).(s 2 + 1)
47
Representamos tl=2(u,w,s=1.001) para las frecuencias adimensionales V = 4,8 y 10.
0.35
0.3
t2 ( 10 , u)
0.25
t2 ( 8 , u)
t2 ( 4 , u) 0.2
0.15
0.1
0.05
0 2 4 6 8 10
u
Con estos datos basta con una simple inspección para comprobar la validez del criterio.
48
orden alto en la expansión de Taylor de f tengan significado. Estos algoritmos dan buena
precisión, pero con el coste de bastantes evaluaciones de f.
f(x + h) − f(x)
Otro método parte de la definición de derivada: f ′(x) = lim y utiliza el
h→0 h
acercamiento diferido al límite de Richardson, que consiste en extrapolar el valor del límite,
y por tanto, de la derivada, mediante el cálculo de diferencias finitas con valores de h cada
vez menores. Mediante el algoritmo de Neville, cada nuevo cálculo de diferencias finitas
nos permite obtener una extrapolación de orden superior y extrapolaciones de los ordenes
anteriores pero con h menor.
El algoritmo nos devuelve una estimación del error cometido, que intentaremos hacer
menor que una cierta precisión requerida. Hemos de suministrarle como valor de entrada
una estimación del parámetro xc. El error depende de lo bien que estimemos este parámetro.
Típicamente, el error se hace menor al ir creciendo xc, hasta que alcanzamos un punto a
partir del cual, la extrapolación da valores absurdos y, por tanto, errores muy grandes. Por
ello, para nuestra estimación, utilizaremos valores iniciales muy pequeños para ir
aumentándolos hasta alcanzar la precisión requerida, o bien, llegar a un punto en que
llegamos a un error grande, lo cual indica que no podemos alcanzar la precisión pedida.
Este algoritmo es relativamente lento, por lo que no nos va a interesar para calcular de
las derivadas de los puntos, sino sólo para obtener las condiciones de contorno para la
interpolación, (derivada en los extremos del intervalo de trabajo).
s =1
V
Tenemos que b(V,s) = 2
( )
w
1 + s − 1 . − 1
2
V
s >1
s −1
18
Es, dentro de los polinomios de un mismo grado, aquel con la menor desviación máxima respecto a la
función de referencia en el intervalo de trabajo.
49
Para s = 1, partimos de la expresión para s > 1, desarrollamos la raíz en series de Taylor
alrededor del origen, pues 0 ≤ w/V ≤ 1 y cuando s → 1, s2-1 → 0 y tomamos límite s → 1.
d(V.b(V)) d 2 (V.b(V))
V
dV V = Vc dV 2 V = Vc
LP0,k 0 0
HE1,k 0 0
LP1,k 0 +∞
TE0,k 0 +∞
TM0,k 0 +∞
HE2,k 0 +∞
LPm,k m −1 (m − 1)(m + 2)
2 2
m≥2 m m2
2.( l + 1) + [1 + A ]
2
EHl,k A
(s + 1) (s + 1).A
l≥1 1+ A [1 + A ]3
HEl,k [
(s + 1). B + Vc2 ] E
l≥3 B − C + (1 − D).V c2
l s2 + 1
Donde: A= , B = (l-1)2.(s4-1), C = (l-1).(s2-1)2
2 s2
s2 + 1 (s 2 − 1) 2 s2 −1
2
D= 2 + 2 .( l − 2) − (s 2 + 1) 2
8.s 2 .( l − 2) l s +1
E = E(s,l,Vc); 0 < E < +∞. No nos interesa conocer el valor de E, nos basta
con saber que es un número finito.
50
derivadas y nos da cotas del error cometido en la interpolación. Optamos por los splines
cúbicos pues se calculan de forma eficiente19 y están bien documentados.
Una vez decidido el tipo de interpolación se nos plantea como disponemos los puntos
de interpolación. Esto es importante, ya que se puede obtener una precisión dada con el
mínimo de puntos y manejar un sistema menor y de más rápida resolución. El problema es
que para elegir adecuadamente la disposición hay que tener información de cómo se porta
la función en el rango de trabajo. Para ello utilizaríamos unos pocos puntos equiespaciados,
para tener idea del comportamiento. Con esta información hay un algoritmo que halla la
disposición óptima. Para ello son necesarios tres pasos: interpolación burda, calculo de la
disposición óptima de puntos y por último la interpolación fina con el mínimo número de
puntos. Otra opción es utilizar una partición fina de puntos equiespaciados.
Optamos por la segunda opción, pues en nuestro caso, es más rápido y sencillo de esta
forma. El número de puntos viene dictado por la cota del error de interpolación, con la
salvedad de los modos cuya derivada segunda en el corte es infinita (LP1,k, TE0,k, TM0,k y
HE2,k), o bien vale 0 (LP0,k y HE1,k) y en el modo HE3,1. Para estos, en la zona cercana al
corte, usaremos la máxima densidad de puntos, sea cual sea la precisión de trabajo.
19
La interpolación polinómica sobre n puntos implica resolver un sistema cuadrado de orden n y el algoritmo
tendrá un orden de complejidad O(n2), pero en los splines cúbicos cada punto está acoplado sólo con el
intervalo que lo contiene y los dos vecinos, lo que nos lleva a un sistema cuadrado tridiagonal, con diagonal
dominante y el algoritmo pasa a tener una complejidad de O(n). Para simplificar el algoritmo, hemos tenido
en cuenta que el sistema es de diagonal dominante, o sea, |ai,i| > |ai-1,i| + |ai,i+1|, ∀i= 1,2,...,n. Esta propiedad
garantiza que, en la sustitución hacia delante, no aparecerá ningún pivote nulo y que no habrá que pivotear.
51
interpolación de la derivada k-esima.20. Hemos usado esta fórmula incluso para el caso de
usar condiciones del tipo 2 en ambos extremos, ya que no disponíamos de más información
y estamos en el lado de la seguridad.
Partimos con n = 2, la colección de puntos sólo contiene los extremos del intervalo de
trabajo, comprobamos si la diferencia, en el punto medio, entre el valor real y el valor de la
recta que une los extremos es menor que la resolución gráfica;
Así sucesivamente hasta cubrir todo el rango de trabajo. Como último detalle hemos de
resaltar que este método funciona bien excepto si hay un punto de inflexión dentro del
rango de trabajo. Para evitar este problema, en lugar de empezar sólo con dos puntos, en
realidad partimos de una colección que contiene a los extremos y a varios puntos
equiespaciados del interior. La cantidad de puntos iniciales en la colección es función de la
anchura del rango de trabajo.
Con este método nos ahorramos hasta un 50% de puntos para la misma calidad de
representación y el componente MSChart se actualiza y redibuja muchísimo más rápido,
ahorrando mucho más tiempo del que se tarda en calcular los puntos de la representación.
20
En estas circunstancias, la máxima densidad de puntos corresponde a la máxima precisión alcanzable por el
programa.
Registrado por Microsoft Corporation.
52
3.8 REFERENCIA BIBLIOGRÁFICA
Adjuntamos una breve reseña bibliográfica para profundizar en las consultas, indicando
los temas que se han consultado en cada libro.
- ELF and GNOME: Two tiny codes to evaluate the real zeros of the Bessel functions of
the firs kind for real orders.
J. Segura, A. Gil
Computer Physics Communications 117 (1999), 250-260.
• Obtención de los ceros de las funciones de Bessel de primera clase Js(x) = 0
53