{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "using Plots, ComplexPhasePortrait, ApproxFun\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\\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", "Office Hours: 3-4pm Mondays, Huxley 6M40\n", "
\n", "Website: https://github.com/dlfivefifty/M3M6LectureNotes\n", "\n", "\n", "\n", "# Lecture 8: Functions with branch cuts\n", "\n", "\n", "\n", "We now discuss functions with branch cuts\n", "\n", "1. $\\log z$ with a cut on $(-\\infty,0]$\n", "2. $z^\\alpha$ with a cut on $(-\\infty,0]$\n", "3. $\\sqrt{z-1}\\sqrt{z+1}$ with a cut on $[-1,1]$\n", "4. $\\rm{sign}(|z|-1)$ with a cut on the unit circle.\n", "\n", "This is a step towards a Cauchy integral theorem on cuts, for recovering a holomorphic function from its behaviour on a cut.\n", "\n", "1. Complex logarithm\n", "2. Algebraic powers\n", "3. Inferred analyticity\n", "\n", "We begin with $\\log z$. \n", "\n", "## Complex logarithm\n", "\n", "\n", "\n", "**Definition (Complex Logarithm)**\n", "$$\\log z = \\int_1^z {1 \\over \\zeta} d\\zeta$$\n", "where the integral is understood to be on a straight line segment, that is\n", "$$\\log z = \\int_{\\gamma_z} {1 \\over \\zeta} d\\zeta$$\n", "where\n", "$\\gamma_z(t) = 1 + (z-1)t$ for $0 \\leq t \\leq 1$.\n", "\n", "_Demonstration_ this shows the integral path for a point $z$. We see how the path avoids the pole of $\\zeta^{-1}$ at the origin:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": false }, "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", "\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", "-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", "\n", "\n", "\n", "\n", "contour\n", "\n", "\n" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = -2 + 1.0im\n", "phaseplot(-3..3, -3..3, ζ -> 1/ζ)\n", "t = 0:0.1:1\n", "γ = 1 .+ (z-1)*t\n", "plot!(real.(γ), imag.(γ); color=:black, label=\"contour\", arrow=true)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is well-defined apart from $z \\in (-\\infty,0]$, where there is a pole on the contour. This induces a _branch cut_: a jump in the value of the function. " ] }, { "cell_type": "code", "execution_count": 3, "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", "\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", "-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" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phaseplot(-3..3, -3..3, z -> log(z))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that the limits from above and below exist: we can define\n", "$$\n", "\\begin{align*}\n", "\\log_+ x &= \\lim_{\\epsilon \\rightarrow 0^+} \\log(x+\\I \\epsilon) \\\\\n", "\\log_- x &= \\lim_{\\epsilon \\rightarrow 0^+} \\log(x-\\I \\epsilon)\n", "\\end{align*}\n", "$$\n", "and calculate their values via:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0 + 3.141592653589793im, 0.0 - 3.141592653589793im)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "log(-1+0.0im), log(-1-0.0im)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By deformation, the value of the integrals is independent of the path: here we calculate the integral on an arc:" ] }, { "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", "\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", "-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", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "contour\n", "\n", "\n", "\n", "deformed\n", "\n", "\n" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "θ = range(0, stop=0.9π, length=100)\n", "a = exp.(im*θ)\n", "\n", "z = exp(0.9*π*im)\n", "\n", "γ = 1 .+ (z-1)*t\n", "phaseplot(-3..3, -3..3, ζ -> 1/ζ)\n", "plot!(real.(γ), imag.(γ); color=:black, label=\"contour\", arrow=true)\n", "plot!(real.(a), imag.(a), color=:black, linestyle=:dash, label=\"deformed\", arrow=true)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This works all the way to the negative real axis. Here we calculate $\\log_\\pm 1$ using integrals over half circles:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(9.692284352069077e-17 + 3.141592653589793im, 9.692284352069077e-17 - 3.141592653589793im)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(Fun(ζ -> 1/ζ, Arc(0.,1.,(0.,π)))),\n", "sum(Fun(ζ -> 1/ζ, Arc(0.,1.,(0.,-π))))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Combining the two contours we have\n", "$$\n", "\\log_+(-1) - \\log_-(-1) = \\oint {\\D\\zeta \\over \\zeta} = 2 \\pi \\I\n", "$$" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0 + 6.283185307179586im, -7.882330173426647e-16 + 6.283185307179586im)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "log(-1.0+0im) - log(-1.0-0im), sum(Fun(ζ -> 1/ζ, Circle()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can establish some properties. First we show that $\\log z = - \\log {1 \\over z}$ by considering the change of variables $\\zeta = {1 \\over s}$. Because $\\gamma_z(t)^{-1}$ stays uniformly in the lower-half plane, we can deform it to a straight contour, which gives us the result:\n", "$$\n", "\\log z = \\int_{\\gamma_z} {\\D\\zeta \\over \\zeta} = -\\int_{{1 \\over \\zeta} \\circ \\gamma_z} {\\D s \\over s} = - \\int_{\\gamma_{z^{-1}}} {\\D s \\over s} = -\\log z^{-1} \n", "$$\n", "\n", "Here's a plot of the relevant contours:" ] }, { "cell_type": "code", "execution_count": 8, "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", "\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", "-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", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "contour\n", "\n", "\n", "\n", "change of variables contour\n", "\n", "\n", "\n", "deformed contour\n", "\n", "\n" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phaseplot(-3..3, -3..3, z -> log(z))\n", "z = -2 + 2im\n", "\n", "γ = (z,t) -> 1 + t*(z-1)\n", "tt = range(0,stop=1,length=100)\n", "\n", "plot!(real.(γ.(z,tt)), imag.(γ.(z,tt)); color=:black, label=\"contour\", arrow=true)\n", "plot!(real.(1 ./ γ.(z,tt)), imag.(1 ./ γ.(z,tt)); color=:black, linestyle=:dash, arrow=true, label=\"change of variables contour\")\n", "plot!(real.(γ.(1/z,tt)), imag.(γ.(1/z,tt)); color=:black, linestyle=:dashdot, arrow=true, label=\"deformed contour\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we see by looking at the phase plot that the two functions match:" ] }, { "cell_type": "code", "execution_count": 9, "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", "\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", "-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" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phaseplot(-3..3, -3..3, z -> -log(1/z))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Algebraic powers\n", "\n", "\n", "**Definition (algebraic power)** \n", "$$z^\\alpha = e^{\\alpha \\log z}$$\n", "\n", "Note, for example, when $\\alpha = 1/2$, $\\sqrt z \\equiv z^{1/2}$ is only one solution to $y^2 = z$.\n", "\n", "Here's a phase plot showing that $\\sqrt{z}$ also has a branch cut on $(-\\infty,0]$:" ] }, { "cell_type": "code", "execution_count": 10, "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", "\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", "-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" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "α = 0.5\n", "phaseplot(-3..3, -3..3, z -> z^α)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On the branch cut along $(-\\infty,0]$ it has the jump:\n", "\n", "$${x_+^\\alpha \\over x_-^\\alpha} = e^{\\alpha (\\log_+ x - \\log_- x)} = e^{2 \\pi \\I \\alpha}$$\n", "\n", "In particular,\n", "\n", "$$\\sqrt{x}_+ = -\\sqrt{x}_- = i \\sqrt{|x|}$$" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0 - 1.0im, -0.0 - 1.0im)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sqrt(-1-0.0im) , -sqrt(-1 + 0.0im)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These are _multiplicative jumps_. We also have a _subtractive jumps_:\n", "\n", "\\begin{align*}\n", "x_+^\\alpha - x_-^\\alpha &= e^{\\alpha \\log_+ x} - e^{\\alpha \\log_- x} = e^{\\alpha \\log(-x) + \\I \\pi \\alpha} - e^{\\alpha \\log(-x) - \\I \\pi \\alpha} \\cr\n", " & = 2 \\I (-x)^\\alpha \\sin \\pi \\alpha\n", "\\end{align*}" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0 + 2.8284271247461903im, 0.0 + 2.8284271247461903im)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = -2\n", "(x+0.0im)^α - (x-0.0im)^α, 2im*(-x)^α*sin(π*α)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "and an _additive jump_:\n", "\\begin{align*}\n", "x_+^\\alpha + x_-^\\alpha & = 2 (-x)^\\alpha \\cos \\pi \\alpha\n", "\\end{align*}" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0 + 0.0im, 1.2246467991473532e-16)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = -1\n", "(x+0.0im)^α + (-1-0.0im)^α, 2*(-x)^α*cos(π*α)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In particular, for $x < 0$,\n", "\\begin{align*}\n", "\\sqrt{x}_+ - \\sqrt{x}_- &= 2 \\I \\sqrt{-x} \\\\\n", "\\sqrt{x}_+ + \\sqrt{x}_- &= 0\n", "\\end{align*}" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sqrt(x+0.0im) - sqrt(x-0.0im) == 2im*sqrt(-x)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0 + 0.0im" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sqrt(x+0.0im) + sqrt(x-0.0im)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at another example: $\\varphi(z) = \\sqrt{z-1}\\sqrt{z+1}$. " ] }, { "cell_type": "code", "execution_count": 16, "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", "\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", "-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" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "φ = z -> sqrt(z-1)*sqrt(z+1)\n", "phaseplot(-3..3, -3..3, φ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For $x > 0$ it's holomorphic. For $-1 < x < 1$ we have the multiplicative jump\n", "\n", "$$\\varphi_+(x) = \\sqrt{x-1}_+ \\sqrt{x+1} = - \\sqrt{x-1}_- \\sqrt{x+1} = -\\varphi_-(x)$$\n", "which gives the additive jump\n", "$$\n", "\\varphi_+(x) + \\varphi_-(x) = 0\n", "$$" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0 + 0.0im" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = 0.1\n", "φ(x + 0.0im) + φ(x - 0.0im)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " But we also have a _subtractive jump_:\n", "$$\n", "\\varphi_+(x) - \\varphi_-(x) = (\\sqrt{x-1}_+ - \\sqrt{x-1}_-) \\sqrt{x+1} = 2\\I \\sqrt{1-x}\\sqrt{x+1} = 2\\I \\sqrt{1 - x^2}\n", "$$" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0 + 1.98997487421324im, 0.0 + 1.98997487421324im)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = 0.1\n", "φ(x + 0.0im) - φ(x - 0.0im), 2im*sqrt(1-x^2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For $x < -1$ we actually have continuity:\n", "\n", "$$\\varphi_+(x) = \\sqrt{x-1}_+ \\sqrt{x+1}_+ = (- \\sqrt{x-1}_-)(- \\sqrt{x+1}_-) = \\varphi_-(x)$$" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-2.8284271247461903 + 0.0im, -2.8284271247461903 - 0.0im)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "φ = z -> sqrt(z-1)sqrt(z+1)\n", "\n", "x = -3.0\n", "φ(x+0.0im), φ(x-0.0im)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Inferred analyticity\n", "\n", "But continuity _implies_ analyticity, using Cauchy's integral formula:\n", "\n", "**Theorem (continuity on a curve implies analyticity)** Let $D$ be a domain and $\\gamma \\subset D$ a contour. Suppose $f$ is analytic in $D \\backslash \\gamma$, and continuous on the interior of $\\gamma$. Then $f$ is analytic in $D \\backslash \\{\\gamma(a), \\gamma(b) \\}$.\n", "\n", "**Sketch of Proof** \n", "\n", "For simplicity, suppose $D$ is a circle of radius 2 and $\\gamma$ is the interval $[-1,1]$. For any $z$ off the interval, we can write \n", "$$\n", "f(z) = {1 \\over 2 \\pi \\I} \\oint_{\\Gamma_x} {f(\\zeta) \\over \\zeta - z} \\D\\zeta\n", "$$\n", "where $\\Gamma_x$ is a simple closed contour that surrounds $z$ and passes through $x$ in both directions:" ] }, { "cell_type": "code", "execution_count": 20, "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", "-1.5\n", "\n", "\n", "-1.0\n", "\n", "\n", "-0.5\n", "\n", "\n", "0.0\n", "\n", "\n", "0.5\n", "\n", "\n", "1.0\n", "\n", "\n", "1.5\n", "\n", "\n", "-0.50\n", "\n", "\n", "-0.25\n", "\n", "\n", "0.00\n", "\n", "\n", "0.25\n", "\n", "\n", "0.50\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "x\n", "\n", "\n", "\n", "\n", "z\n", "\n", "\n", "\n", "Unit interval\n", "\n", "\n", "\n", "Contour\n", "\n", "\n" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = 0.2+0.2im\n", "x = 0.1\n", "ε = 0.001\n", "scatter([x],[0.]; label=\"x\", xlims=(-1.5,1.5), ylims=(-0.5,0.5))\n", "scatter!([real(z)],[imag(z)]; label=\"z\")\n", "plot!(-1..1; label=\"Unit interval\", linestyle=:dot)\n", "\n", "Γₓ = Arc(z, 0.1, (-π/2,π)) ∪ Segment(0.2+0.1im,0.2 +0.0im) ∪ Segment(0.2 +0.0im, -0.9 +0.0im) ∪\n", " Circle(-1.0, 0.1) ∪ Segment(-0.9 -0.0im, 0.2 -0.0im) ∪ Segment(0.2-0.0im, 0.2 - 0.2im) ∪\n", " Segment(0.2 - 0.2im, -1.2-0.2im) ∪ Segment(-1.2 -0.2im, -1.2+ 0.2im) ∪ \n", " Segment(-1.2+ 0.2im, 0.1+0.2im)\n", "\n", "plot!(Γₓ; label=\"Contour\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Because $f$ is continuous at $x$, we have\n", "$$f_+(x) = f_-(x) = f(x)$$\n", "where\n", "$$f_\\pm(x) = \\lim_{\\epsilon \\rightarrow 0} f(x \\pm \\I \\epsilon)\n", "$$\n", "Therefore, the two integrals along $[-1,1]$ cancel out and we get:\n", "$$\n", " f(z) = {1 \\over 2 \\pi \\I} \\oint_{{\\tilde \\Gamma}_x} {f(\\zeta) \\over \\zeta - z} \\D \\zeta\n", "$$\n", "where ${\\tilde \\Gamma}_x$ is $\\Gamma_x$ with the contour on the interval removed:" ] }, { "cell_type": "code", "execution_count": 21, "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", "-1.5\n", "\n", "\n", "-1.0\n", "\n", "\n", "-0.5\n", "\n", "\n", "0.0\n", "\n", "\n", "0.5\n", "\n", "\n", "1.0\n", "\n", "\n", "1.5\n", "\n", "\n", "-0.50\n", "\n", "\n", "-0.25\n", "\n", "\n", "0.00\n", "\n", "\n", "0.25\n", "\n", "\n", "0.50\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "x\n", "\n", "\n", "\n", "\n", "z\n", "\n", "\n", "\n", "Unit interval\n", "\n", "\n", "\n", "Contour\n", "\n", "\n" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = 0.2+0.2im\n", "x = 0.1\n", "ε = 0.001\n", "scatter([x],[0.]; label=\"x\", xlims=(-1.5,1.5), ylims=(-0.5,0.5))\n", "scatter!([real(z)],[imag(z)]; label=\"z\")\n", "plot!(-1..1; label=\"Unit interval\", linestyle=:dot)\n", "\n", "Γ̃ₓ = Arc(z, 0.1, (-π/2,π)) ∪ Segment(0.2+0.1im,0.2 -0.2im) ∪ Circle(-1.0, 0.1) ∪\n", " Segment(0.2 - 0.2im, -1.2-0.2im) ∪ Segment(-1.2 -0.2im, -1.2+ 0.2im) ∪ \n", " Segment(-1.2+ 0.2im, 0.1+0.2im)\n", "\n", "plot!(Γ̃ₓ; label=\"Contour\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This integral expression holds for all $z$ inside the contour $\\tilde \\Gamma_x$ but off the interval. But it therefore holds true for $f(x) = f_+(x) = f_-(x)$ by taking limits. Thus\n", "$$f(x) = {1 \\over 2 \\pi \\I} \\int_{{\\tilde \\Gamma}_x} {f(\\zeta) \\over \\zeta -x} \\D\\zeta$$\n", "hence $f$ is analytic at $x$.\n", "\n", "⬛️" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Theorem (weaker than pole singularity implies analyticity)** Suppose $f$ is analytic in $D \\backslash \\{ z_0 \\}$ and has a weaker than pole singularity at $z_0$:\n", "$$\\lim_{z \\rightarrow z_0} (z-z_0) f(z) = 0$$\n", "holds uniformly. Then $f$ is analytic at $z_0$. (More precisely: $f$ can be analytically continued to $z_0$.)\n", "\n", "**Proof** \n", "\n", "Around $z_0$ is an annulus $A_{R0}$ inside which $f$ is analytic. Consider $z$ in $A_{R0}$ and a positively oriented circle $\\gamma_r$ of radius $r$ with $|r| < |z-z_0|$. Then we have\n", "$$\n", " f(z) = {1 \\over 2 \\pi \\I} \\oint_{\\gamma_R} {f(\\zeta) \\over \\zeta - z} \\D \\zeta - {1 \\over 2 \\pi \\I} \\oint_{\\gamma_r} {f(\\zeta) \\over \\zeta - z} \\D \\zeta .\n", "$$\n", "here's a plot:" ] }, { "cell_type": "code", "execution_count": 22, "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", "\n", "\n", "\n", "\n", "-0.1\n", "\n", "\n", "0.0\n", "\n", "\n", "0.1\n", "\n", "\n", "0.2\n", "\n", "\n", "0.3\n", "\n", "\n", "0.4\n", "\n", "\n", "0.5\n", "\n", "\n", "-0.1\n", "\n", "\n", "0.0\n", "\n", "\n", "0.1\n", "\n", "\n", "0.2\n", "\n", "\n", "0.3\n", "\n", "\n", "0.4\n", "\n", "\n", "0.5\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "z_0\n", "\n", "\n", "\n", "\n", "z\n", "\n", "\n", "\n", "gamma_r\n", "\n", "\n", "\n", "gamma_R\n", "\n", "\n" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z₀ = 0.2 +0.2im\n", "z = 0.4 +0.2im\n", "\n", "scatter([real(z₀)],[imag(z₀)]; label=\"z_0\")\n", "scatter!([real(z)],[imag(z)]; label=\"z\")\n", "plot!(Circle(z₀, 0.1); label=\"gamma_r\")\n", "plot!(Circle(z₀, 0.3); label=\"gamma_R\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But we have\n", "$$\n", " \\left| \\oint_{\\gamma_r} {f(\\zeta) \\over \\zeta - z} \\D \\zeta \\right| \\leq 2\\pi r \\sup_{\\zeta \\in \\gamma_r} \\left|{f(\\zeta) \\over \\zeta - z}\\right| \\leq 2 \\pi {1 \\over |z_0-z| - r} \\sup_{\\zeta \\in \\gamma_r} |f(\\zeta)|\n", "$$\n", "which tends to zero as $r \\rightarrow 0$.\n", "\n", "⬛️" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "**Corollary (Weaker than linear growth implies analyticity at infinity)** If \n", "$$\n", "\\lim_{z \\rightarrow \\infty} {f(z) \\over z} = 0,\n", "$$ then $f$ is analytic at infinity.\n", "\n", "\n", "From these result we can infer that \n", "$$\\phi(z) = \\sqrt{z-1}\\sqrt{z+1}$$\n", "is analytic on $\\C \\backslash [-1,1]$, and $\\phi(z) \\sim_{z \\rightarrow \\infty} z$.\n", "\n", "\n", "### Uniqueness results from inferred singularity\n", "\n", "Recall that an important ingredient of complex analysis is Liouville's theorem:\n", "\n", "**Theorem (Liouville)** If $f$ is entire and bounded in ${\\mathbb C}$, then $f$ must be constant.\n", "\n", "\n", "We will see that knowledge of the behaviour of $\\phi$ can be used to recover by its behaviour at its singularities at $\\infty$ and jump on $[-1,1]$. But before that, we already have the following uniqueness results by combining the above with Liouville's theorem:\n", "\n", "\n", "1. $\\phi(z)$ is the unique function analytic in $\\C \\backslash [-1,1]$ with weaker than pole singularities at $\\pm 1$ satisfying $\\phi(z) \\sim z$ and \n", "$$\\phi_+(x) - \\phi_-(x) = 2\\I \\sqrt{1-x^2} \\qqfor -1 < x <1.$$ \n", "2. $\\kappa(z) = {1 \\over \\sqrt{z-1} \\sqrt{z+1}}$ is the unique function analytic in $\\bar\\C \\backslash [-1,1]$ with weaker than pole singularities at $\\pm 1$ satisfying $\\kappa(\\infty) = 0$ and \n", "$$\n", "\\kappa_+(x) - \\kappa_-(x) = {-2\\I \\over \\sqrt{1-x^2}}\\qqfor -1 < x <1.\n", "$$\n", "\n", "_Demonstration_ From the phase plot we see it has a branch cut on $[-1,1]$:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "scrolled": false }, "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", "\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", "-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" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "κ = z -> 1/(sqrt(z-1)sqrt(z+1))\n", "phaseplot(-3..3, -3..3, κ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On the branch there is the expected jump:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.0 - 2.010075630518424im, 0.0 - 2.010075630518424im)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = 0.1\n", "κ(x + 0.0im) - κ(x - 0.0im) , -2im/sqrt(1-x^2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For $x < -1$ the branch cut is removable: we have continuity and therefore analyticity:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0 - 0.0im" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = -2.3\n", "κ(x + 0.0im) - κ(x - 0.0im) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "3\\. $\\mu(z) = {\\log(z -1) - \\log(z+1) \\over 2 \\pi \\I}$ is the unique function analytic in $\\C \\backslash [-1,1]$ with weaker than pole singularities at $\\pm 1$ satisfying $\\mu(\\infty) = 0$ and \n", "$$\\mu_+(x) - \\mu_-(x) = 1 \\qqfor -1 < x < 1.$$\n", "\n", "_Demonstration_ Here we see from the phase plot of $mu$ that it has a branch cut on $[-1,1]$:" ] }, { "cell_type": "code", "execution_count": 26, "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", "\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", "-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" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "μ = z -> (log(z-1) - log(z+1))/(2π*im)\n", "phaseplot(-3..3, -3..3, μ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For $-1 < x < 1$ we have the jump $1$:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0 + 0.0im" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = 0.3\n", "μ(x + 0.0im) - μ(x - 0.0im) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For $x < -1$ we see that the branch cuts cancel and we have continuity:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0 + 0.0im" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = -4.3\n", "μ(x + 0.0im) - μ(x - 0.0im) " ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.0.1", "language": "julia", "name": "julia-1.0" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.0.1" } }, "nbformat": 4, "nbformat_minor": 2 }