{ "cells": [ { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "## Minimality of tensors of fixed multilinear rank\n", "As a (very) special case of the main theorem of https://arxiv.org/abs/2007.08909, the set of $2\\times 2$ matrices of rank $1$ is a minimal submanifold of $\\mathbb{R}^4$ under the Frobenius norm. Minimal submanifolds are a mathematical model of soap films, since they locally minimize volume given a fixed boundary. A minimal submanifold can be defined by the requirement that its *mean curvature vector field* be everywhere vanishing. In fact, the set of all tensors of any fixed multilinear rank forms a minimal submanifold of its ambient Euclidean space, which yields $2 \\times 2$ matrices of rank one as the special case we examine computationally in this notebook." ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "First, we will see a mean curvature vector field which is not everywhere vanishing. We accomplish this by examining the set of $2 \\times 2$ matrices of rank one, *whose entries are required to sum to one*. This set is of interest in statistics, for example, and will *not* be a minimal submanifold, as we will visually see." ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "To begin, we use a local parametrization of the set $\\mathcal{M}$ of matrices whose rank is one, and whose entries sum to one." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(u1*u2, -u1*(u2 - 1), -(u1 - 1)*u2, (u1 - 1)*(u2 - 1))" ] }, "execution_count": 1, "metadata": { }, "output_type": "execute_result" } ], "source": [ "u1,u2 = var('u1 u2')\n", "x = vector([u1*u2, u1*(1-u2), u2*(1-u1), (1-u1)*(1-u2)])\n", "show(x)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 2, "metadata": { }, "output_type": "execute_result" } ], "source": [ "sum(x).expand()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "Below we calculate a basis for the tangent space of $\\mathcal{M}$ from our local parametrization. We also calculate the *Gram matrix* $G$ in the basis coming from our local parametrization." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ 2*(u2 - 1)^2 + 2*u2^2 (u1 - 1)*(u2 - 1) + u1*(u2 - 1) + (u1 - 1)*u2 + u1*u2]\n", "[(u1 - 1)*(u2 - 1) + u1*(u2 - 1) + (u1 - 1)*u2 + u1*u2 2*(u1 - 1)^2 + 2*u1^2]" ] }, "execution_count": 3, "metadata": { }, "output_type": "execute_result" } ], "source": [ "v1 = derivative(x,u1)\n", "v2 = derivative(x,u2)\n", "\n", "a11 = derivative(v1,u1)\n", "a12 = derivative(v1,u2)\n", "a21 = derivative(v2,u1)\n", "a22 = derivative(v2,u2)\n", "\n", "G = matrix(2,2,[v1.dot_product(v1), v1.dot_product(v2), v2.dot_product(v1), v2.dot_product(v2)])\n", "show(G)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "Below we calculate the second derivative vectors, and project them onto the normal space of $\\mathcal{M}$." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ ], "source": [ "V2 = v2 - v2.dot_product(v1)*v1/v1.dot_product(v1) # orthogonalize our tangent space basis...\n", "\n", "proja11 = a11 - a11.dot_product(v1)*v1/v1.dot_product(v1) - a11.dot_product(V2)*V2/V2.dot_product(V2)\n", "proja12 = a12 - a12.dot_product(v1)*v1/v1.dot_product(v1) - a12.dot_product(V2)*V2/V2.dot_product(V2)\n", "proja21 = a21 - a21.dot_product(v1)*v1/v1.dot_product(v1) - a21.dot_product(V2)*V2/V2.dot_product(V2)\n", "proja22 = a22 - a22.dot_product(v1)*v1/v1.dot_product(v1) - a22.dot_product(V2)*V2/V2.dot_product(V2)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "Below, the mean curvature vector $h$ is calculated using the inverse of the Gram matrix and the projections of the second derivative vectors onto the normal space. We print out the first entry of the vector $h$ to show that it is evidently nonzero. This proves that $\\mathcal{M}$ is not a minimal submanifold." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "16*u1^2*u2/(16*u1^4 + 32*u1^2*u2^2 + 16*u2^4 - 32*u1^3 - 32*u1^2*u2 - 32*u1*u2^2 - 32*u2^3 + 40*u1^2 + 32*u1*u2 + 40*u2^2 - 24*u1 - 24*u2 + 9) + 16*u1*u2^2/(16*u1^4 + 32*u1^2*u2^2 + 16*u2^4 - 32*u1^3 - 32*u1^2*u2 - 32*u1*u2^2 - 32*u2^3 + 40*u1^2 + 32*u1*u2 + 40*u2^2 - 24*u1 - 24*u2 + 9) - 8*u1^2/(16*u1^4 + 32*u1^2*u2^2 + 16*u2^4 - 32*u1^3 - 32*u1^2*u2 - 32*u1*u2^2 - 32*u2^3 + 40*u1^2 + 32*u1*u2 + 40*u2^2 - 24*u1 - 24*u2 + 9) - 40*u1*u2/(16*u1^4 + 32*u1^2*u2^2 + 16*u2^4 - 32*u1^3 - 32*u1^2*u2 - 32*u1*u2^2 - 32*u2^3 + 40*u1^2 + 32*u1*u2 + 40*u2^2 - 24*u1 - 24*u2 + 9) - 8*u2^2/(16*u1^4 + 32*u1^2*u2^2 + 16*u2^4 - 32*u1^3 - 32*u1^2*u2 - 32*u1*u2^2 - 32*u2^3 + 40*u1^2 + 32*u1*u2 + 40*u2^2 - 24*u1 - 24*u2 + 9) + 16*u1/(16*u1^4 + 32*u1^2*u2^2 + 16*u2^4 - 32*u1^3 - 32*u1^2*u2 - 32*u1*u2^2 - 32*u2^3 + 40*u1^2 + 32*u1*u2 + 40*u2^2 - 24*u1 - 24*u2 + 9) + 16*u2/(16*u1^4 + 32*u1^2*u2^2 + 16*u2^4 - 32*u1^3 - 32*u1^2*u2 - 32*u1*u2^2 - 32*u2^3 + 40*u1^2 + 32*u1*u2 + 40*u2^2 - 24*u1 - 24*u2 + 9) - 6/(16*u1^4 + 32*u1^2*u2^2 + 16*u2^4 - 32*u1^3 - 32*u1^2*u2 - 32*u1*u2^2 - 32*u2^3 + 40*u1^2 + 32*u1*u2 + 40*u2^2 - 24*u1 - 24*u2 + 9)\n" ] } ], "source": [ "Ginv = G.inverse()\n", "h = Ginv[0,0]*proja11 + Ginv[0,1]*proja12 + Ginv[1,0]*proja21 + Ginv[1,1]*proja22\n", "\n", "entry = h[0]\n", "print(entry.expand().full_simplify().expand()) # the only observation is that it is nonzero" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(0, 0, 0, 0)" ] }, "execution_count": 6, "metadata": { }, "output_type": "execute_result" } ], "source": [ "# special points zero mean curvature\n", "subz = {u1:1/2, u2:1/3}\n", "h.subs(subz)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(-1800/3703, 5400/25921, 6600/25921, 600/25921)" ] }, "execution_count": 7, "metadata": { }, "output_type": "execute_result" } ], "source": [ "# most points have nonzero mean curvature vectors\n", "subz = {u1:1/4, u2:1/5}\n", "h.subs(subz)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "Now we can take a look at the mean curvature vector field at various points along $\\mathcal{M} \\subset \\mathbb{R}^4$ by projecting the entire picture onto the affine hyperplane $P \\subset \\mathbb{R}^4$ where $P = \\{ x \\in \\mathbb{R}^4 : \\sum_{i=1}^4 x_i = 1 \\}$." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ ], "source": [ "Q,_ = matrix(RDF,4,1,[1,1,1,1]).QR() # for projecting\n", "\n", "plt = Graphics()\n", "N = 25\n", "step = 1/N\n", "for s in [0,0+step..,1]:\n", " for t in [0,0+step..,1]:\n", " subz = {u1:s, u2:t}\n", " X = (Q.T*x.subs(subz))[1:4]\n", " H = (Q.T*h.subs(subz))[1:4]\n", " plt += point(X, color=\"black\")\n", " plt += arrow(X,(X+H), width=0.25)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "Below there should be an interactive three-dimensional plot of the mean curvature vector field of $\\mathcal{M}$. In case something goes wrong in your browser, we include a static picture farther below." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": "\n