{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "using Plots, ComplexPhasePortrait, ApproxFun, SingularIntegralEquations\n", "gr();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# M3M6: Methods of Mathematical Physics\n", "\n", "$$\n", "\\def\\dashint{{\\int\\!\\!\\!\\!\\!\\!-\\,}}\n", "\\def\\infdashint{\\dashint_{\\!\\!\\!-\\infty}^{\\,\\infty}}\n", "\\def\\D{\\,{\\rm d}}\n", "\\def\\dx{\\D x}\n", "\\def\\dt{\\D t}\n", "\\def\\C{{\\mathbb C}}\n", "\\def\\CC{{\\cal C}}\n", "\\def\\HH{{\\cal H}}\n", "\\def\\I{{\\rm i}}\n", "\\def\\qqfor{\\qquad\\hbox{for}\\qquad}\n", "$$\n", "\n", "Dr. Sheehan Olver\n", "
\n", "s.olver@imperial.ac.uk\n", "\n", "
\n", "Website: https://github.com/dlfivefifty/M3M6LectureNotes\n", "\n", "# Lecture 11: Riemann–Hilbert problems\n", "\n", "\n", "1. Constant coefficient Riemann–Hilbert problems\n", " - Subtractive Riemann–Hilbert problem $\\phi_+(x) - \\phi_-(x) = f(x)$\n", " - Additive Riemann–Hilbert problem $\\phi_+(x) + \\phi_-(x) = f(x)$\n", " \n", " \n", "Let $\\Gamma$ be a set of contours, and for now assume $\\Gamma \\subset {\\mathbb R}$. Given functions $f$ and $g$ defined on $\\Gamma$, a (scalar) Riemann–Hilbert problem consists of finding a function $\\phi(z)$ with left/right limits \n", "$$\\phi_\\pm(x) = \\lim_{\\epsilon \\rightarrow 0} \\phi(x \\pm \\I \\epsilon),$$\n", "satisfying the following conditions:\n", "\n", "1. $\\phi(z)$ analytic in $\\bar\\C \\backslash \\Gamma$\n", "2. $\\phi(\\infty) = C$\n", "2. $\\phi(z)$ has weaker than pole singularities everywhere\n", "2. $\\phi_+(x) - g(x) \\phi_-(x) = f(x)$ for $x \\in \\Gamma$\n", "\n", "\n", "Numerous applications! See [\\[Trogdon & Olver 2015\\]](http://bookstore.siam.org/ot146/). Here are some classical applications:\n", "\n", "1. Ideal fluid flow\n", "2. Solving integral equations via Weiner–Hopf factorization\n", "2. Spectral analysis of Schrödinger operators\n", "\n", "More recently, non-classical applications have arisen from integrable systems:\n", "\n", "2. Solutions to Painlevé equations \n", "3. Random matrix eigenvalue statistics\n", "2. Solving partial differential equations like the Korteweg–de Vries (KdV) equation describing shallow water waves\n", "$$\n", "u_t + 6u u_x + u_{xxx} = 0\n", "$$\n", "\n", "![KdV movie](kdv-movie.gif)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Constant coefficient Riemann–Hilbert problems\n", "\n", "Consider the Riemann–Hilbert problem\n", "$$\n", " \\phi+(x) - c \\phi_-(x) = f(x)\n", "$$\n", "on the interval. General $c$ will be looked at in the problem sheets, so we only consider $c \\pm 1$.\n", "\n", "\n", "### Subtractive Riemann–Hilbert problems\n", "\n", "The simplest example is when $c = 1$, in which case, assuming $f(x)$ satisfies the conditions of Plemelj theorem, the solution to \n", "\n", "1. $\\phi_+(x) - \\phi_-(x) = f(x)$ for $x \\in \\Gamma$\n", "2. $\\phi(\\infty) = C$\n", "2. $\\phi(z)$ has weaker than pole singularities\n", "\n", "is simply\n", "\n", "$$\n", "\\phi(z) = \\CC_\\Gamma f(z) + C\n", "$$" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.220446049250313e-16 + 0.0im" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = Fun()\n", "f = exp(x)\n", "C = 2\n", "φ = x -> cauchy(f, x) + C\n", "\n", "φ(0.1+0.0im)- φ(0.1-0.0im) -f(0.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Analytic functions are continuous, hence if $\\Gamma$ is in the domain of analyticity, we have $\\phi_+(x) - \\phi_-(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 \n", "$$\n", "\\CC_{\\Gamma_1 \\cup \\Gamma_2} f(z) = \\CC_{\\Gamma_1} f(z) + \\CC_{\\Gamma_2} f(z)\n", "$$\n", "We can also _fix_ up analyticity:\n", "\n", "**Example** \n", "Solve the Riemann–Hilbert problem\n", "\n", "1. $\\phi(z)$ analytic in $\\bar\\C \\backslash [-1,1]$\n", "2. $\\phi(\\infty) = -{\\I \\over 2}$\n", "2. $\\phi(z)$ has weaker than pole singularities everywhere\n", "2. $\\phi_+(x) - \\phi_-(x) = {\\sqrt{1-x^2} \\over x +2}$ for $-1 < x < 1$\n", "\n", "Consider the first guess\n", "$$\n", " \\psi(z) = - \\I {\\sqrt{z-1} \\sqrt{z+1} \\over 2(z + 2)}\n", "$$\n", "This satisfies 2, 3, and 4: it has the right jump on $-1 < x < 1$:\n", "$$\n", " \\psi_+(x) - \\psi_-(x) = {\\sqrt{1-x^2} \\over x+2}\n", "$$" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ψ(1.0e6) = 0.0 - 0.49999900000175im\n", "f(0.1) = 0.47380354147934295\n", "ψ(0.1 + 0.0im) - ψ(0.1 - 0.0im) = 0.47380354147934284 + 0.0im\n" ] } ], "source": [ "f = sqrt(1-x^2)/(x+2)\n", "ψ = z -> -im*sqrt(z-1)sqrt(z+1)/(2(z+2))\n", "@show ψ(1_000_000.0) # condition 2.\n", "@show f(0.1)\n", "@show ψ(0.1+0.0im) - ψ(0.1-0.0im); # condition 4." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The catch: it has a pole at $z = - 2$ 😩:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "-3\n", "\n", "\n", "-2\n", "\n", "\n", "-1\n", "\n", "\n", "0\n", "\n", "\n", "1\n", "\n", "\n", "2\n", "\n", "\n", "3\n", "\n", "\n", "-2\n", "\n", "\n", "-1\n", "\n", "\n", "0\n", "\n", "\n", "1\n", "\n", "\n", "2\n", "\n", "\n", "\n", "\n", "\n" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phaseplot(-3..3, -2..2, ψ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In particular, \n", "$$\n", "\\psi(z) = {\\I \\sqrt 3 \\over 2} {1 \\over z + 2} + O(1)\n", "$$\n", "near $z = -2$. Note that this takes a bit of care to work out since we are on the cancelling out branch cuts of $\\psi(z)$. But we do know away from $z = -2$ it is analytic, hence continuous, that is, \n", "$$\n", "\\psi(x) = \\lim_{\\epsilon \\rightarrow 0} \\psi(x \\pm \\I \\epsilon) = \\psi_\\pm(x)\n", "$$\n", "for real valued $x < -1$. In particular, we have\n", "$$\n", "\\psi(x) = \\psi_+(x) = - \\I { \\I \\sqrt{1-x} \\I \\sqrt{-x-1} \\over 2( x+2)} = \\I {\\sqrt{x^2 - 1} \\over 2( x+2)}\n", "$$\n", "\n", "\n", "Good thing it's a subtractive Riemann–Hilbert problem: we can subtract out the pole without impacting the jump. Therefore, we have\n", "$$\n", "\\phi(z) = \\psi(z) - {\\I \\sqrt 3 \\over 2} {1 \\over z + 2}=- \\I {\\sqrt{z-1} \\sqrt{z+1} \\over 2(z + 2)} - {\\I \\sqrt 3 \\over 2} {1 \\over z + 2}\n", "$$\n", "This is analytic off $[-2,2]$ (including at $z = -2$) and has the right jump:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "φ(1.0e6) = 0.0 - 0.49999986602542174im\n", "f(0.1) = 0.47380354147934295\n", "φ(0.1 + 0.0im) - φ(0.1 - 0.0im) = 0.47380354147934284 + 0.0im\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "-3\n", "\n", "\n", "-2\n", "\n", "\n", "-1\n", "\n", "\n", "0\n", "\n", "\n", "1\n", "\n", "\n", "2\n", "\n", "\n", "3\n", "\n", "\n", "-2\n", "\n", "\n", "-1\n", "\n", "\n", "0\n", "\n", "\n", "1\n", "\n", "\n", "2\n", "\n", "\n", "\n", "\n", "\n" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "φ = z -> ψ(z) - im*sqrt(3)/(2*(z+2))\n", "@show φ(1_000_000.0) # condition 2.\n", "@show f(0.1)\n", "@show φ(0.1+0.0im) - φ(0.1-0.0im) # condition 4.\n", "phaseplot(-3..3, -2..2, φ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Additive Riemann–Hilbert problem\n", "\n", "We now introduce the case $c = -1$, in other words, we want to solve\n", "$$\n", "\\phi_+(x) + \\phi_-(x) = f(x) \\qquad \\phi(\\infty) = 0\n", "$$\n", "and take $\\Gamma = [-1,1]$. This is equivalent to finding an unknown function $u(x)$ such that\n", "$$\n", "-\\I \\HH u(x) = f(x)\n", "$$\n", "\n", "\n", "#### Reduction to Cauchy transform\n", "\n", "Consider $\\phi(z) = {\\psi(z) \\over \\sqrt{z-1}\\sqrt{z+1} }$, so that\n", "$$\n", " f(x) = \\phi_+(x) + \\phi_-(x) = { \\psi_+(x) \\over \\I \\sqrt{1-x^2}} - {\\psi_-(x) \\over \\I \\sqrt{1-x^2}} = {\\psi_+(x) - \\psi_-(x) \\over \\I \\sqrt{1-x^2}}\n", "$$\n", "Thus we have reduced an additive Riemann–Hilbert problem to a subtractive one: if\n", "$$\\psi_+(x) - \\psi_-(x) = {f(x) \\I \\sqrt{1-x^2}},$$\n", "we satisfy the correct jump. Therefore, we have the solution\n", "$$\n", "\\phi(z) = {\\I \\over \\sqrt{z-1}\\sqrt{z+1}} \\CC_{[-1,1]} \\left[{ f \\sqrt{1-\\diamond^2}}\\right](z) \n", "$$" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "φ(1.0e8) = -2.825795526749808e-17 + 0.0im\n", "f(0.1) = 1.1051709180756475\n", "φ(0.1 + 0.0im) + φ(0.1 - 0.0im) = 1.1051709180756475 + 0.0im\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "-3\n", "\n", "\n", "-2\n", "\n", "\n", "-1\n", "\n", "\n", "0\n", "\n", "\n", "1\n", "\n", "\n", "2\n", "\n", "\n", "3\n", "\n", "\n", "-2\n", "\n", "\n", "-1\n", "\n", "\n", "0\n", "\n", "\n", "1\n", "\n", "\n", "2\n", "\n", "\n", "\n", "\n", "\n" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = Fun()\n", "f = exp(x)\n", "\n", "v = f*sqrt(1-x^2)\n", "\n", "φ = z -> im*cauchy(v, z)/(sqrt(z-1)sqrt(z+1))\n", "\n", "@show φ(1.0E8)\n", "@show f(0.1)\n", "@show φ(0.1+0.0im) + φ(0.1-0.0im);\n", "\n", "phaseplot(-3..3, -2..2, φ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Is this the only solution? No! consider\n", "$$\n", "\\kappa(z) = {1 \\over \\sqrt{z-1}\\sqrt{z+1}}\n", "$$\n", "which satisfies $\\kappa_+(x) + \\kappa_-(x) = 0$. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### General solution on $[-1,1]$ built _from_ a Cauchy transform\n", "\n", "Here we propose the general solution to an additive Riemann–Hilbert problem:\n", "\n", "**Theorem (Cauchy transform solution to Additive Riemann–Hilbert problem)** Suppose $\\phi(z)$ analytic in $\\C \\backslash [-1,1]$ satisfies\n", "\n", "1. $\\phi_+(x) + \\phi_-(x) = f(x) $ for $-1 < x < 1$, where $f$ is smooth on $[-1,1]$.\n", "2. $\\phi(z)$ has weaker than pole singularities,\n", "3. $\\phi(\\infty) = 0$.\n", "\n", "Then, for some constant $C$, \n", "$$\n", " \\phi(z) = {\\I \\over \\sqrt{z-1}\\sqrt{z+1}} \\CC_{[-1,1]} \\left[{ f(\\diamond) \\sqrt{1-\\diamond^2} }\\right](z) + {C \\over \\sqrt{z-1} \\sqrt{z+1}}\n", "$$\n", "\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "φ(1.0e8) = -6.543337674831032e-9 + 0.0im\n", "f(0.1) = 1.1051709180756475\n", "φ(0.1 + 0.0im) + φ(0.1 - 0.0im) = 1.1051709180756475 + 0.0im\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "-3\n", "\n", "\n", "-2\n", "\n", "\n", "-1\n", "\n", "\n", "0\n", "\n", "\n", "1\n", "\n", "\n", "2\n", "\n", "\n", "3\n", "\n", "\n", "-2\n", "\n", "\n", "-1\n", "\n", "\n", "0\n", "\n", "\n", "1\n", "\n", "\n", "2\n", "\n", "\n", "\n", "\n", "\n" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = Fun()\n", "f = exp(x)\n", "v = f*sqrt(1-x^2)\n", "\n", "C = randn() # doesn't matter\n", "\n", "φ = z -> im*cauchy(v, z)/(sqrt(z-1)sqrt(1+z)) + C/(sqrt(z-1)sqrt(z+1))\n", "\n", "@show φ(1.0E8)\n", "@show f(0.1)\n", "@show φ(0.1+0.0im) + φ(0.1-0.0im);\n", "\n", "phaseplot(-3..3, -2..2, φ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On other intervals $(a,b)$, we get the same forms of solution:\n", "\n", "$$\n", " \\phi(z) = {\\I \\over \\sqrt{z-b}\\sqrt{z-a}} \\CC_{[a,b]} \\left[{ f(\\diamond) \\sqrt{b-\\diamond}\\sqrt{\\diamond-a} }\\right](z) + {C \\over \\sqrt{z-b} \\sqrt{z-a}}\n", "$$\n", "\n", "### General solution on $[-1,1]$ _expressed as_ a Cauchy transform\n", "\n", "Note 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\n", "\n", "\\begin{align*}\n", " u(x) &= \\phi_+(x) - \\phi_-(x) = {1 \\over \\sqrt{1 - x^2}}\\left( \\CC_{[-1,1]}^+ + \\CC_{[-1,1]}^- \\right) \\left[{ f(\\diamond) \\sqrt{1-\\diamond^2} }\\right](x) - {2C \\I \\over \\sqrt{1-x^2}} \\\\\n", " &= {-\\I \\over \\sqrt{1 - x^2}}\\HH_{[-1,1]} \\left[{ f(\\diamond) \\sqrt{1-\\diamond^2} }\\right](x) - {2C \\I \\over \\sqrt{1-x^2}}\n", "\\end{align*}\n", "BY (**Plemelj II**), we guarantee that \n", "$$\n", "\\phi(z) = \\CC_{[-1,1]} u(z)\n", "$$" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "φ(1.0 + 2.0im) = 0.1674484261991792 - 0.2713677090129005im\n", "cauchy(u, 1.0 + 2.0im) = 0.16744842619917932 - 0.27136770901290047im\n" ] } ], "source": [ "x = Fun()\n", "f = exp(x)\n", "v = f*sqrt(1-x^2)\n", "\n", "C = randn() # doesn't matter\n", "\n", "φ = z -> im*cauchy(v, z)/(sqrt(z-1)sqrt(1+z)) + C/(sqrt(z-1)sqrt(z+1))\n", "\n", "u = -im/sqrt(1-x^2)*hilbert(f*sqrt(1-x^2)) - 2*C*im/sqrt(1-x^2)\n", "\n", "@show φ(1.0+2.0im);\n", "@show cauchy(u, 1.0+2.0im);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On other intervals we have\n", "\\begin{align*}\n", " u(x) &= {-\\I \\over \\sqrt{b - x}\\sqrt{x-a}}\\HH_{[a,b]} \\left[{ f(\\diamond) \\sqrt{b-\\diamond}\\sqrt{\\diamond-a} }\\right](x) - {2C \\I \\over \\sqrt{b-x} \\sqrt{x-a}}\n", "\\end{align*}\n", "\n", "\n", "In the special case where we can calculate \n", "$\\CC \\left[ f(\\diamond) \\sqrt{b-\\diamond}\\sqrt{\\diamond-a}\\right](z)$ exactly, we can work out the precise formula for $u(x)$ by taking the difference.\n", "\n", "\n", "**Example** Consider solving\n", "\n", "1. $\\phi_+(x) + \\phi_-(x) = x $ for $-b < x < b$\n", "2. $\\phi(z)$ has weaker than pole singularities,\n", "3. $\\phi(\\infty) = 0$.\n", "\n", "Note that \n", "$$\n", " \\kappa(z) = {z \\sqrt{z-b} \\sqrt{z+b} - z^2 + b^2/2 \\over 2 \\I} \n", "$$\n", "satisfies\n", "$$\n", "\\kappa^+(x) - \\kappa^-(x) = x \\sqrt{b^2 - x^2}\n", "$$\n", "and $\\kappa(\\infty) = 0$. The second property follows since $\\kappa$ is analytic off $[-1,1]$ and has at most polynomial growth at $\\infty$. To understand the order of the polynomial growth, it's sufficient to study the limit on the real axis as $x \\rightarrow \\infty$, where we use the Taylor series of $\\sqrt x$ near $1$ to determine:\n", "\\begin{align*}\n", "x \\sqrt{x-b}\\sqrt{x + b} &= x^2 \\sqrt{1-b/x} \\sqrt{1 + b/x} = x^2 \\left(1 - {b\\over 2x} - {b^2 \\over 8x^2}\\right) \\left(1 + {b\\over 2x} - {b^2 \\over 8x^2}\\right)\\\\\n", " = x^2 - {b^2\\over 2} + O(x^{-2})\n", "\\end{align*}" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "κ(100000.0) = 0.0 - 0.0im\n" ] }, { "data": { "text/plain": [ "(0.1997498435543818 + 0.0im, 0.1997498435543818)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = 2\n", "κ = z -> (z*sqrt(z-b)*sqrt(z+b) - z^2 + b^2/2)/(2im)\n", "@show κ(1E5)\n", "κ(0.1+0.0im)- κ(0.1-0.0im), 0.1sqrt(b^2-0.1^2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hence every solution has the form\n", "\\begin{align*}\n", "\\phi(z) = {1 \\over \\sqrt{z-b} \\sqrt{z+b}} \\left({z \\sqrt{z-b} \\sqrt{z+b} - z^2 + b^2/2 \\over 2 } \\right) + {C \\over \\sqrt{z-b} \\sqrt{z+b}} \\\\\n", "= {z \\over 2 } - {z^2 \\over 2 \\sqrt{z-b} \\sqrt{z+b}} + {D \\over \\sqrt{z-b} \\sqrt{z+b}}\n", "\\end{align*}\n", "where $D$ is again a arbitrary constant." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.1 + 0.0im" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D = randn()\n", "\n", "φ = z -> z/(2) - z^2/(2*sqrt(z-b)*sqrt(z+b)) + D/(sqrt(z-b)*sqrt(z+b))\n", "φ(0.1+0.0im) + φ(0.1-0.0im)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inspection reveals that\n", "$$\n", "u(x) = \\phi_+(x) - \\phi_-(x) = \\I {x^2 - 2D \\over \\sqrt{b^2-x^2}}\n", "$$" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cauchy(u, 2 + 2im) = -0.38895324392466324 + 0.8558850675485229im\n", "φ(2 + 2im) = -0.3889532439246629 + 0.8558850675485228im\n" ] } ], "source": [ "x = Fun(-b..b)\n", "u = im*(x^2 - 2D)/sqrt(b^2 - x^2)\n", "@show cauchy(u ,2+2im)\n", "@show φ(2+2im);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Therefore, $\\CC u(z)$ satsifies $\\CC^+u(x) + \\CC^- u(x) = x$:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.041082298011221145 + 0.0im" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cauchy(u, 0.1+0.0im) + cauchy(u, 0.1-0.0im)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$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) = \\I x^2 / \\sqrt{b^2-x^2}$." ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "-2\n", "\n", "\n", "-1\n", "\n", "\n", "0\n", "\n", "\n", "1\n", "\n", "\n", "2\n", "\n", "\n", "-5.0\n", "\n", "\n", "-2.5\n", "\n", "\n", "0.0\n", "\n", "\n", "2.5\n", "\n", "\n", "5.0\n", "\n", "\n", "Im\n", "\n", "\n", "\n", "\n", "\n", "\n", "u s.t. u(0) = 0\n", "\n", "\n" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D = 0\n", "u = im*(x^2 - 2D)/sqrt(b^2 - x^2)\n", "plot(imag(u); ylims=(-5,5), yaxis=\"Im\", label=\"u s.t. u(0) = 0\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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 $\\pm b$ by choosing $D = b^2/2$:\n", "$$\n", "\\phi_+(x) - \\phi_-(x) = -\\I \\sqrt{b^2 - x^2}\n", "$$" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cauchy(u, 0.1 + 0.0im) + cauchy(u, 0.1 - 0.0im) = 0.10000000000000007 + 0.0im\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "-2\n", "\n", "\n", "-1\n", "\n", "\n", "0\n", "\n", "\n", "1\n", "\n", "\n", "2\n", "\n", "\n", "-2.0\n", "\n", "\n", "-1.5\n", "\n", "\n", "-1.0\n", "\n", "\n", "-0.5\n", "\n", "\n", "0.0\n", "\n", "\n", "Im\n", "\n", "\n", "\n", "\n", "\n", "\n", "u\n", "\n", "\n" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = 2.3\n", "x = Fun(-b .. b)\n", "u = -im*sqrt(b^2 - x^2)\n", "@show cauchy(u, 0.1+0.0im) + cauchy(u, 0.1-0.0im)\n", "plot(imag(u); label=\"u\", yaxis=\"Im\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In other words,\n", "$$\n", "\\phi(z) = - \\I \\CC_{[-b,b]} \\sqrt{b^2 - \\diamond^2}(z)\n", "$$\n", "is a bounded solution to the additive Riemann–Hilbert problem.\n", "\n", "## Inverting the Hilbert transform\n", "\n", "We can use this along with Plemelj's lemma to invert the Hilbert transform. That is, we want to find $v(x)$ such that\n", "$$\n", "\\HH v(x) = f(x)\n", "$$\n", "Based on the above construction of $u(x)$, consider\n", "$$\n", " v(x) =-\\I u(x) = {-1 \\over \\sqrt{1 - x^2}}\\HH_{[-1,1]} \\left[{ f(\\diamond) \\sqrt{1-\\diamond^2} }\\right](x) - {2C \\over \\sqrt{1-x^2}}\n", "$$ " ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-2.220446049250313e-16" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x= Fun()\n", "f = exp(x)\n", "\n", "C = randn()\n", "v = -1/sqrt(1-x^2)*hilbert(f*sqrt(1-x^2)) - 2*C/sqrt(1-x^2)\n", "hilbert(v, 0.1) - exp(0.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This construction works since $\\phi(z) = \\CC u(z) = \\I \\CC v(z)$, and\n", "$$\n", "\\HH v(x) = \\I (\\CC^+ + \\CC^-) v(x) = \\phi^+(x) + \\phi^-(x) = f(x)\n", "$$\n", "\n", "**Example** \n", "\n", "Consider $\\HH_{[-b,b]} v(x) = x$. We have \n", "$$\n", " -\\I \\HH_{[-b,b]} \\sqrt{b^2 - \\diamond^2}(x) = \\CC_{[-b,b]}^+ \\sqrt{b^2 - \\diamond^2}(z) + \\CC_{[-b,b]}^- \\sqrt{b^2 - \\diamond^2}(z) = \\I (\\phi^+(x) + \\phi^-(x) ) = \\I x\n", "$$\n", "which shows that the solution is\n", "$$\n", "v(x) = - \\sqrt{b^2 - \\diamond^2}\n", "$$" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "-2\n", "\n", "\n", "-1\n", "\n", "\n", "0\n", "\n", "\n", "1\n", "\n", "\n", "2\n", "\n", "\n", "-3\n", "\n", "\n", "-2\n", "\n", "\n", "-1\n", "\n", "\n", "0\n", "\n", "\n", "1\n", "\n", "\n", "2\n", "\n", "\n", "3\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "v\n", "\n", "\n", "\n", "H[v]\n", "\n", "\n" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = Fun(-b .. b)\n", "v = -sqrt(b^2 - x^2)\n", "\n", "plot(v; label = \"v\")\n", "plot!(hilbert(v); ylims=(-3,3), label=\"H[v]\")" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.0.2", "language": "julia", "name": "julia-1.0" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.0.2" } }, "nbformat": 4, "nbformat_minor": 2 }