Como posso plotar o campo gradiente em coordenadas bipolares?

Sep 10 2020

como posso plotar o gradiente da função V de acordo com o programa anexado em coordenadas bipolares. Usei do ParametricPlot para mostrar as coordenadas bipolares como:

Show[ParametricPlot[
  Evaluate[Table[
    Tooltip[{Sinh[v]/(Cosh[v] - Cos[u]), Sin[u]/(Cosh[v] - Cos[u])}, 
     Row[{"u \[LongEqual] ", u}]], {u, 0, 2 Pi, Pi/10}]], {v, -1, 1}],
  ParametricPlot[
  Evaluate[Table[
    Tooltip[{Sinh[v]/(Cosh[v] - Cos[u]), Sin[u]/(Cosh[v] - Cos[u])}, 
     Row[{"v \[LongEqual] ", v}]], {v, -1, 1, 1/10}]], {u, Pi/100, 
   2 Pi}]]

Agora, quero calcular o gradiente da função V, que é definida como:

NN = 150;
V0 = 5;
tau0 = 0.5;
V = V0*Sqrt [2*(Cosh [tau] - Cos [sigma])]*(
   LegendreQ[0 - 1/2, Cosh [tau0]]*LegendreP[0 - 1/2, Cosh [tau]]*
   Cos [0*sigma]/LegendreP[0 - 1/2, Cosh [tau0]] + 
    2*Sum[LegendreQ[n - 1/2, Cosh [tau0]]*LegendreP[n - 1/2, Cosh [tau]]*
     Cos [n*sigma]/LegendreP[n - 1/2, Cosh [tau0]], {n, 1, NN}])/Pi;

Depois de tirar o gradiente, quero mostrar os resultados em coordenadas bipolares. O resultado da amostra é mostrado a seguir.

[! [insira a descrição da imagem aqui] [3]] [3]

Respostas

2 yawnoc Sep 11 2020 at 15:57

Prelúdio: coordenadas bipolares

eu uso $(u, v)$ ao invés de $(\sigma, \tau)$ao longo. A transformação é dada por$$\begin{align*} x &= \frac{\sinh v}{\cosh v - \cos u} \\ y &= \frac{\sin u}{\cosh v - \cos u}.\end{align*}$$

Não tão conhecida é a transformação inversa (que precisaremos para plotagem):$$\begin{align*} u &= \tan^{-1} \frac{2y}{x^2 + y^2 - 1} \\ v &= \tanh^{-1} \frac{2x}{x^2 + y^2 + 1}.\end{align*}$$

Os fatores de escala (coeficientes de Lamé) para ambas as coordenadas são os mesmos:$$ h_u = h_v = h = \frac{1}{\cosh v - \cos u}.$$

A base ortonormal local está relacionada à base cartesiana padrão de acordo com$$\begin{align*} \mathbf{a}_u &= h (-S \,\mathbf{a}_x + C \,\mathbf{a}_y) \\ \mathbf{a}_v &= h (-C \,\mathbf{a}_x - S \,\mathbf{a}_y), \\\end{align*}$$ Onde $$\begin{align*} C &= \cos u \cosh v - 1 \\ S &= \sin u \sinh v.\end{align*}$$

Implementando isso no Mathematica:

(* Coordinate transformations *)
xBipolar[u_, v_] := Sinh[v] / (Cosh[v] - Cos[u]);
yBipolar[u_, v_] := Sin[u] / (Cosh[v] - Cos[u]);

(* Inverse coordinate transformations *)
uBipolar[x_, y_] := ArcTan[x^2 + y^2 - 1, 2 y];
vBipolar[x_, y_] := ArcTanh[2 x / (x^2 + y^2 + 1)];
uvBipolar[x_, y_] := {uBipolar, vBipolar} @@ {x, y} // Through // Evaluate;

(* Scale factors (both are the same) *)
hBipolar[u_, v_] := 1 / (Cosh[v] - Cos[u]);

(* Abbreviations *)
cBipolar[u_, v_] := Cos[u] Cosh[v] - 1;
sBipolar[u_, v_] := Sin[u] Sinh[v];

(* Cartesian components of local orthonormal basis *)
uVectorBipolar[u_, v_] := hBipolar[u, v] {-sBipolar[u, v], cBipolar[u, v]} // Evaluate;
vVectorBipolar[u_, v_] := hBipolar[u, v] {-cBipolar[u, v], -sBipolar[u, v]} // Evaluate;

Função

