Bubbles Bad; Ripples Good

Goal: think uncommonly about common things; explain uncommon things commonly.

Decay of Waves IV: Numerical Interlude

I offer two videos. In both videos the same colour scheme is used: we have four waves in red, green, blue, and magenta. The four represent the amplitudes of spherically symmetric free waves on four different types of spatial geometries: 1 dimension flat space, 2 dimensional flat space, 3 dimensional flat space, and a 3 dimensional asymptotically flat manifold with “trapping” (has closed geodesics). Can you tell which is which? (Answer below the fold.)

Read the rest of this entry »

What’s wrong with tests

Find the errors!

I was tasked with grading the following exam question:

Using methods discussed in class this term, find the mean value over [-\pi,\pi] of the function f(x) = \sin(2x) \cdot \exp [1 - \cos (2x)].

The conceptual parts of the question are (based on the syllabus of the course)

  1. Connecting “mean value of a continuous function over an interval” with “integration”, an application of calculus to probability theory and statistics.
  2. Evaluating an integral by substitutions/change of variables.
  3. Familiarity with the trigonometric functions \sin, \cos and their properties (periodicity, derivative relations, etc).

I was told to grade with an emphasis on the above, so I prepared a grading rubric such that the above three key ideas gave most of the points. Here’s an otherwise reasonable answer that unfortunately does not use the methods discussed in class and so would receive (close to) zero credit (luckily no students turned in an answer like this):

The function f(x) satisfies f(x) = - f(-x), i.e. it is odd. So the average (f(x) + f(-x))/2 = 0. Since for every x\in [-\pi,\pi], we also have -x \in [-\pi,\pi], the mean value of f(x) over that interval must be zero.

Here are some responses that can get quite a good number of points* (at least more than the above answer) based on the grading rubric (I guess it means I wasn’t imaginative enough in coming up with possible student errors). (I took the liberty of combining some of the most awful bits from different answers; the vast majority of the students’ answers are not nearly that horrible**, though only one student remembered that when changing variables one also needs to change the limits of integration.) Since most students who made any reasonable attempt on the question successfully wrote down the integral

\displaystyle \mu = \frac{1}{\pi - (-\pi)} \int_{-\pi}^\pi f(y)~\mathrm{d}y

(which is not to say no unreasonable attempts were made: just ask the poor bloke who decided that the Mean Value Theorem must play a role in this question), I will start from there. All mistakes below are intentional on my part. What amazed me most is how many students were able to get to the correct mean value… Read the rest of this entry »

Bubbles!

Joachim Krieger and I posted a new pre-print on the critical nonlinear wave equation. After close to four years of the existence of this blog I finally have a paper out that actually relates to the title of this blog! Considering that the paper itself is only ten pages long, I will just direct readers to the arXiv instead of writing more about it here

“The asymptotically hyperboloidal is not asymptotically null.”

By way of Roland Donninger, I learned today of the statement above which is apparently well-known in the numerical relativity community.

It may seem intuitively surprising: after all, the archetype of an asymptotically hyperboloidal surface is the hyperboloid as embedded in Minkowski space. Let (t,r, \omega)\in \mathbb{R}\times\mathbb{R}_+ \times \mathbb{S}^{d-1} be the spherical coordinate system for the Minkowski space \mathbb{R}^{1,d}, the hyperboloid embeds in it as the surface t^2 - r^2 = 1. If you draw a picture we see clearly that the surface is asymptotic to the null cone t = |r|

The key, however, lies in the definition. For better or for worse, the definition under which the titular statement makes sense the following:

Definition
Let (M,g) be an asymptotically simple space-time (or one for which one can define a Penrose compactification), and let (\bar{M},\Omega^2 g) be the compactified space-time. We say that a hypersurface \Sigma \subset M is asymptotically null if the \bar{\Sigma}\cap \bar{M} transversely and the tangent space of \bar{\Sigma} is null along \partial\bar{M}.

