Système PDE couplé en physique atomique
Ma question concerne la mise en œuvre d'un système de PDE couplés à la routine Mathematicas NDSolve. J'envisage un modèle de jouet unidimensionnel en physique atomique. Le modèle décrit deux champs$\psi =\psi(t,z)$ et $\sigma= \sigma(z;t)$ couplés les uns aux autres ie $$ i \hbar \partial_t \psi = -\frac{\hbar^2 }{2 m} \psi_{zz} +V \psi +\frac{\hbar^2 \alpha_s }{m}\sigma^{-2} \left| \psi \right|^2 \psi+\frac{\hbar^2}{2m }\sigma^{-2}\psi+\frac{1}{2} m \omega_{\perp} \sigma^2 \psi +\frac{\hbar^2 }{2 m} \sigma^{-2}\sigma_z^2 \psi , \\ 0 =-\frac{\hbar^2}{4 m}\sigma \sigma_{zz}+\frac{\hbar^2 }{ m } \sigma^{-3} \sigma_z^2 -\frac{\hbar^2 }{4 m} \sigma \sigma_z \frac{1}{\left| \psi \right|^2} \left(\psi\psi_z^*+\psi^* \psi_z\right)+\frac{\hbar^2}{2 m }\sigma^{-3}-\frac{m \omega_{\perp}}{2} \sigma + 2 \frac{\hbar^2 \alpha_s}{m } \sigma^{-3} \left| \psi \right|^2 $$ J'impose des conditions aux limites périodiques supplémentaires pour $\psi(-L/2,t) = \psi(L/2,t)$ et $\sigma(-L/2,t) = \sigma(L/2,t)$ et fixez quelques conditions initiales $\psi(z,0)=f(z)$ et $\sigma(z,0)=g(z)$.
ÉDITÉ:
Voici ma version actuelle du code
(*constants*)
h = 1; (* Planck constant *)
m = 1; (* particle mass *)
Subscript[\[Alpha], s] = 1; (* scattering length *)
\[Omega] = 1; (* frequency *)
V = 0; (* potential *)
(*ranges*)
L = 2; (*length of the box *)
tmin = 0;
tmax = 0.1;
(*equations*)
eqn1 = I D[\[Psi][z, t], t] == -h^2/(2 m) D[\[Psi][z, t], z, z] +
V \[Psi][z, t] +
h^2 Subscript[\[Alpha], s]/
m \[Sigma][z, t]^(-2) Abs[\[Psi][z, t]]^2 \[Psi][z, t] +
h^2/(2 m) \[Sigma][z, t]^(-2) \[Psi][z, t] +
m \[Omega] /2 \[Sigma][z, t]^2 \[Psi][z, t] +
h^2/(2 m) \[Sigma][z, t]^(-2) D[\[Sigma][z, t], z]^2 \[Psi][z, t];
eqn2 = -h^2/(4 m) \[Sigma][z, t] D[\[Sigma][z, t], z, z] ==
h^2/(2 m) \[Sigma][z, t]^(-3) D[\[Sigma][z, t], z]^2 -
h^2/(4 m) \[Sigma][z, t] D[\[Sigma][z, t], z] /
Abs[\[Psi][z, t]]^2 ( \[Psi][z, t] D[\[Psi][z, t],
z] + \[Psi][z, t] D[\[Psi][z, t], z]) +
h^2/(2 m) \[Sigma][z, t]^(-3) - m \[Omega] /2 \[Sigma][z, t] +
2 h^2 Subscript[\[Alpha], s]/
m \[Sigma][z, t]^(-3) Abs[\[Psi][z, t]]^2;
(*boundary conditions*)
bc = \[Psi][L/2, t] == \[Psi][-L/2, t];
bcwidth = \[Sigma][L/2, t] == \[Sigma][-L/2, t];
(*initial conditions*)
icwidth = \[Sigma][z, 0] == z^2 + 1;
icdwidth = D[\[Sigma][z, t], t] == 2 /. t -> 0;
icwave = \[Psi][z, 0] == Exp[-((z)^2)];
(*solve system*)
sol1 = NDSolve[{eqn1, eqn2, bc, bcwidth , icwave, icwidth,
icdwidth}, {\[Psi], \[Sigma]}, {z, -L/2, L/2}, {t, tmin, tmax},
Compiled -> True, MaxSteps -> {500, Infinity}];
Malheureusement, cela pose deux problèmes, le premier concerne le solveur lui-même, car il n'y a pas de dérivée temporelle dans mon équation pour le deuxième champ $\sigma$ il gère le système comme un DAE et donne ces deux avertissements
NDSolve :: pdord: Certaines des fonctions ont un ordre différentiel nul, donc les équations seront résolues comme un système d'équations différentielles-algébriques. >>
NDSolve :: mconly: Pour la méthode IDA, seul le code réel de la machine est disponible. Impossible de continuer avec des valeurs complexes ou au-delà des exceptions à virgule flottante. >>
Je ne sais pas si c'est un "vrai" problème (j'utilise Mathematica 9.x). Le second est plus problématique, il concerne la quantité de points de grille utilisés. Cela vient principalement des équations elles-mêmes je suppose et provoque une erreur selon laquelle il ne peut pas trouver une solution appropriée dans les limites de tolérance.
NDSolve :: mxsst: Utilisation du nombre maximal de points de grille 500 autorisé par les options MaxPoints ou MinStepSize pour la variable indépendante z. >>
NDSolve :: icfail: impossible de trouver les conditions initiales qui satisfont la fonction résiduelle dans les tolérances spécifiées. Essayez de donner des conditions initiales pour les valeurs et les dérivées des fonctions. >>
J'ai également essayé de lui donner des données initiales supplémentaires comme suggéré par le message d'erreur mais sans succès. La question La chose que je ne sais pas, c'est s'il y a un potentiel pour améliorer mon code, ou si une mise à niveau vers une version plus récente de Mathematica résoudrait le problème ou dans le pire des cas, c'est un système "trop laid" pour un traitement numérique.
Réponses
Pour résoudre ce genre de problèmes, nous pouvons diviser la fonction d'onde en deux parties $\psi=\psi_1+i\psi_2$. Nous utilisons également certaines options pour NDSolve
résoudre ce problème. Supposons que$\sigma$ est réel, alors nous avons
(*constants*)h = 1;(*Planck constant*)m = 1;(*particle mass*)
Subscript[\[Alpha],
s] = 1;(*scattering length*)\[Omega] = 1;(*radial frequency*)V = \
0;(*longitudinal potential*)(*ranges*)L = 2;(*length of the box*)tmin \
= 0;
tmax = 0.1;
(*equations*)
eqn1 = { D[\[Psi]1[z, t], t] == -h^2/(2 m) D[\[Psi]2[z, t], z, z] +
V \[Psi]2[z, t] +
h^2 Subscript[\[Alpha], s]/
m \[Sigma][z,
t]^(-2) (\[Psi]1[z, t]^2 + \[Psi]2[z, t]^2) \[Psi]2[z, t] +
h^2/(2 m) \[Sigma][z, t]^(-2) \[Psi]2[z, t] +
m \[Omega]/2 \[Sigma][z, t]^2 \[Psi]2[z, t] +
h^2/(2 m) \[Sigma][z, t]^(-2) D[\[Sigma][z, t], z]^2 \[Psi]2[z,
t], - D[\[Psi]2[z, t],
t] == -h^2/(2 m) D[\[Psi]1[z, t], z, z] + V \[Psi]1[z, t] +
h^2 Subscript[\[Alpha], s]/
m \[Sigma][z,
t]^(-2) (\[Psi]1[z, t]^2 + \[Psi]2[z, t]^2) \[Psi]1[z, t] +
h^2/(2 m) \[Sigma][z, t]^(-2) \[Psi]1[z, t] +
m \[Omega]/2 \[Sigma][z, t]^2 \[Psi]1[z, t] +
h^2/(2 m) \[Sigma][z, t]^(-2) D[\[Sigma][z, t], z]^2 \[Psi]1[z,
t]};
eqn2 = -h^2/(4 m) \[Sigma][z, t] D[\[Sigma][z, t], z, z] ==
h^2/(2 m) \[Sigma][z, t]^(-3) D[\[Sigma][z, t], z]^2 -
h^2/(4 m) \[Sigma][z,
t] D[\[Sigma][z, t],
z]/(\[Psi]1[z, t]^2 + \[Psi]2[z,
t]^2) (D[(\[Psi]1[z, t]^2 + \[Psi]2[z, t]^2), z]) +
h^2/(2 m) \[Sigma][z, t]^(-3) - m \[Omega]/2 \[Sigma][z, t] +
2 h^2 Subscript[\[Alpha], s]/
m \[Sigma][z, t]^(-3) (\[Psi]1[z, t]^2 + \[Psi]2[z, t]^2);
(*boundary conditions*)
bc = {\[Psi]1[L/2, t] == \[Psi]1[-L/2, t], \[Psi]2[L/2,
t] == \[Psi]2[-L/2, t]};
bcwidth = \[Sigma][L/2, t] == \[Sigma][-L/2, t];
(*initial conditions*)
icwidth = \[Sigma][z, 0] == z^2 + 1;
icdwidth = D[\[Sigma][z, t], t] == 2 /. t -> 0;
icwave = {\[Psi]1[z, 0] == Exp[-((z)^2)], \[Psi]2[z, 0] == 0};
(*solve system*)
Dynamic["time: " <> ToString[CForm[currentTime]]]
AbsoluteTiming[{Psi1, Psi2, S} =
NDSolveValue[{eqn1, eqn2, bc, bcwidth, icwave,
icwidth}, {\[Psi]1, \[Psi]2, \[Sigma]}, {z, -L/2, L/2}, {t,
tmin, tmax},
Method -> {"IndexReduction" -> Automatic,
"EquationSimplification" -> "Residual",
"PDEDiscretization" -> {"MethodOfLines",
"SpatialDiscretization" -> {"TensorProductGrid",
"MinPoints" -> 81, "MaxPoints" -> 81,
"DifferenceOrder" -> "Pseudospectral"}}},
EvaluationMonitor :> (currentTime = t;)];];
Visualisation de la solution numérique
{Plot3D[Psi1[z, t], {z, -L/2, L/2}, {t, tmin, tmax}, Mesh -> None,
ColorFunction -> "Rainbow", AxesLabel -> Automatic,
PlotLabel -> "Re\[Psi]"],
Plot3D[Psi2[z, t], {z, -L/2, L/2}, {t, tmin, tmax}, Mesh -> None,
ColorFunction -> "Rainbow", AxesLabel -> Automatic,
PlotLabel -> "Im\[Psi]"],
Plot3D[S[z, t], {z, -L/2, L/2}, {t, tmin, tmax}, Mesh -> None,
ColorFunction -> Hue, AxesLabel -> Automatic,
PlotLabel -> "\[Sigma]", PlotRange -> All]}
