equation solving - Find all roots of a function with parabolic cylinder functions in a range of the variable
I want to find all roots of a function involving Parabolic Cylinder Functions. In what follows, I define 2 variables $\xi1$ and $\xi2$, which in turn depend on $\omega$. My function is then defined as f. I go on defining g and h (where I take specific values for my parameters $M$ and $\lambda$ which are real and positive. I then plot the real and imaginary part of h to locate the roots. I would like, however, to be able to find all roots of $Im[h]$ (The real part is essentially 0) in a range of $\omega$, say from 0 to 50.
ξ1[ ω_] := (-1 + I) (ω/Sqrt[λ] - Sqrt[λ]/2)
ξ2[ ω_] := (-1 + I) (ω/Sqrt[λ] + Sqrt[λ]/2)
f := (I ParabolicCylinderD[I M/(2 λ), I ξ1[ ω]] - Sqrt[M/λ]*(-I - 1)/2*
ParabolicCylinderD[I M/(2 λ) - 1, I ξ1[ ω]])*(
ParabolicCylinderD[-I M/(2 λ), ξ2[ ω]] + I *Sqrt[M/λ]*(I - 1)/2*
ParabolicCylinderD[-I M/(2 λ) - 1, ξ2[ ω]]) + (I ParabolicCylinderD[
I M/(2 λ), I ξ2[ ω]] + Sqrt[M/λ]*(-I - 1)/2*ParabolicCylinderD[I M/(2 λ) - 1,
I ξ2[ ω]])*(ParabolicCylinderD[-I M/(2 λ), ξ1[ ω]] - I *Sqrt[M/λ]*(I - 1)/2*
ParabolicCylinderD[-I M/(2 λ) - 1, ξ1[ ω]])
g:=FullSimplify[f, {ω>0&&M>0&&λ>0}]
h:=FullSimplify[g/.{M->2, λ->100}]
Plot[{ Re[h], Im[h]}, {ω, 0, 20}, PlotPoints -> 50, MaxRecursion -> 0]
FindRoot[Im[h],{ω,5}]
I have searched through some posts with the keyword "find all roots in a range"; however, most of the solutions are for simpler functions than this special parabolic cylinder functions, c.f. About multi-root search in Mathematica for transcendental equations and Find all roots of an interpolating function (solution to a differential equation).
I would appreciate any help. Thank you in advance.
Answer
...most of the solutions are for simpler functions...
I'm not quite sure what gave OP that impression; certainly, FindAllCrossings[]
is quite capable of handling transcendental equations, as long as all the roots being sought are simple.
But first: I slightly tidied up the definition of f[]
(e.g. by using auxiliary variables for common subexpressions), as the original version brought tears to my sensitive eyes:
f[M_?NumericQ, λ_?NumericQ, ω_?NumericQ] := Module[{c, k, ξ1, ξ2},
c = Sqrt[M/λ]; k = I M/(2 λ);
ξ1 = (I - 1) (ω/Sqrt[λ] - Sqrt[λ]/2); ξ2 = (I - 1) (ω/Sqrt[λ] + Sqrt[λ]/2);
({1 + I, -I c}.ParabolicCylinderD[{-k, -k - 1}, ξ2]
{c, 1 + I}.ParabolicCylinderD[{k - 1, k}, I ξ1] -
{I c, 1 + I}.ParabolicCylinderD[{-k - 1, -k}, ξ1]
{c, -1 - I}.ParabolicCylinderD[{k - 1, k}, I ξ2])/2]
...and with that,
roots = FindAllCrossings[Im[f[2, 100, ω]], {ω, 0, 50}, WorkingPrecision -> 20]
{1.4210217375131208861, 4.9080677718060732317, 7.6276760758692264160,
11.242328271551264279, 14.025220377481373494, 17.188413671355074367,
20.686743750589305061, 23.568643080603343806, 26.490531437543067517,
29.849368653509459477, 33.222900929283185978, 36.429230282166527794,
39.466210718845193558, 42.459671861175573218, 45.512697669849073416,
48.625869297148536333}
As a graphical verification:
Plot[Im[f[2, 100, ω]], {ω, 0, 50},
Epilog -> {Red, AbsolutePointSize[4], Point[Thread[{roots, 0}]]},
Frame -> True, PlotStyle -> RGBColor[59/67, 11/18, 1/7]]
Comments
Post a Comment