Now suppose near \partial\bar{M} we can foliate via a double-null foliation (u,v), with \partial\bar{M} = \{ u = 0\}. Let x be a coordinate on \partial\bar{M} so that (u,v,x) form a coordinate system for a neighborhood of \partial\bar{M}. Assume that our surface \Sigma can be written as a graph

v = \phi(u,x)

where \phi is a C^3 function. Then the asymptotically null condition is just that \partial_u \phi |_{u = 0} = 0. Taking a Taylor expansion we have that this means

v \approx \phi_{\infty}(x) + \phi^{(2)}_{\infty}(x) u^2.

For the usual conformal compactification of Minkowski space, we have u = \frac{\pi}{2} - \cot^{-1}\left( \frac{1}{r+t}\right). Hence we require that an asymptotically null surface to have convergence to the null surface at rate O(1/(r+t)^2) (if \phi is sufficiently differentiable; if we relax the differentiability at infinity we see that the above condition allows us to relax all the way to O(1/(r+t)^{1+}), but O(1/(r+t)) is not admissible).

On the other hand, the hyperboloid is given by (r+t)(r-t) = -1 \implies r-t = v = O(1/(r+t)) and so is not asymptotically null. And indeed, we can also check by direct computation that in the usual conformal compactification of Minkowski space, the limit of the hyperboloid at null infinity is space-like.

Whitney extension and counterexample to Sard’s theorem

In a first course in differential geometry/topology we are often taught the following version of Sard’s theorem:

Theorem (Sard, smooth case)
Let M and N be (finite dimensional) smooth manifolds, and let f:M\to N be a smooth (infinitely differentiable) map. Let S\subset N be the set of critical values, that is, for every y \in S there exists x \in f^{-1}(y) such that f'(x) is not surjective. Then S has measure zero.

It turns out that Sard in his 1942 paper proved something stronger.

Theorem (Sard)
Let f:\mathbb{R}^m \supset M\to N\subset \mathbb{R}^n be a mapping of class C^k (all partial derivatives up to order k exists and are continuous) for k \geq 1. Let S\subset N be defined as above. And if either

  1. m \leq n; or
  2. m > n and k \geq m - n + 1,

then S has measure 0.

Over at MathOverflow, Sergei Ivanov has shown that in the case m = n = 1, the statement can be modified so that C^1 is not necessary.

In this post, we will describe counterexamples in the case m > n if the condition on k is not satisfied. We will also sketch a natural generalisation of Ivanov’s argument for higher dimensions. Read the rest of this entry »

What is mathematical literacy?

There is a wonderful mathematics joke, usually told about Von Neumann, but sometimes with other mathematicians swapped in, it features the following math problem

A train is traveling west at 70 miles per hour, and a train is traveling east at 80 miles an hour. They started 300 miles apart. A fly decided to challenge itself and, at 100 miles per hour, flew from the west-bound train train to the other, and then back, and then forward, and then back, until the two trains passed each other. (An exercise path that is somewhat akin to what we call “suicides” in high school swim practice.) Question: what is the total distance traveled by the fly?

There are two ways to do this problem.

  1. The brute-force way. The fly and the east-bound train are moving toward each other at 180mph. Starting at 300 miles apart they would meet after 300/180 = 100/60 hours = 100 minutes, during which the fly would have traveled 500/3 miles, and the west bound train 350/3 miles. After the fly turned around, it will be 50 miles (= 500/3 – 350/3) from the west-bound train and they head toward each other at 170 miles per hour, so they would meet after 5/17 hours, during which the fly traveled 500/17 miles and the east-bound train 400/17. Now 100/17 miles apart the fly and the east-bound train head toward each other at 180mph and…

    This eventually leads to an infinite series which one can potentially sum geometrically and arrive at a final answer. Or,

  2. The “smart” way. The two trains move toward each other at 150 miles per hour. It takes 2 hours until they meet. The fly, traveling at 100mph, much have traveled a total of 200 miles during the trip.

The “joke” is usually told with some joker, say dear old Feynman, posing this mathematical problem to some more serious-minded mathematician, often renown for his computational abilities (say Von Neumann). The mathematician would reply instantly 200 miles. The joker would be disappointed and complain that the mathematician had heard this question before and somehow knew “the trick”, upon which the mathematician replies: “What trick? It wasn’t that hard to sum the series.”

