using Plots, ComplexPhasePortrait, ApproxFun, SingularIntegralEquations
gr();
Dr. Sheehan Olver
Let Γ be a set of contours, and for now assume Γ⊂R. Given functions f and g defined on Γ, a (scalar) Riemann–Hilbert problem consists of finding a function ϕ(z) with left/right limits ϕ±(x)=limϵ→0ϕ(x±iϵ),
Numerous applications! See [Trogdon & Olver 2015]. Here are some classical applications:
More recently, non-classical applications have arisen from integrable systems:
Consider the Riemann–Hilbert problem ϕ+(x)−cϕ−(x)=f(x)
The simplest example is when c=1, in which case, assuming f(x) satisfies the conditions of Plemelj theorem, the solution to
is simply
ϕ(z)=CΓf(z)+Cx = Fun()
f = exp(x)
C = 2
φ = x -> cauchy(f, x) + C
φ(0.1+0.0im)- φ(0.1-0.0im) -f(0.1)
2.220446049250313e-16 + 0.0im
Analytic functions are continuous, hence if Γ is in the domain of analyticity, we have ϕ+(x)−ϕ−(x)=0. This is why the constant C does not impact the jump. This makes subtractive Riemann–Hilbert problems particularly nice as we can solve each component separately: that is CΓ1∪Γ2f(z)=CΓ1f(z)+CΓ2f(z)
Example Solve the Riemann–Hilbert problem
Consider the first guess ψ(z)=−i√z−1√z+12(z+2)
f = sqrt(1-x^2)/(x+2)
ψ = z -> -im*sqrt(z-1)sqrt(z+1)/(2(z+2))
@show ψ(1_000_000.0) # condition 2.
@show f(0.1)
@show ψ(0.1+0.0im) - ψ(0.1-0.0im); # condition 4.
ψ(1.0e6) = 0.0 - 0.49999900000175im f(0.1) = 0.47380354147934295 ψ(0.1 + 0.0im) - ψ(0.1 - 0.0im) = 0.47380354147934284 + 0.0im
The catch: it has a pole at z=−2 😩:
phaseplot(-3..3, -2..2, ψ)
In particular, ψ(z)=i√321z+2+O(1)
Good thing it's a subtractive Riemann–Hilbert problem: we can subtract out the pole without impacting the jump. Therefore, we have ϕ(z)=ψ(z)−i√321z+2=−i√z−1√z+12(z+2)−i√321z+2
φ = z -> ψ(z) - im*sqrt(3)/(2*(z+2))
@show φ(1_000_000.0) # condition 2.
@show f(0.1)
@show φ(0.1+0.0im) - φ(0.1-0.0im) # condition 4.
phaseplot(-3..3, -2..2, φ)
φ(1.0e6) = 0.0 - 0.49999986602542174im f(0.1) = 0.47380354147934295 φ(0.1 + 0.0im) - φ(0.1 - 0.0im) = 0.47380354147934284 + 0.0im
We now introduce the case c=−1, in other words, we want to solve ϕ+(x)+ϕ−(x)=f(x)ϕ(∞)=0
Consider ϕ(z)=ψ(z)√z−1√z+1, so that f(x)=ϕ+(x)+ϕ−(x)=ψ+(x)i√1−x2−ψ−(x)i√1−x2=ψ+(x)−ψ−(x)i√1−x2
x = Fun()
f = exp(x)
v = f*sqrt(1-x^2)
φ = z -> im*cauchy(v, z)/(sqrt(z-1)sqrt(z+1))
@show φ(1.0E8)
@show f(0.1)
@show φ(0.1+0.0im) + φ(0.1-0.0im);
phaseplot(-3..3, -2..2, φ)
φ(1.0e8) = -2.825795526749808e-17 + 0.0im f(0.1) = 1.1051709180756475 φ(0.1 + 0.0im) + φ(0.1 - 0.0im) = 1.1051709180756475 + 0.0im
Is this the only solution? No! consider κ(z)=1√z−1√z+1
Here we propose the general solution to an additive Riemann–Hilbert problem:
Theorem (Cauchy transform solution to Additive Riemann–Hilbert problem) Suppose ϕ(z) analytic in C∖[−1,1] satisfies
Then, for some constant C, ϕ(z)=i√z−1√z+1C[−1,1][f(⋄)√1−⋄2](z)+C√z−1√z+1
x = Fun()
f = exp(x)
v = f*sqrt(1-x^2)
C = randn() # doesn't matter
φ = z -> im*cauchy(v, z)/(sqrt(z-1)sqrt(1+z)) + C/(sqrt(z-1)sqrt(z+1))
@show φ(1.0E8)
@show f(0.1)
@show φ(0.1+0.0im) + φ(0.1-0.0im);
phaseplot(-3..3, -2..2, φ)
φ(1.0e8) = -6.543337674831032e-9 + 0.0im f(0.1) = 1.1051709180756475 φ(0.1 + 0.0im) + φ(0.1 - 0.0im) = 1.1051709180756475 + 0.0im
On other intervals (a,b), we get the same forms of solution:
ϕ(z)=i√z−b√z−aC[a,b][f(⋄)√b−⋄√⋄−a](z)+C√z−b√z−aNote the expression above is not a Cauchy transform of a function. We can determine a Cauchy transform expression by taking the difference: on [−1,1] we have
u(x)=ϕ+(x)−ϕ−(x)=1√1−x2(C+[−1,1]+C−[−1,1])[f(⋄)√1−⋄2](x)−2Ci√1−x2=−i√1−x2H[−1,1][f(⋄)√1−⋄2](x)−2Ci√1−x2BY (Plemelj II), we guarantee that ϕ(z)=C[−1,1]u(z)
x = Fun()
f = exp(x)
v = f*sqrt(1-x^2)
C = randn() # doesn't matter
φ = z -> im*cauchy(v, z)/(sqrt(z-1)sqrt(1+z)) + C/(sqrt(z-1)sqrt(z+1))
u = -im/sqrt(1-x^2)*hilbert(f*sqrt(1-x^2)) - 2*C*im/sqrt(1-x^2)
@show φ(1.0+2.0im);
@show cauchy(u, 1.0+2.0im);
φ(1.0 + 2.0im) = 0.1674484261991792 - 0.2713677090129005im cauchy(u, 1.0 + 2.0im) = 0.16744842619917932 - 0.27136770901290047im
On other intervals we have u(x)=−i√b−x√x−aH[a,b][f(⋄)√b−⋄√⋄−a](x)−2Ci√b−x√x−a
In the special case where we can calculate C[f(⋄)√b−⋄√⋄−a](z) exactly, we can work out the precise formula for u(x) by taking the difference.
Example Consider solving
Note that κ(z)=z√z−b√z+b−z2+b2/22i
b = 2
κ = z -> (z*sqrt(z-b)*sqrt(z+b) - z^2 + b^2/2)/(2im)
@show κ(1E5)
κ(0.1+0.0im)- κ(0.1-0.0im), 0.1sqrt(b^2-0.1^2)
κ(100000.0) = 0.0 - 0.0im
(0.1997498435543818 + 0.0im, 0.1997498435543818)
Hence every solution has the form ϕ(z)=1√z−b√z+b(z√z−b√z+b−z2+b2/22)+C√z−b√z+b=z2−z22√z−b√z+b+D√z−b√z+b
D = randn()
φ = z -> z/(2) - z^2/(2*sqrt(z-b)*sqrt(z+b)) + D/(sqrt(z-b)*sqrt(z+b))
φ(0.1+0.0im) + φ(0.1-0.0im)
0.1 + 0.0im
Inspection reveals that u(x)=ϕ+(x)−ϕ−(x)=ix2−2D√b2−x2
x = Fun(-b..b)
u = im*(x^2 - 2D)/sqrt(b^2 - x^2)
@show cauchy(u ,2+2im)
@show φ(2+2im);
cauchy(u, 2 + 2im) = -0.38895324392466324 + 0.8558850675485229im φ(2 + 2im) = -0.3889532439246629 + 0.8558850675485228im
Therefore, Cu(z) satsifies C+u(x)+C−u(x)=x:
cauchy(u, 0.1+0.0im) + cauchy(u, 0.1-0.0im)
0.041082298011221145 + 0.0im
D is a free paremeter, hence, similar to ODEs, we can add a boundary condition. In other words we can ask for the solution satisfying, for example u(0)=0. This is precisely when D=0 and u(x)=ix2/√b2−x2.
D = 0
u = im*(x^2 - 2D)/sqrt(b^2 - x^2)
plot(imag(u); ylims=(-5,5), yaxis="Im", label="u s.t. u(0) = 0")
Often we ask for the solution that is bounded at the left/right endpoint. Because of the symmetry in the problem (since x is an odd function), we can actually get a solution that is bounded at both ±b by choosing D=b2/2: ϕ+(x)−ϕ−(x)=−i√b2−x2
b = 2.3
x = Fun(-b .. b)
u = -im*sqrt(b^2 - x^2)
@show cauchy(u, 0.1+0.0im) + cauchy(u, 0.1-0.0im)
plot(imag(u); label="u", yaxis="Im")
cauchy(u, 0.1 + 0.0im) + cauchy(u, 0.1 - 0.0im) = 0.10000000000000007 + 0.0im
In other words, ϕ(z)=−iC[−b,b]√b2−⋄2(z)
We can use this along with Plemelj's lemma to invert the Hilbert transform. That is, we want to find v(x) such that Hv(x)=f(x)
x= Fun()
f = exp(x)
C = randn()
v = -1/sqrt(1-x^2)*hilbert(f*sqrt(1-x^2)) - 2*C/sqrt(1-x^2)
hilbert(v, 0.1) - exp(0.1)
-2.220446049250313e-16
This construction works since ϕ(z)=Cu(z)=iCv(z), and Hv(x)=i(C++C−)v(x)=ϕ+(x)+ϕ−(x)=f(x)
Example
Consider H[−b,b]v(x)=x. We have −iH[−b,b]√b2−⋄2(x)=C+[−b,b]√b2−⋄2(z)+C−[−b,b]√b2−⋄2(z)=i(ϕ+(x)+ϕ−(x))=ix
x = Fun(-b .. b)
v = -sqrt(b^2 - x^2)
plot(v; label = "v")
plot!(hilbert(v); ylims=(-3,3), label="H[v]")