NDEigensystem in a complicated case

Apologies for a boring question.

I am trying to modify the standard Mathematica example for my needs.

The only differences in my case are:

• A more complicated potential (double-well, grows rapidly).
• I'm interested in small values of $\hbar$.

h = 0.01;
V[x_] := -x^2 + x^6;
\[ScriptCapitalL] = 3^(3/2)/2 (-h^2*u''[x] + V[x]*u[x]);
xmax = 1.2; xmin = -xmax;
{vals, funs} =
NDEigensystem[\[ScriptCapitalL], u[x], {x, xmin, xmax}, 10, Method ->     {"SpatialDiscretization" -> {"FiniteElement", {"MeshOptions" -> {MaxCellMeasure -> 0.05}}}}];
Show[Plot[Evaluate[h*funs + vals], {x, xmin, xmax}],  Plot[V[x], {x, xmin, xmax}], PlotRange -> {{xmin, xmax}, {-.1, .2}},  AxesOrigin -> {-3, 0}]

As you will see, Mathematica is not finding the lowest energies. I'm wondering if anyone could suggest a possible solution. Not sure which options of NDEigensystem to adjust. (Or probably there's a better way to solve the problem).

I am assuming you are concerned about not finding the negative values. NDEigensystem discretizes the PDE and then calls Eigensystem to find the eigenvalues and vectors. If you read the Details and Options section of Eigenvalues you will find the 4th bullet point that states:

"If they [the eigenvalues*] are numeric, eigenvalues are sorted in order of decreasing absolute value."

(*) added my be.

Here are a few things you can try:

You can use the direct solver and get all eigenvalues and vectors.

{vals, funs} =
NDEigensystem[\[ScriptCapitalL], u[x], {x, xmin, xmax}, All,
Method -> {"SpatialDiscretization" -> {"FiniteElement", \
{"MeshOptions" -> {MaxCellMeasure -> 0.1}}},
"Eigensystem" -> {"Direct"}}];

Min[vals]
-0.9482580993140183`

This is slow. As an alternative you could try to shift the eigenvalues:

{vals, funs} =
NDEigensystem[\[ScriptCapitalL], u[x], {x, xmin, xmax}, 10,
Method -> {"SpatialDiscretization" -> {"FiniteElement", \
{"MeshOptions" -> {MaxCellMeasure -> 0.1}}},
"Eigensystem" -> {"Arnoldi", "Shift" -> -1}}];
Min[vals]
-0.948258

And as a third option you could make use of FEAST and try to find the eigenvalues in a specified range:

{vals, funs} =
NDEigensystem[\[ScriptCapitalL], u[x], {x, xmin, xmax}, 25,
Method -> {"SpatialDiscretization" -> {"FiniteElement", \
{"MeshOptions" -> {MaxCellMeasure -> 0.01}}},
"Eigensystem" -> {"FEAST", "Interval" -> {-2.0, 0.}}}];
Min[vals]
-0.948479

In the last case I also made use of a finer grid.

• Amazing! Thank you so much!! – mavzolej Feb 1 '18 at 22:31