using ApproxFun, Plots, ComplexPhasePortrait, ApproxFun, SingularIntegralEquations,
SpecialFunctions
using SingularIntegralEquations.HypergeometricFunctions
gr();
Dr Sheehan Olver
Office Hours: 3-4pm Mondays, 11-12am Thursdays, Huxley 6M40
The hypergeometric equation has three regular singular points at 0, 1 and ∞: z(1−z)d2udu2+[c−(a+b+1)z]dudz−abu=0
Theorem Any homogenous 2nd order linear differential equation whose singularities in ˉC are regular and not more than three in number can be transformed into the hypergeometric functions.
Proof See [Chapter 5.8, Olver 1975]. ⬛️
If we solve this ODE along a straight contour starting from z0=−1, we have that all solutions are analytic off [0,∞). Interestingly, there exists a special solution that is analytic off [1,∞), the (Gauss) hypergeometric function, which we denote u(z)=2F1(a,bc;z)
To see this, consider the indicial equation at zero: α(α−1)+a−1α+b−2=0
Here is a phase plot of a typical hypergeometric function, showing the branch cut from (1,∞):
phaseplot(z -> _₂F₁(0.5,-0.2,0.1,z), (-3,3), (-3,3))
Note some special cases are entire:
n = 5;
a ,b = 0.0, 0.0
phaseplot(z -> _₂F₁(-n,n+a+b+1,a+1,z+eps()*im), (-3,3), (-3,3))
When c
is a negative integer, we see that it is not well-define:
_₂F₁(0.5,-0.2,-3,0.1) # errors out for 1-c = 2
Inf
Remark The regularized hypergeometric function F(a,bc;z) extends the definition to 1−c being a positive integer. In these cases, one has the initial condition u(0)=0, or more specifically, u(z)=O(z1−c). In practical applications, one should normally use F.
We can determine the Taylor coefficients of u(z)=2F1(a,bc;z) by solving the equation z(1−z)d2udz2+[c−(a+b+1)z]dudz−abu=0andu(0)=1
We do so by representing the various operators: z(1−z)d2dz2≡(0002−26−612⋱⋱)
z = Fun(Taylor(Circle(1.0)))
a = 0.1; b = 0.3; c= 0.4;
D = Derivative() : space(z)
z*(1-z)*D^2
TimesOperator:Taylor(🕒)→Taylor(🕒) 0.0+0.0im 0.0+0.0im 0.0+0.0im … 0.0+0.0im 0.0+0.0im 2.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im -2.0+0.0im 6.0+0.0im 0.0+0.0im 0.0+0.0im -6.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im … 0.0+0.0im 56.0+0.0im 0.0+0.0im -56.0+0.0im 72.0+0.0im ⋱ 0.0+0.0im -72.0+0.0im ⋱ … ⋱ ⋱ ⋱
(c-(a+b+1)*z)*D
TimesOperator:Taylor(🕒)→Taylor(🕒) 0.0+0.0im 0.4+0.0im … 0.0+0.0im -1.4+0.0im 0.8+0.0im 0.0+0.0im -2.8+0.0im 0.0+0.0im … 3.2+0.0im -11.2+0.0im 3.6+0.0im 0.0+0.0im -12.6+0.0im ⋱ … ⋱ ⋱
Adding in the boundary row, we get a really nice, simple formula for the taylor coefficients: (1−abc−(a+b+1)−ab2+2c−2−2(a+b+1)−ab6+3c−6−3(a+b+1)−ab12+4c⋱⋱)(u0u1⋮)=(10⋮)
That is, we have u0=1uk+1=k(k+a+b)+ab(k+1)(k+c)uk=(a+k)(b+k)(k+1)(k+c)uk
n = 100
u = Array{Float64}(n)
u[1] = 1
for k=0:n-2
u[k+2] =(a+k)*(b+k)/((k+1)*(k+c))*u[k+1]
end
u = Fun(Taylor(), u)
(z*(1-z)*D^2 + (c-(a+b+1)*z)*D - a*b*I)*u # zero apart from tail
Fun(Taylor(🕒),Complex{Float64}[0.0+0.0im, 0.0+0.0im, 2.77556e-17+0.0im, 5.55112e-17+0.0im, -1.11022e-16+0.0im, -1.66533e-16+0.0im, -1.66533e-16+0.0im, 0.0+0.0im, -1.11022e-16+0.0im, 1.11022e-16+0.0im … 0.0+0.0im, -1.77636e-15+0.0im, -1.77636e-15+0.0im, -3.55271e-15+0.0im, -2.66454e-15+0.0im, 0.0+0.0im, -1.77636e-15+0.0im, -7.74477+0.0im, 0.0+0.0im, 0.0+0.0im])
u(0.1) - _₂F₁(a,b,c,0.1)
2.220446049250313e-16
Recall the Pochhammer symbol: Definition (Pochhammer) (a)n:=a(a+1)(a+2)⋯(a+n−1)
We have thus arrived at a nice formula for the Taylor series:
Theorem (Hypergeometric function Taylor series) For |z|<1, 2F1(a,bc;z)=∑k=0(a)k(b)k(c)kzkk!
This gives us one solution to the equation, but we know all ODEs have two linearly independent solutions. In fact, we know from the indicial equation that the second solution has a singularity of the form (−z)1−c. It turns out after we change variables we arrive back at a Hypergeometric function:
Theorem (Hypergeometric function second solution) Suppose c is not an integer. Then (−z)1−c2F1(a−c+1,b−c+12−c;z)
Proof This is fairly straightforward: Making the change of variables: u(z)=(−z)1−cv(z)
⬛️
Let's check it out:
a,b,c = 0.1,0.3,0.4
u = z -> (-z)^(1-c)*_₂F₁(a-c+1,b-c+1,2-c,z)
phaseplot(u, (-3,3), (-3,3))
Let's double check it satisfies the original ODE:
# dual numbers don't work to second degree so let's check numerically:
z = Fun(0.1+im .. 0.2+im)
uf = Fun(u, domain(z))
norm(z*(1-z)*uf'' + (c - (a+b+1)*z)*uf' - a*b*uf)
1.5080992645962192e-10