Lösen komplexer Differentialgleichungen mit ParametricNDSolveValue

Aug 18 2020

Ich versuche eine komplexe Differentialgleichung für die Funktion zu lösen $S(u,v)$ abhängig vom Parameter $\omega$. Der Code lautet:

ClearAll["Global`*"]
m = 100;
L = 2;
r[u_, v_] = 2 m (1 + ProductLog[- ((u v)/E)]);
F[u_, v_] = (32 m^3)/r[u, v]^3 Exp[-(r[u, v]/(2 m))];
Vz[u_, v_] = FullSimplify [-2 (D[F[u, v], u] D[F[u, v], v])/F[u, v] + 
    4 D[r[u, v], u, v]/r[u, v] + 2/F[u, v] D[F[u, v], u, v] + 
    2/F[u, v] D[F[u, v], u] D[r[u, v], v] + 
    2/F[u, v] D[F[u, v], v] D[r[u, v], u]];
Z[u_, v_] = Exp[-I (u + v)/2 ω] S[u, v];
sol = ParametricNDSolveValue[{D[Z[u, v], u, v] + 
     F[u, v] (L (L + 1))/r[u, v]^2 Z[u, v] + Z[u, v] Vz[u, v] == 0, 
   S[u, -1] == 1, S[1, v] == 1}, 
  S, {u, 1, 100}, {v, -100, -1}, ω]

Ich bekomme den Fehler

ParametricNDSolveValue :: mconly: "Für die Methode! (" IDA ") ist nur realer Maschinencode verfügbar. Komplexe Werte oder Gleitkomma-Ausnahmen können nicht fortgesetzt werden."

Es scheint also, dass Mathematica reelle Zahlen erwartet, aber stattdessen komplexe Zahlen findet. Wie kann ich die Differentialgleichung lösen?

Antworten

1 bbgodfrey Aug 20 2020 at 03:56

Diese Frage kann gelöst werden , indem die PDE Zeher gelöst als aufgeteilt S, in ihre Real- und Imaginärteile aufgeteilt und später, Sfalls gewünscht, konstruiert wird.

solr[ω_] := NDSolveValue[{D[Z[u, v], u, v] + 
    F[u, v] (L (L + 1))/r[u, v]^2 Z[u, v] + Z[u, v] Vz[u, v] == 0, 
    Z[u, -1] == Cos[1/2 (-1 + u) ω], Z[1, v] == Cos[1/2 (1 + v) ω]}, 
    Z, {u, 1, 2}, {v, -2, -1}]
soli[ω_] := NDSolveValue[{D[Z[u, v], u, v] + 
    F[u, v] (L (L + 1))/r[u, v]^2 Z[u, v] + Z[u, v] Vz[u, v] == 0, 
    Z[u, -1] == -Sin[1/2 (-1 + u) ω], Z[1, v] == -Sin[1/2 (1 + v) ω]}, 
    Z, {u, 1, 2}, {v, -2, -1}]

zr = solr[1];
Plot3D[zr[u, v], {u, 1, 2}, {v, -2, -1}, PlotRange -> All, 
    ImageSize -> Large, AxesLabel -> {u, v, z}, LabelStyle -> {15, Black, Bold}]

zi = soli[1];
Plot3D[zi[u, v], {u, 1, 2}, {v, -2, -1}, PlotRange -> All, 
    ImageSize -> Large, AxesLabel -> {u, v, z}, LabelStyle -> {15, Black, Bold}]

Zwei Noten. Erstens wurden die Integrationsbereiche von uund vstark reduziert, da die Lösung ansonsten exponentiell groß wird und Plot3Dfehlschlägt. Zweitens führt die Verwendung von ParametricNDSolveValueanstelle von SetDelayedund NDSolveValuezum Absturz des Kernels.