I just came back from teaching an exercise course (in Princeton language, a precept), and the official answer to one of the exercises reminded me of the above problem. Here is the question:

You are given a biased coin which lands on tails with probability p. You flip the coin until you get heads, and record the number of tosses. (a) What is the probability that the number of tosses is exactly n? (b) What is the probability that the number of tosses is greater than or equal to n?

Part (a) is standard: for n total tosses, the nth toss is heads and the rest are tails. So the probability is p^{n-1}(1-p), representing n-1 successive tails followed by a single heads.

The official answer to part (b) is this: The probability of number of tosses is at least n is the sum

\displaystyle \sum_{k = n}^\infty P( X = k ) = \sum_{k = n}^{\infty} p^{k-1}(1-p)

which after summing the geometric series we arrive at p^{n-1}.

Here’s what I thought after seeing the question: for at least n total tosses, the first n-1 must be all tails. After which the tosses don’t matter: either one eventually ends up with heads at some finite time, in which case it is counted as some finite k = N event, or one never hits heads, in which cases the probability is vanishingly small. So the probability is exactly the probability of getting exactly n-1 tails in a row, which is p^{n-1}.

Just like the fly problem, one of the solutions brute forces the answer, the other try to “reason” away the computational bits until one is left with a simple computation which can be done quickly in one’s head.

Which of these is mathematical literacy? Read the rest of this entry »

Non-existence of multiple-black-hole solutions that look locally like subextremal Kerr-Newman

Pin Yu and I just posted a paper on arXiv based on some joint work we started doing when we were both graduate students (and parts of which appeared in his dissertation). I think I did a decent job explaining the motivation in a mathematical way in the introduction to the paper, so I’ll motivate the problem here a little differently.

Ever since the discovery of the black hole solutions, there had been interest in whether static or stationary black hole solutions with more than one hole can exists in equilibrium. One of the earliest considerations was by Bach and Weyl in 1922, fairly soon after the discovery of the Schwarzschild solutions. In general it was concluded that a static configuration is impossible due to singularities forming between two holes. Roughly speaking, a black hole in vacuum spacetime is a strongly gravitating object, and gravity attracts. If two black holes were to form and were to be kept apart, an external force will be needed to hold on to them. This manifests in a singularity between the two black holes.

On the other hand, if we were to add electrical charge to the black holes, then two black holes with charges of the same sign stands a chance of being in equilibrium: the electromagnetic interaction between two like charges is repulsive, while gravity is attractive, so maybe they can cancel out! And indeed such a configuration is possible. Under what are now called Majumdar-Papapetrou solutions are precisely these types of balanced multiple black hole solutions. But the balance has to be precise! The electric charge has to be large enough to equal the gravitational mass. And this in turn requires that the black holes represent what are called “extremal black holes”.

For the stationary, as opposed to static, case, the situation is less clear. In the static case, the black holes must remain fixed in place. In the stationary case, we can allow the black holes to orbit each other. As we know well from our own solar system, orbiting systems can happen where static systems are disallowed. This is because of the “fictitious” centrifugal force which can balance out the gravitational attraction (or, more correctly stated in accordance to American high school physics curricula, the gravitational force provides the centripetal force for the bound orbit).

In our paper we show that orbiting systems (as opposed to inspiraling ones where the multiple black holes eventually crash into one another) cannot exist provided that outside the black hole things looks more or less like the situation with only one black hole. A posteriori, knowing that these systems cannot exist, we are justified in our inability to provide examples. But even a priori it is difficult to imagine a system which our assumptions do not immediately rule out.

  • If we have two black holes with large mass placed close to each other, we’d expect there to be lots of gravitational interaction and the local geometry will be distorted heavily away from the single black hole Kerr Newman solution.
  • If we have two black holes with significant mass place far from each other, we’d naively expect that the gravitational field from infinity sees a single body with the combined masses of the two black hole, but near one individual black hole we only see the gravitational effects from that one black hole. So intuitively a situation like this cannot have an exterior that looks everywhere just like that with one single black hole.

