Processing math: 100%

5 votos

Computing Airy funciona a través de su serie Taylor.

He estado tratando de encontrar buenos métodos para numéricamente computación funciones de Airy, y he encontrado que para los pequeños argumentos es conveniente el uso de sus series de Taylor de las expansiones:

Ai(z)=132/3πn=0Γ(1/3(n+1))n!(31/3z)nsin[(2(n+1)π)/3]

Bi(z)=131/6πn=0Γ(1/3(n+1))n!(31/3z)n|sin[(2(n+1)π)/3]|

While these expansions are inconvenient for direct implementation, I've modified them in the following way. Let's define some quantities:

C0=Γ(1/3)31/3D0=Γ(2/3)

And recurrence relations:

Ck=Ck13k(3k1)Dk=Dk13k(3k2)

Then the general terms will be:

Ak=z3k(Ckz3k+1Dk)Bk=z3k(Ck+z3k+1Dk)

And finally:

Ai(z)=31/62πk=0Ak

Bi(z)=32/32πk=0Bk

This seems to work great for (approximately) |z|<7 (including complex values) using around 2025 términos de la recurrencia de los grandes argumentos, parece que hay algunas numérica de problemas.


Mis preguntas son las siguientes:

  • Puede este algoritmo se mejoró en algunos de manera obvia para una mejor convergencia y estabilidad, teniendo en cuenta la posibilidad de redondear/cancelación de los errores?

  • Y ¿cuál es la mejor manera para calcular estas funciones para las grandes argumentos? Puede que yo ya uso el asintótica expansiones aparece en algunas fuentes para |z|>7?


El código R hice para este algoritmo:

#Airy functions using series
AiBi <- function(z){
g13 <- 2.678938534707747633655693; #Gamma(1/3)
g23 <- 1.354117939426400416945288; #Gamma(2/3)
Km <- 25; #Number of terms used
C <- 1:Km;
D <- C;
A <- C;
B <- C;
C[1] <- g13/3^(1/3);
D[1] <- g23;
A[1] <- C[1]-D[1]*z;
B[1] <- C[1]+D[1]*z;
k <- 1;
while (k < Km) {k <- k+1;
        C[k] <- C[k-1]/(3*k-3)/(3*k-4);
        D[k] <- D[k-1]/(3*k-3)/(3*k-5);
        A[k] <- z^(3*k-3)*(C[k]-D[k]*z/(3*k-2));
        B[k] <- z^(3*k-3)*(C[k]+D[k]*z/(3*k-2))
};
c(sum(A)*3^(1/6),sum(B)*3^(2/3))/2/pi};
AiBi(pi/exp(1))

Actualización:

Quería señalar una mejora evidente. En lugar de calcular los coeficientes, es mucho mejor utilizar atrás recurrencia. Por ejemplo, para la primera parte de la serie:

f(z)=k=0Ckz3k

Pick some Km large enough, then define (for the sake of simplicity I changed C0=1):

f0=1fk=1+z33(Kmk)(3(Kmk)1)fk1,k=0,1,2,,Km1

This should make the numerical computation faster and more stable (obviously, z3 debe ser precalculadas).

1voto

gammatester Puntos 7985

Esto es demasiado largo para un comentario:

A partir de los gráficos https://dlmf.nist.gov/9.3.i se puede ver que para el real x sólo Bi(x) grandes x>0 puede ser evaluado con el poder de la serie de una manera estable. De lo contrario, la oscilatorio o de manera exponencial pequeñas funciones no son adecuadas para la serie de implementación. Las alternativas dependen de las funciones disponibles:

Para mi biblioteca me encontré con que la serie es mejor sólo para un pequeño xintervalo de 2x1 para Ai(x) e 1x1 para Bi(x) (a pesar de que suma los positivos y los negativos de los términos por separado), de lo contrario, el uso de la relación con las funciones de Bessel. Para x>1 la Ai función se evalúa como (véase el comunicado de Prensa et al, recetas Numérica, Ch. 6.7) con z=(2/3)|x|3/2 Ai(x)=1πx3K1/3(z),x>1 Ai(x)=12x(J1/3(z)13Y1/3(z)),x<2 y

Bi(x)=x(23I1/3(z)+1πK1/3(z)),x>1 Bi(x)=12x(13J1/3(z)+Y1/3(z)),x<1

Para grandes negativo x las funciones de Airy tienen expansiones asintóticas oscilante con cos(z+π/4) o sin(z+π/4), por lo tanto la fase de información se convierte en totalmente confiable para x<(2/ϵ)2/3 (sobre 0.431011 IEEE precisión doble) y el error relativo se incrementa fuertemente para x menos que el cuadrado de la raíz (200000).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X