Integración anidada con FindRoot
Estoy tratando de integrar numéricamente una función usando NIntegrate anidado:
$$F(N,x,s)=\int_{-\infty}^s \int_{-\infty}^{+\infty} K(N,z',x,x') g_{x',s'} dx'ds' $$
donde el núcleo de la integración, $K(N,z'x,x')$, es una expresión confusa definida en el código de mathica a continuación, y $g_{x',s'}$ es un gaussiano bivariable definido por:
$$ g_{x,s'}=\frac{n}{2\pi\sigma_{x'}\sigma_{s'}}\exp\left({ -\frac{x'^2}{2\sigma_{x'}^2} }\right)\exp\left({ -\frac{s'^2}{2\sigma_{s'}^2} }\right).$$
La (s) parte (s) complicada es que:
- $z'$ en el $K(N,z',x,x')$ necesita ser resuelto para usar numéricamente FindRoot y tendrá un $s'$ dependencia.
- El límite superior de integración sobre $ds'$ es una variable $s$.
- Sospecho que el kernel es oscilatorio con $N$ (denotado "Kernel" en el código de abajo) así que tal vez un promedio del kernel sobre $N$ se puede hacer para simplificar el kernel y eliminar $N$ si las integraciones llevan demasiado tiempo.
Al final, me gustaría una función, F (N, x, s), que pudiera trazar $s$ para una dada $(N,x)$ valores, es decir, Plotear [F [a, b, s, {s, -1e-5,1e-5}].
(*Constants*)
e = -1.60217733*10^-19;
m = 9.109389699999999*10^-31;
epsilon = 8.854187817620391*10^-12;
re = 2.81794092*10^-15;
c = 2.99792458*10^8;
n = -10^-10/e;
KK = 1;
lw = 0.026;
kw = (2 Pi)/lw;
gamma = 4000/0.511;
beta = Sqrt[1 - 1/gamma^2];
sigmaS = 10^-5;
sigmaX = 30*10^-6;
coeff = n/(2 Pi*sigmaS*sigmaX) Exp[-(xprime^2/(2 sigmaX^2))]*
Exp[-(sprime^2/(2 sigmaS^2))];
(*Preliminary Equations*)
rs2 = {zprime, xprime + KK/(gamma*kw) Sin[kw*zprime], 0};
ro2 = {(NN + 10000)*lw, x + KK/(gamma*kw) Sin[kw*(NN + 10000)*lw], 0};
betas = {beta - KK^2/(2 gamma^2) Cos[kw*zprime]^2,KK/gamma Sin[kw*zprime], 0};
betao = {beta - KK^2/(2 gamma^2) Cos[kw*(NN + 10000)*lw]^2,KK/gamma Sin[kw*(NN + 10000)*lw], 0};
betaDot = {(c*KK^2*kw)/(2 gamma^2)Sin[2 kw*zprime], -((KK*c*kw)/gamma) Sin[kw*zprime], 0};
deltar2 = ro2 - rs2;
Rgam2 = Sqrt[deltar2[[1]]^2 + deltar2[[2]]^2];
Ec2 = (e/(4 Pi*epsilon)) (deltar2/Rgam2 - betas)/(gamma^2 Rgam2^2 (1 - (deltar2/Rgam2).betas)^3);
Erad2 = (e/(4 Pi*epsilon)) Cross[deltar2/Rgam2,Cross[deltar2/Rgam2 - betas, betaDot]]/(c*Rgam2*(1 - (deltar2/Rgam2).betas)^3);
sumElong = (Ec2[[1]] + Erad2[[1]]);
sumEtran = (Ec2[[2]] + Erad2[[2]]);
(*Numerical Functions*)
ZPRIME[NN_?NumericQ, x_?NumericQ, xprime_?NumericQ, s_?NumericQ, sprime_?NumericQ] := zprime /.FindRoot[s - sprime == (Sqrt[gamma^2 + KK^2] (EllipticE[kw*(NN + 10000)*lw,KK^2/(gamma^2 + KK^2)] - EllipticE[kw zprime, KK^2/(gamma^2 + KK^2)]))/(gamma kw) -beta Sqrt[((NN + 10000)*lw - zprime)^2 + (x - xprime + (KK Sin[kw *(NN + 10000)*lw])/(gamma kw) - (KK Sin[kw zprime])/(gamma kw))^2], {zprime, 0}]
Kernel = coeff re/gamma (sumElong*betao[[1]] + sumEtran*betao[[2]])/.{zprime -> ZPRIME[NN, x, xprime, s, sprime]};
FNxprimesprime[NN_?NumericQ, x_?NumericQ, xprime_?NumericQ, s_?NumericQ, sprime_?NumericQ]:= Kernel
FNsprime[NN_?NumericQ, x_?NumericQ, s_?NumericQ, sprime_?NumericQ] :=NIntegrate[FNxprimesprime[NN, x, xprime, s, sprime], {xprime, -300/10^6, 300/10^6}]
FN[NN_?NumericQ,x_?NumericQ, s_?NumericQ] := NIntegrate[FNsprime[NN,x, s, sprime], {sprime,-10^-4, s}]
lst1 = Table[{ss, FN[0,0, ss], PrecisionGoal -> 5] // Quiet}, {ss, -10^-5, 10^-5, 10^-6}]
ListPlot[lst1]
Respuestas
Este caso no es tan diferente de lo que discutimos aquí . Hemos utilizado el mismo enfoque y obtenemos respuesta
(*Constants*)e = -1.60217733*10^-19;
m = 9.109389699999999*10^-31;
epsilon = 8.854187817620391*10^-12;
re = 2.81794092*10^-15;
c = 2.99792458*10^8;
n = -10^-10/e;
KK = 1;
lw = 0.026;
kw = (2 Pi)/lw;
gamma = 4000/0.511;
beta = Sqrt[1 - 1/gamma^2];
sigmaS = 10^-5;
sigmaX = 30*10^-6;
coeff = n/(2 Pi*sigmaS*sigmaX) Exp[-(xprime^2/(2 sigmaX^2))]*
Exp[-(sprime^2/(2 sigmaS^2))];
(*Preliminary Equations*)
rs2 = {zprime, xprime + KK/(gamma*kw) Sin[kw*zprime], 0};
ro2 = {(NN + 10000)*lw, x + KK/(gamma*kw) Sin[kw*(NN + 10000)*lw], 0};
betas = {beta - KK^2/(2 gamma^2) Cos[kw*zprime]^2,
KK/gamma Sin[kw*zprime], 0};
betao = {beta - KK^2/(2 gamma^2) Cos[kw*(NN + 10000)*lw]^2,
KK/gamma Sin[kw*(NN + 10000)*lw], 0};
betaDot = {(c*KK^2*kw)/(2 gamma^2) Sin[
2 kw*zprime], -((KK*c*kw)/gamma) Sin[kw*zprime], 0};
deltar2 = ro2 - rs2;
Rgam2 = Sqrt[deltar2[[1]]^2 + deltar2[[2]]^2];
Ec2 = (e/(4 Pi*epsilon)) (deltar2/Rgam2 -
betas)/(gamma^2 Rgam2^2 (1 - (deltar2/Rgam2).betas)^3);
Erad2 = (e/(4 Pi*epsilon)) Cross[deltar2/Rgam2,
Cross[deltar2/Rgam2 - betas, betaDot]]/(c*
Rgam2*(1 - (deltar2/Rgam2).betas)^3);
sumElong = (Ec2[[1]] + Erad2[[1]]);
sumEtran = (Ec2[[2]] + Erad2[[2]]);
(*Numerical Functions*)
ZPRIME[NN_?NumericQ, x_?NumericQ, xprime_?NumericQ, s_?NumericQ,
sprime_?NumericQ] :=
zprime /.
FindRoot[s -
sprime == (Sqrt[
gamma^2 +
KK^2] (EllipticE[kw*(NN + 10000)*lw,
KK^2/(gamma^2 + KK^2)] -
EllipticE[kw zprime, KK^2/(gamma^2 + KK^2)]))/(gamma kw) -
beta Sqrt[((NN + 10000)*lw - zprime)^2 + (x -
xprime + (KK Sin[kw*(NN + 10000)*lw])/(gamma kw) - (KK Sin[
kw zprime])/(gamma kw))^2], {zprime, 0}]
kernel = coeff re/gamma (sumElong*betao[[1]] + sumEtran*betao[[2]]);
FN[nn_?NumericQ, x0_?NumericQ, ss_?NumericQ] :=
NIntegrate[
Evaluate[(kernel /.
zprime -> ZPRIME[NN, x, xprime, s, sprime]) /. {NN -> nn,
x -> x0, xprime -> xp, s -> ss, sprime -> sp}], {xp, -300/10^6,
300/10^6}, {sp, -10^-4, ss}, PrecisionGoal -> 6] // Quiet
Ahora podemos calcular y trazar listas
lst1 = Table[{ss, FN[0., 0, ss]}, {ss, -10^-5, 10^-5, .5 10^-6}];
lst2 = Table[{ss, FN[1., 0, ss]}, {ss, -10^-5, 10^-5, .5 10^-6}];
ListLinePlot[{lst1, lst2}, PlotRange -> All,Frame -> True]