The situation that intuitively we cannot rule out here is the case where we start with one gigantic black hole and one tiny black hole. The effect of the tiny black hole on the gravitational field is but a mere blip compared to the big black hole. So we can say expect that the space-time metric looks like that of when there is just the one big black hole. This is the one to which our theorem applies.

Our theorem also says nothing about the extremal case. We only consider the case where the charge is insufficient to balance out the mass. As we know from the Majumdar-Papapetrou solutions we do have a need to ruling out that class of solutions. Where this restriction enters the proof, however, is in a cute way. First, let me describe the general strategy of the proof. Our method is roughly inspired by Morse theory. We construct a real valued function on the space-time such that its level surfaces foliate the space-time with homeomorphic leaves. We then show that the boundaries of the black holes (the event horizons) necessary are almost level surfaces for this real valued function. This will give rise to a contradiction: on the one hand near infinity, the level surfaces look like spheres and is a connected surface; the boundary of the black holes, together form a level surface that has two components. This contradicts the homeomorphism between level surfaces. In the actual argument, however, we do not prove homeomorphism. Instead, we show that the real valued function has no critical points. The contradiction then is provided by a mountain pass lemma. It is here we need to use subextremality.

We can only show that the real valued function has no critical points where its values are at least as large as the values on the event horizons (there is a sign issue). So to actually get a contradiction by the mountain pass lemma, we need that as we go out from the event horizon, the value of the real-valued function increases. For subextremal black holes, the event horizon is non-degenerate, and the near horizon geometry forces this to be true. For extremal black holes, the event horizon is degenerate, and the near horizon geometry allows the value of the function to remain the same or decrease.

IPython Notebook, Take 2

With the help of Fernando Perez, some aspects of my IPython Notebook code has been improved.

Changelog:

  1. Instead of using .show() and .fullshow() methods to display the content of the objects with dependence on a global toggle for MathJax, now we use the _repr_latex_ method (which hooks into IPython’s display functionality). This allows one to enter just m = math_expr([insert atoms here]) followed by m to display the content of the math expression.
  2. Whether the default display mentioned above shows the atom number labels is now configured via a boolean: one can play with it using the .labeled property
  3. To show the LaTeX code, we now use the .latex property
  4. Operations are no longer in place. Instead they return a new math_expr object. This has the advantage that if you can keep playing with the entry until you get it right, and then afterwords you can do m = m.replace(...). This makes it better for for interactive computations.
  5. By default, on object creation it will print its own content.

The code now looks like

from IPython.core.display import *

def add(x,y): return x+y
def MDPL(string): display(Math(string))
def comp_str(listofstrings): return reduce(add,listofstrings)