Eu peguei $v_0 = 1$. Nós temos$$ \frac{V}{V_0} = \sum_{n = 0}^\infty \frac{1}{\pi} \sqrt{2 (\cosh v - \cos u)} \cdot \lambda_n \cdot \frac{Q_{n-1/2}(\cosh v_0)}{P_{n-1/2}(\cosh v_0)} \cdot P_{n-1/2}(\cosh v) \cos (n u).$$

(* lambda-bar *)
lambdaBar[0] = 1;
lambdaBar[n_] /; n > 0 = 2;

(* Expansion terms *)
v0 = 1;
term[n_][u_, v_] := (
  1 / Pi
  Sqrt[2 (Cosh[v] - Cos[u])]
  lambdaBar[n]
  LegendreQ[n - 1/2, Cosh[v0]] / LegendreP[n - 1/2, Cosh[v0]]
  LegendreP[n - 1/2, Cosh[v]]
  Cos[n u]
);

(* Partial sum for V/V_0 *)
partialSum[nMax_][u_, v_] := Sum[term[n][u, v], {n, 0, nMax}];

Como mencionado nos comentários, o LegendreQfator não é real, então pegamos a parte real.

Primeiro, descobrimos quantos termos precisamos traçar; Estou supondo que a condição de contorno que dá origem à série de Fourier é$V/V_0 = 1$ ao longo do círculo $v = v_0$:

nMaxValues = {0, 1, 2, 5};

Plot[
  Table[
    partialSum[nMax][u, v0] // Re
    , {nMax, nMaxValues}
  ] // Evaluate
  , {u, 0, 2 Pi}
  , PlotLegends -> LineLegend[nMaxValues, LegendLabel -> "nMax"]
]

Vemos que 5 termos são suficientes. Certamente não precisamos de 150.

(* Assume function intended for v < v_0 only *)
regionFun = Function[{x, y}, Abs[vBipolar[x, y]] < v0];

(* Plot V/V_0 *)
Plot3D[
  partialSum[5] @@ uvBipolar[x, y] // Re // Evaluate
  , {x, -3, 3}, {y, -3, 3}
  , Exclusions -> None
  , RegionFunction -> regionFun
]

Gradiente

Em seguida, pegamos o gradiente. Na verdade, tirar a derivada de uma série de Fourier não é trivial . o$u$-derivado de $\cos(nu)$ introduz um fator extra de $n$, e se os coeficientes não chegarem a zero rápido o suficiente, a derivada termo a termo não convergirá. Neste caso, porém, os coeficientes de não ir para rápido o suficiente zero para nós a tomar um derivado termo a termo.

Primeiro definir $\partial V / {\partial u}$ e $\partial V / {\partial v}$:

(* Derivatives of expansion terms *)
termUDerivative[n_][u_, v_] := D[term[n][u, v], u] // Evaluate;
termVDerivative[n_][u_, v_] := D[term[n][u, v], v] // Evaluate;

(* Derivatives partial sum *)
partialSumUDerivative[nMax_][u_, v_] := Sum[termUDerivative[n][u, v], {n, 0, nMax}];
partialSumVDerivative[nMax_][u_, v_] := Sum[termVDerivative[n][u, v], {n, 0, nMax}];

Uma vez que os fatores de escala para ambas as coordenadas são iguais, o gradiente é dado por $$ \nabla V = \frac{1}{h} \left( \frac{\partial V}{\partial u} \,\mathbf{a}_u + \frac{\partial V}{\partial v} \,\mathbf{a}_v \right):$$

(* Partial sum for gradient of V/V_0 *)
gradientPartialSum[nMax_][u_, v_] :=
  1 / hBipolar[u, v] * Plus[
    partialSumUDerivative[nMax][u, v] uVectorBipolar[u, v],
    partialSumVDerivative[nMax][u, v] vVectorBipolar[u, v]
  ];

Finalmente, podemos plotar o gradiente (eu escolhi StreamPlotporque as VectorPlotsetas são muito pequenas):

Show[
  ContourPlot[
    partialSum[5] @@ uvBipolar[x, y] // Re // Evaluate
    , {x, -3, 3}, {y, -3, 3}
    , AspectRatio -> Automatic
    , ContourShading -> None
    , Exclusions -> None
    , RegionFunction -> regionFun
  ],
  StreamPlot[
    gradientPartialSum[5] @@ uvBipolar[x, y] // Re // Evaluate
    , {x, -3, 3}, {y, -3, 3}
    , RegionFunction -> regionFun
  ]
]