MathGroup Archive 2010

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Mathieu function zeros

  • To: mathgroup at smc.vnet.net
  • Subject: [mg108166] Re: Mathieu function zeros
  • From: becko BECKO <becko565 at hotmail.com>
  • Date: Tue, 9 Mar 2010 06:26:41 -0500 (EST)

Thanks a lot. This is VERY useful. As you said, I extended it to handle 
the other Mathieu's and it worked very well. I think the only issue is 
that this method doesn't detect zeros where the graph doesn't cross the 
axis (it doesn't detect the zero of x^2, but it does detect the zero of 
x^3). This is not an issue with Mathieu functions. But it would be nice 
if one could exploit the inner workings of Plot a bit more to detect 
zeros that are not crossings. Any ideas?

> Date: Thu, 4 Mar 
2010 05:31:00 -0500
> From: pfalloon at gmail.com
> Subject: 
[mg107987] Re: Mathieu function zeros
> To: mathgroup at smc.vnet.net
>
 
> On Mar 3, 9:53 pm, becko BECKO <becko... at hotmail.com> 
wrote:
> > Hi. I'm doing some work with Mathieu functions and I
 need to know the zeros
> >  of these functions (MathieuC, 
MathieuS, MathieuCPrime, MathieuSPrime).  This doesn't seem to be 
implemented in Mathematica (as opposed to Bessel functions, where there 
is a package that calculates the zeros).
> >
> > Can 
someone tell me where can I find any implementation of this?
> 
>
> > Or perhaps point me in some direction as to how I can 
get started in implementing it myself?
> 
> The built-in 
function FindRoot will readily compute the zeros to
> whatever 
precision you need. You just need to specify one or two
> starting
 guesses.
> 
> If you need to find all zeros in a fixed 
domain (e.g. the interval 0
> <= x <= Pi), a neat trick is 
to leverage the Plot function's adaptive
> capabilities (i.e. 
computing sufficient points to capture the
> structure of 
interest) to get the approximate locations of the zeros,
> then 
refine these using FindRoot.
> 
> Here is a simple 
implementation:
> 
> mathieuCZeros[r_,q_] := Module[{ce, 
lineElts, crossings, z},
> 	(* define ce function *)
> 	
ce[z_] := MathieuC[MathieuCharacteristicA[r,q], q, z];
> 	(* get 
line elements from plot *)
> 	lineElts = Cases[Plot[ce[z], 
{z,0,Pi}], Line[___], Infinity][[1,1]];
> 	(* get x values on 
either side of all zero crossings *)
> 	crossings = 
Select[Partition[lineElts,2,1], Sign[#[[1,2]]] == -
> 
Sign[#[[2,2]]] &][[All,All,1]];
> 	(* find zeros between each 
crossing using secant method *)
> 	z /. FindRoot[ce[z], {z,#1,#2}]
 &  @@@ crossings
> ]mathieuCZeros[r_,q_] := Module[{ce, 
lineElts, crossings, z},
> 	(* define ce function *)
> 	
ce[z_] := MathieuC[MathieuCharacteristicA[r,q], q, z];
> 	(* get 
line elements from plot *)
> 	lineElts = Cases[Plot[ce[z], 
{z,0,Pi}], Line[___], Infinity][[1,1]];
> 	(* get x values on 
either side of all zero crossings *)
> 	crossings = 
Select[Partition[lineElts,2,1], Sign[#[[1,2]]] == -
> 
Sign[#[[2,2]]] &][[All,All,1]];
> 	(* find zeros between each 
crossing using secant method *)
> 	z /. FindRoot[ce[z], {z,#1,#2}]
 &  @@@ crossings
> ]
> 
> 
> This can be 
extended as required to handle MathieuS, other domains,
> higher 
precision, possible zeros on boundaries, etc.
> 
> Cheers, 
P.


  • Prev by Date: Re: find index in an array
  • Next by Date: Re: find index in an array
  • Previous by thread: Re: Mathieu function zeros
  • Next by thread: Re: Mathieu function zeros