class math_expr(object):
   '''''Math Expression object'''''

   def __init__(self,atomslist, labeldefault = True, highlight = []):
      '''''init takes arg: list of atoms, each atom being a compilable chunck of LaTeX expression'''''
      self.listofatoms = atomslist
      self.labels = labeldefault
      MDPL(comp_str(self.__colouratoms(highlight)))

   def _repr_latex_(self):
      '''''Returns a latex expression of the object. Will be parsed by MathJax'''''
      self.__labelatoms()
      latexstring = comp_str(self.labeledatoms) if self.labels else comp_str(self.listofatoms)
      return "$" + latexstring + "$"

   @property
   def labeled(self):
      '''''Tells you whether labelling is turned on by default'''''
      return self.labels

   @labeled.setter
   def label(self,boolean):
      '''''Sets the default labelling'''''
      self.labels = boolean

   @property
   def latex(self):
      '''''Accesses the LaTeX code snip for the expression'''''
      display(Latex(comp_str(self.listofatoms)))

   def __labelatoms(self):
      '''''Label atoms by adding underbraces'''''
      self.labeledatoms = [ "\underbrace{" + self.listofatoms[i] + "}_{" + str(i) + "}" for i in range(len(self.listofatoms)) ]

   def replace(self,pos,newstr):
      '''''Replaces an atom with another atom'''''
      MDPL(comp_str(self.__colouratoms([pos])))
      newstrings = list(self.listofatoms)
      newstrings[pos] = newstr
      return math_expr(newstrings,self.labels,[pos])

   def merge(self,positions):
      '''''Merges atoms: the input is a list of positions. The new atom is placed at the position of the foremost of the positions'''''
      MDPL(comp_str(self.__colouratoms(positions)))
      newstrings = list(self.listofatoms)
      temp = [ newstrings[i] for i in positions ]
      positions.sort()
      positions.reverse()
      for i in positions: del newstrings[i]
      newstrings.insert(positions[-1],comp_str(temp))
      return math_expr(newstrings,self.labels,[positions[-1]])

   def split(self,pos,newatoms):
      '''''Splits atoms: replaces an atom in place with multiple sub atoms'''''
      MDPL(comp_str(self.__colouratoms([pos])))
      newstrings = list(self.listofatoms)
      del newstrings[pos]
      templen = len(newatoms)
      while len(newatoms) > 0:
         newstrings.insert(pos,newatoms.pop())
      return math_expr(newstrings,self.labels,range(pos,pos+templen))

   def cancel(self,positions):
      '''''Cancels a bunch of terms: input a list of positions'''''
      MDPL(comp_str(self.__colouratoms(positions)))
      positions.sort()
      positions.reverse()
      newstrings = list(self.listofatoms)
      for i in positions: del newstrings[i]
      return math_expr(newstrings,self.labels)

   def move(self,posini,posfin):
      '''''Move atom at posini to posfin, pushing all others back'''''
      MDPL(comp_str(self.__colouratoms([posini])))
      newstrings = list(self.listofatoms)
      temp = newstrings.pop(posini)
      newstrings.insert(posfin if posfin < posini else posfin-1, temp)
      return math_expr(newstrings,self.labels,[posfin if posfin < posini else posfin - 1])

   def __colouratoms(self,positions,labelled=False):
      '''''Returns the list of atoms, but with selected terms coloured'''''
      temp = list(self.listofatoms)
      if labelled:
         self.labelatoms()
         temp = list(self.labeledatoms)
      for i in positions: temp[i] = "\color{red}{"+temp[i]+"}"
      return temp

Using IPython Notebook for manual computations

(Edit July 27: please see this update)

One of the hardest organizational tasks I’ve found in the past few years is keeping track of computations. When I started as a graduate student I began by doing computations by hand on scratch paper and copying everything (that is worth keeping) into a spiral-bound notebook. Notebooks being hard to carry, a little bit later I moved on to scanning my notes. Than I decided that my handwriting is quite horrible and I should just TeX everything up instead. Occasionally this has led to me doing my computations directly in LaTeX inside a Vim buffer. Yesterday I discovered a better alternative.

A few of the problems I’ve run into with the various methods of keeping computations include:

  1. In deadtree format, the sheets of paper are easily misplaced or soiled, and are not as easily modifiable.
  2. Doing a hand computation and then typing up the result takes extra time.
  3. Computing directly in LaTeX requires a lot of redundant typing or copying and pasting of parts of the expressions that don’t change from line to line.
  4. Typed notes (and sometimes written notes) don’t easily show (unless you take the extra time to format it) the changes between the lines, and sometimes a few months later the computation becomes hard to follow.

The present solution below has

  1. Storage in electronic format for easy backup and search.
  2. Doing the calculation directly on a computer to avoid the two-step process.
  3. Let the computer do the work of copying unchanged expressions for you.
  4. Let the computer do the formatting; the computation is written in an almost-human-readable code that is self-documentary.

Software needed
What I discovered, is the IPython Notebook (link to project homepage). The “notebook” part of the name, I believe, refers to its semblance to Mathematica/MatLab/Maxima style notebooks where one sequentially and interactively enter commands and observe their output. Unlike the mentioned software, this notebook is for interactively using the Python programming language. Furthermore, it supports inline documentation using MarkDown and MathJax! (This can be had by changing the cell type to Markdown, instead of the default Python code.)

