开发者

Get branch points of equation

If I have a general function,f(z,a), z and a are both real, and the function f takes on real values for all z except in some interval (z1,z2), where it becomes complex. How do I determine z1 and z2 (which will be in terms of a) using Mathematica (or is this possible)? What are the limitations?

For a test example, consider the function f[z_,a_]=Sqrt[(z-a)(z-2a)]. For real z and a, this takes on real values except in the interval (a,2a), where it becomes imaginary. How do I find this interval in Mathematica?

In general, I'd like to know how one would go about finding it mathematically for a general case.开发者_C百科 For a function with just two variables like this, it'd probably be straightforward to do a contour plot of the Riemann surface and observe the branch cuts. But what if it is a multivariate function? Is there a general approach that one can take?


What you have appears to be a Riemann surface parametrized by 'a'. Consider the algebraic (or analytic) relation g(a,z)=0 that would be spawned from this branch of a parametrized Riemann surface. In this case it is simply g^2 - (z - a)*(z - 2*a) == 0. More generally it might be obtained using Groebnerbasis, as below (no guarantee this will always work without some amount of user intervention).

grelation = First[GroebnerBasis[g - Sqrt[(z - a)*(z - 2*a)], {x, a, g}]]

Out[472]= 2 a^2 - g^2 - 3 a z + z^2

A necessary condition for the branch points, as functions of the parameter 'a', is that the zero set for 'g' not give a (single valued) function in a neighborhood of such points. This in turn means that the partial derivative of this relation with respect to g vanishes (this is from the implicit function theorem of multivariable calculus). So we find where grelation and its derivative both vanish, and solve for 'z' as a function of 'a'.

Solve[Eliminate[{grelation == 0, D[grelation, g] == 0}, g], z]

Out[481]= {{z -> a}, {z -> 2 a}}

Daniel Lichtblau Wolfram Research


For polynomial systems (and some class of others), Reduce can do the job.

E.g.

In[1]:= Reduce[Element[{a, z}, Reals] 
           && !Element[Sqrt[(z - a) (z - 2 a)], Reals], z]
Out[1]= (a < 0 && 2a < z < a) || (a > 0 && a < z < 2a)

This type of approach also works (often giving very complicated solutions for functions with many branch cuts) for other combinations of elementary functions I checked.

To find the branch cuts (as opposed to the simple class of branch points you're interested in) in general, I don't know of a good approach. The best place to find the detailed conventions that Mathematica uses is at the functions.wolfram site.

I do remember reading a good paper on this a while back... I'll try to find it....


That's right! The easiest approach I've seen for branch cut analysis uses the unwinding number. There's a paper "Reasoning about the elementary functions of complex analysis" about this the the journal "Artificial Intelligence and Symbolic Computation". It and similar papers can be found at one of the authors homepage: http://www.apmaths.uwo.ca/~djeffrey/offprints.html.


For general functions you cannot make Mathematica calculate it. Even for polynomials, finding an exact answer takes time. I believe Mathematica uses some sort of quantifier elimination when it uses Reduce, which takes time.

Without any restrictions on your functions (are they polynomials, continuous, smooth?) one can easily construct functions which Mathematica cannot simplify further: f[x_,y_] := Abs[Zeta[y+0.5+x*I]]*I

If this function is real for arbitrary x and any -0.5 < y < 0 or 0<y<0.5, then you will have found a counterexample to the Riemann zeta conjecture, and I'm sure Mathematica cannot give a correct answer.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