Risoluzione di equazioni differenziali complesse con ParametricNDSolveValue
Sto cercando di risolvere una complessa equazione differenziale per la funzione $S(u,v)$ a seconda del parametro $\omega$. Il codice è:
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}, ω]
Ottengo l'errore
ParametricNDSolveValue :: mconly: "Per il metodo! (" IDA "), è disponibile solo codice macchina reale. Impossibile continuare con valori complessi o oltre le eccezioni a virgola mobile"
Quindi sembra che Mathematica si aspetti numeri reali, ma invece trova numeri complessi. Come posso risolvere l'equazione differenziale?
Risposte
Questa domanda può essere affrontata risolvendo per Zanziché S, suddividendo la PDE nelle sue parti reali e immaginarie e successivamente costruendo Sse lo si desidera.
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}]
Due note. In primo luogo, gli intervalli di integrazione di ue vsono stati notevolmente ridotti, perché altrimenti la soluzione cresce esponenzialmente e Plot3Dnon riesce. Secondo, usare al ParametricNDSolveValueposto di SetDelayede NDSolveValuecausa il crash del kernel.