If you want to see for yourself how this works, you will need to install IPython Notebook yourself. (In Gentoo linux, emerge ipython with the notebook use flag set; in Debian or Ubuntu, you can just apt-get the relevant packages.)

Doing computations
With a little bit of (very messy and unprofessional) Python code, the Notebook can be convinced to print certain outputs prettified by MathJax. Here is the set-up I used:

from IPython.core.display import *

global MathJax 
MathJax = True
def MDPL(string): display(Math(string)) if MathJax else display(Latex(string))

def add(x,y): return x+y

def comp_str(listofstrings): return reduce(add,listofstrings)

class math_expr(object):
   '''''Math Expression object'''''

   def __init__(self,arg1):
      '''''init takes arg: list of atoms, each atom being a compilable chunck of LaTeX expression'''''
      self.listofatoms = arg1

   def show(self):
      '''''Displays the content of the expression in mathmode'''''
      MDPL(comp_str(self.listofatoms))

   def replace(self,pos,newstr):
      '''''Replaces an atom with another atom'''''
      MDPL(comp_str(self.colouratoms([pos])))
      self.listofatoms[pos] = newstr
      MDPL(comp_str(self.colouratoms([pos],True)))

   def merge(self,positions):
      '''''Merges atoms: the input is a list of positions. The new atom is placed at the position of the foremost of the positions'''''
      MDPL(comp_str(self.colouratoms(positions)))
      temp = [ self.listofatoms[i] for i in positions ]
      positions.sort()
      positions.reverse()
      for i in positions: del self.listofatoms[i]
      self.listofatoms.insert(positions[-1],comp_str(temp))
      MDPL(comp_str(self.colouratoms([positions[-1]],True)))

   def split(self,pos,newatoms):
      '''''Splits atoms: replaces an atom in place with multiple sub atoms'''''
      MDPL(comp_str(self.colouratoms([pos])))
      del self.listofatoms[pos]
      templen = len(newatoms)
      while len(newatoms) > 0:
         self.listofatoms.insert(pos,newatoms.pop())
      MDPL(comp_str(self.colouratoms(range(pos, pos+templen),True)))

   def cancel(self,positions):
      '''''Cancels a bunch of terms: input a list of positions'''''
      MDPL(comp_str(self.colouratoms(positions)))
      positions.sort()
      positions.reverse()
      for i in positions: del self.listofatoms[i]
      self.fullshow()

   def move(self,posini,posfin):
      '''''Move atom at posini to posfin, pushing all others back'''''
      MDPL(comp_str(self.colouratoms([posini])))
      temp = self.listofatoms.pop(posini)
      self.listofatoms.insert(posfin if posfin < posini else posfin-1, temp)
      MDPL(comp_str(self.colouratoms([posfin if posfin < posini else posfin-1],True)))

   def colouratoms(self,positions,labelled=False):
      '''''Returns the list of atoms, but with selected terms coloured'''''
      temp = list(self.listofatoms)
      if labelled:
         self.labelatoms()
         temp = list(self.labeledatoms)
      for i in positions: temp[i] = "\color{red}{"+temp[i]+"}"
      return temp

   def labelatoms(self):
      '''''Label atoms by adding underbraces'''''
      self.labeledatoms = [ "\underbrace{" + self.listofatoms[i] + "}_{" + str(i) + "}" for i in range(len(self.listofatoms)) ]

   def fullshow(self):
      '''''Shows the content whilst labeling positions'''''
      self.labelatoms()
      MDPL(comp_str(self.labeledatoms))

The entire python code can be copied and saved somewhere on your computer. After launching the Notebook, drag the file and drop it into the first input box. Then hit Shift-Enter to load the code. After that you can do things like:

Loaded preamble, do some computations

After loading the preamble in cell 1, we insert a math expression and display it.

and

Next we do some computations (manipulations of the expression).

After I am done, I just click “Save” and the entire computation is saved, and bits and pieces of it can be easily copied out by switching to non-mathJax output.

The code is still in the early stages: a lot more improvements can be made. But it is already a working system.

Follow

Get every new post delivered to your Inbox.

Join 34 other followers