Skip to main content

Finding eigenvalues of a differential operator



I am trying to get the eigenvalues of the following differential operator


Lψ(r)=−f∂r(f∂rψ(r))+Vψ(r)


which must satisfy (obviously)


Lψ(r)=ω2ψ(r)


where I want to acquire both the real and imaginary part of ω. To my problem, we have


f=1−2Mr and V=f(l(l−1)r2+2(1−S2)Mr3) with M=1,l=2,S=2. The boundary conditions are ψ(2M)=0,ψ(inf)=0. (To whomever may care, I am getting the real and imaginary oscillations of a Schwarzschild black hole. It is well studied in the literature, but I need to recover the result).


I tried three different ways to do it:


1) Using NDEigensystem:


f = 1 - 2*(M/r); 
V = f*(l*((l - 1)/r^2) + (2*(1 - S^2)*M)/r^3);

M = 1; l = 2; S = 2;
\[ScriptCapitalL] = f*D[f*D[\[Chi][r], r], r] + V*\[Chi][r];
\[ScriptCapitalB] = DirichletCo - ndition[\[Chi][r] == 0, True];
boundarydistance = 10;
{ev, ef} =
NDEigensystem[{\[ScriptCapitalL], \[ScriptCapitalB]}, \[Chi][
r], {r, 2*M, boundarydistance}, 3];
Print["The eigenvalues are = ", ev]
Print["The real part is = ", Re[Sqrt[ev]]]
Print["The imaginary part is = ", Im[Sqrt[ev]]]

Plot[Evaluate[ef], {r, 0, boundarydistance}]

THE PROBLEM:It works perfectly, for a condition which is not at infinity. When I try to set boundarydistance = :inf:, it gives me error.


2) NDSolve with "Shooting Method":


f = 1 - 2*(M/r); 
V = f*(l*((l - 1)/r^2) + (2*(1 - S^2)*M)/r^3);
M = 1; l = 2; S = 2;
\[ScriptCapitalL] = (-f)*D[f*D[\[Chi][r], r], r] + V*\[Chi][r];
NDSolve[{\[ScriptCapitalL] == \[Lambda]*\[Chi][r], \[Chi][2*M] == 0, \[Chi][Infinity] == 0}, \[Chi][r], {r, 0, 10},
Method -> {"Shooting"}]

Plot[%, {r, 0, 10}]

THE PROBLEM: It gives the following error: NDSolve::ndsv: Cannot find starting value for the variable [Chi]^[Prime]. Besides this, how to I recover the eigenvalue? It seems like, to use NDSolve, I need to put a value for it.


3) Using the magical package in one of the answers in here:


Needs["PacletManager`"]
PacletInstall["CompoundMatrixMethod",
"Site" -> "http://raw.githubusercontent.com/paclets/Repository/master"];
Needs["CompoundMatrixMethod`"]
f = 1 - 2*(M/r);
V = f*(l*((l - 1)/r^2) + (2*(1 - S^2)*M)/r^3);

M = 1; l = 2; S = 2;
sys = ToMatrixSystem[f*D[f*D[\[Chi][r], r], r] - V*\[Chi][r] == \[Omega]*\[Chi][r],
{\[Chi][3*M] == 0, \[Chi][Infinity] == 0}, \[Chi], {r, 3, 10}, \[Omega]];
Plot[Evans[\[Omega], sys], {\[Omega], 0, 15}]

THE PROBLEM: Well, it actually runs. But I need to start from somewhere far from zero (due to the singularity) and I cannot really understand the answer which is:


{{{0, 1}, {(12 - 10 r + 2 r^2 + \[FormalLambda] r^4)/((-2 + r)^2 r^2), (4 r - 2 r^2)/((-2 + r)^2 r^2)}}, {}, {}, {r, 2.5, 10}}

and a plot, which does not resembles me anything that I would like to get.


EDIT:



Since I am not converging to an answer, it may help to add some more details. The real equation that I am trying to solve is d2ψ(r)dr2∗+(ω2−V(r))ψ(r)=0 where the (tortoise) coordinate is defined via drdr∗=f(r) with the definitions of both V(r) and f(r) are given above. If you use these two equations together, you will get in the first equation of this page.


I thought that working with a single differential equation, although a bit more complicate, might be easier. However, I have no idea, even so, how I would work with the two differential equations separately, since the problem with this tortoise coordinate is that it cannot give me a function r(r∗), because it is a transcendental equation.




Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

mathematical optimization - Minimizing using indices, error: Part::pkspec1: The expression cannot be used as a part specification

I want to use Minimize where the variables to minimize are indices pointing into an array. Here a MWE that hopefully shows what my problem is. vars = u@# & /@ Range[3]; cons = Flatten@ { Table[(u[j] != #) & /@ vars[[j + 1 ;; -1]], {j, 1, 3 - 1}], 1 vec1 = {1, 2, 3}; vec2 = {1, 2, 3}; Minimize[{Total@((vec1[[#]] - vec2[[u[#]]])^2 & /@ Range[1, 3]), cons}, vars, Integers] The error I get: Part::pkspec1: The expression u[1] cannot be used as a part specification. >> Answer Ok, it seems that one can get around Mathematica trying to evaluate vec2[[u[1]]] too early by using the function Indexed[vec2,u[1]] . The working MWE would then look like the following: vars = u@# & /@ Range[3]; cons = Flatten@{ Table[(u[j] != #) & /@ vars[[j + 1 ;; -1]], {j, 1, 3 - 1}], 1 vec1 = {1, 2, 3}; vec2 = {1, 2, 3}; NMinimize[ {Total@((vec1[[#]] - Indexed[vec2, u[#]])^2 & /@ R...

How to remap graph properties?

Graph objects support both custom properties, which do not have special meanings, and standard properties, which may be used by some functions. When importing from formats such as GraphML, we usually get a result with custom properties. What is the simplest way to remap one property to another, e.g. to remap a custom property to a standard one so it can be used with various functions? Example: Let's get Zachary's karate club network with edge weights and vertex names from here: http://nexus.igraph.org/api/dataset_info?id=1&format=html g = Import[ "http://nexus.igraph.org/api/dataset?id=1&format=GraphML", {"ZIP", "karate.GraphML"}] I can remap "name" to VertexLabels and "weights" to EdgeWeight like this: sp[prop_][g_] := SetProperty[g, prop] g2 = g // sp[EdgeWeight -> (PropertyValue[{g, #}, "weight"] & /@ EdgeList[g])] // sp[VertexLabels -> (# -> PropertyValue[{g, #}, "name"]...