When solving an eigenvalue problem with "NDEigensystem", e.g. a 1D Eigenvalue problem with the interval composed of different materials, which should be solved by the pure numerical method such as FEM, is it necessary to assign the locations of the interface points? In fact, for FEM we know that the interface points should be the element boundary nodes. For example, the code assigning the interface positions is
(*This seems to be incorrect.*)
Needs["NDSolve`FEM`"]
a1 = 0.1; a2 = 0.2; a3 = 0.3; a4 = 0.4; b = 0.7; sigma0 = 37*10^6;
omega = 2*10^3*Pi; mu0 = 4*10^-7*Pi;
sigma = If[a1 <= r <= a2 || a3 <= r <= a4, sigma0, 0];
bm = ToBoundaryMesh[
"Coordinates" -> {{0}, {a1}, {a2}, {a3}, {a4}, {b}},
"BoundaryElements" -> {PointElement[{{1}, {2}, {3}, {4}, {5}, {6}}]}];
bm["Wireframe"]
rm = ToElementMesh[bm, "MeshOrder" -> 2, MaxCellMeasure -> 0.0001];
L = psi''[r] + psi'[r]/r - (1/r^2 + I*omega*sigma*mu0)*psi[r];
B = DirichletCondition[psi[r] == 0, True];
{vals, funs} = NDEigensystem[{L,B}, psi[r], {r} \[Element] rm, 10];
lambda = b*Sqrt[-vals];
Sort[lambda, Re@#1 < Re@#2 &] // Chop
The result is
{7.41524625842434, 14.704889375535174, 22.0208051310379, 22.126560466486964, 26.8219477734735, 29.343851509902485, 36.669818648850374, 43.99726563353401, 44.051491607409865, 49.10916810233282}
.
I think this is a wrong result, since the eigenvalues should be complex numbers. Another code coping with the same problem is
(*This seems to be resonable.*)
a1 = 0.1; a2 = 0.2; a3 = 0.3; a4 = 0.4; b = 0.7; sigma0 =37*10^6;
omega = 2*10^3*Pi; mu0 = 4*10^-7*Pi;
sigma = If[a1 <= r <= a2 || a3 <= r <= a4, sigma0, 0];
L = psi''[r] + psi'[r]/r - (1/r^2 + I*omega*sigma*mu0)*psi[r];
B = DirichletCondition[psi[r] == 0, True];
{vals, funs} = NDEigensystem[{L,B}, psi[r], {r, 0, b}, 10, Method ->
{"PDEDiscretization"-> {"FiniteElement", "MeshOptions"->
{"MaxCellMeasure"-> 0.0001,"MeshOrder"-> 2}}}];
lambda = b*Sqrt[-vals];
Sort[lambda, Re@#1 < Re@#2 &] // Chop
This code gives the reasonable result in my opinion:
{7.383877183370188 + 0.031093165122796473 I,
14.641300240427059 + 0.0630628542925003 I,
21.5557952622858 + 0.5427490911070447 I,
21.92517611601835 + 0.09489510794076031 I,
26.471413185406863 + 0.34211325835858836 I,
29.216261799663346 + 0.1267126418808621 I,
36.510328314631025 + 0.15855627905576822 I,
42.90614817349877 + 1.09274892501598 I,
43.80593433114688 + 0.19044807206663805 I,
48.46846289924706 + 0.6276371418796622 I}
If this is correct, that should imply the method "PDEDiscretization" can handle the interface automatically. So could anybody give some comments?
Comments
Post a Comment