5
$\begingroup$

I'm currently using NDEigensystem to solve a PDE that describes a particle travelling on a hyperbolic (negatively curved) surface. However, the eigenfunctions that are returned by NDEigensystem are not what I'm expecting and I firmly believe this is due to the default normalization that NDEigensystem uses.

According to the documentation, NDEigensystem approximately returns eigenfunctions $\psi(x,y)$ that satisfy the condition $$\int_D \psi^* \psi \ dxdy = 1$$ (D denotes the region where the eigenfunction lives). However, on this curved surface, the way that I'm looking to normalize the eigenfunction is through the condition $$\int_D \psi^* \psi \frac{1}{y^2} dx dy$$

How can I implement this condition into NDEigensystem? Reading through the documentation (documentation), I'm a little confused about the use of system matrices and the damping/stiffness parameters.

For reference, this is the code I'm currently using (keyhole basically defines the domain I'm working in and test is the actual PDE that I'm solving).

ymax = 100;
numVals = 300;
keyhole = 
  ImplicitRegion[x^2 + y^2 >= 1, {{x, -1/2, 1/2}, {y, 0, ymax}}];
test = NDEigensystem[{-y^2 (D[u[x, y], {x, 2}] + D[u[x, y], {y, 2}]), 
    PeriodicBoundaryCondition[u[x, y], x == -1/2, 
     TranslationTransform[{1, 0}]], 
    PeriodicBoundaryCondition[u[x, y], x^2 + y^2 == 1, 
     Function[x, {{-1, 0}, {0, 1}}.x]]}, 
   u[x, y], {x, y} \[Element] keyhole, numVals, 
   Method -> {"PDEDiscretization" -> {"FiniteElement", 
       "MeshOptions" -> {"MaxCellMeasure" -> 0.1}}}];

Thank you for your help!

$\endgroup$
2
$\begingroup$

I am not 100% sure this is correct, but perhaps like this:

ymax = 100;
numVals = 3;
keyhole = 
  ImplicitRegion[x^2 + y^2 >= 1, {{x, -1/2, 1/2}, {y, 0, ymax}}];
test = NDEigensystem[{-y^2 (D[u[x, y], {x, 2}] + D[u[x, y], {y, 2}]), 
   PeriodicBoundaryCondition[u[x, y], x == -1/2, 
    TranslationTransform[{1, 0}]], 
   PeriodicBoundaryCondition[u[x, y], x^2 + y^2 == 1, 
    Function[x, {{-1, 0}, {0, 1}}.x]]}, 
  u[x, y], {x, y} \[Element] keyhole, numVals, 
  Method -> {"PDEDiscretization" -> {"FiniteElement", 
      "MeshOptions" -> {"MaxCellMeasure" -> 1}},
    "VectorNormalization" -> 
     Function[{values, vectors, stiffness, damping},
      s = stiffness; d = damping;
      norm = 
       vectors/(Diagonal[
            vectors.damping.ConjugateTranspose[vectors]]^(1/2) * 
          NIntegrate[1/y^2, {x, y} \[Element] keyhole])]
    }]

I'd very useful if you can create a simpler example to test this.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.