前言

这篇文章是 圆锥曲线题目的三维矢量解法 的一系列文章的学习心得。第一次看到“三维矢量解法”,我叹服于它的优美与简洁,但是它的难度让我望而却步。查阅了很多资料之后,我大致对“三维矢量解法”有了一个初步的认识。为了理清思路,也为了让更多人了解到这个方法,我写下了这篇文章。相比于“三维矢量解法”这个名字,我认为“张量法”更具有概括性,因此以“张量法”作为标题。

整个张量法做的事情,主要是发展了齐次坐标背景下用向量表示点和直线的思想,用张量这一概念来重新建构射影几何的一些内容。这个方法特别强调点与线的对偶关系,建立起了一套对偶性质非常好的数学工具描述平面解析几何中的几何对象。

这篇文章中介绍的张量以及其他一些知识,主要目的是为了解决圆锥曲线的问题,可能会与原文有小幅度差异,请读者注意。

接下来的内容大量地应用了齐次坐标,不了解齐次坐标的读者可以看这两个视频:三种圆锥曲线究竟有啥区别?【圆锥曲线】“齐次化"到底是在干啥?从齐次坐标到射影变换

一、张量的语言

张量的概念

我们知道,仅有大小的量称为标量或数量,可以用一个数字表示;既有大小又有方向的量称为矢量或向量,可以根据空间维度建立坐标系,写成一组排成一行的分量的形式,其中每个分量是一个实数,也就是标量。

那么,有没有一种东西,它的分量不再是实数,而是矢量呢?答案是肯定的。我们将这种东西称为二阶张量。在这种意义下,矢量可以看作一阶张量,实数可以看作零阶张量。类似地,有三阶、四阶甚至更高阶的张量,它们的分量是二阶或三阶张量。

一个张量的每一层结构需要是相同的。如果一个二阶张量的一个分量是三维矢量,那么它所有的分量都应当是三维矢量。例如, $((1,2,3),(4,5,6),(7,8,9))$ 是张量,而 $((1,2,3),(4,5,6),(7,8))$ 不是张量。

一个矢量分量的个数称为维度,例如三维矢量是类似 $(x,y,z)$ 的形式。我们把矢量的维度记为 $n$ 。类似地,对于张量,其中每个矢量分量的个数称为张量的维度,同样记为 $n$ ,例如, $n=3$ 时,一个张量可能是这样: $((1,2,3),(4,5,6),(7,8,9))$ 。在这篇文章中,我们讨论的大多数张量的维度都是 $3$ 。

虽然我们是根据分量的类型定义的张量,但是我们认为,与矢量类似,张量是一个几何对象,即使不建立坐标系,张量依旧存在。有了坐标系,张量的分量就确定了。我们把建立的坐标系称为规范。张量的一些性质是与坐标系无关的,对于任意坐标系都成立,这些性质称为规范不变的;与之相对的,张量的一些性质会随坐标系改变,就称为不是规范不变的。相对而言,我们更关心的是规范不变的性质。

张量的表示

对于矢量,我们常缩写为一个上方带箭头的字母。但是对于张量,这是不够的。首先,我们至少要区分一阶与二阶张量;其次,在本文中我们主要的研究对象是点和线,我们将使用张量表示它们,因此通过记号区分点和线也是必要的。

我们引入上标和下标来区分不同类型的张量。有 $k$ 个上指标和 $l$ 个下指标的张量称作  $(k,l)$  型张量,例如  $A^{ij}\space _k\space ^l$  是一个 $(3,1)$ 型张量。上标和下标个数的总和称为张量的阶数。在张量中,指标的上下、顺序都是重要的,而用于表示指标的字母是不重要的。

我们用含一个上标的字母表示 $(1,0)$ 型张量,或称为矢量,如 $a^i$ ;用含一个下标的字母表示 $(0,1)$ 型张量,或称为对偶矢量,如 $l_i$ ;用含两个不同上标的字母表示 $(2,0)$ 张量,如 $g^{ij}$ ;用含两个不同下标的字母表示 $(0,2)$ 型张量,如 $f_{ij}$ 。这样的上标和下标是不固定的,可以取遍不超过张量维度 $n$ 的整数,所以被称为“自由指标”。今后我们对张量做运算时,经常用对自由指标的操作来代指对张量的所有分量进行相同的操作。

为了区分上指标和下指标,我们用圆括号表示上指标的层级,方括号表示下指标的层级。这将在后文“点和直线的表示”一节中详细讨论。

张量的上标和下标具体的字母是可以任意选择的,例如 $a^i$ 与 $a^j$ 表示同一个张量。但是在含有多个张量的式子中需要注意不与其他张量冲突。上标和下标的顺序在一般的张量中是不能互换的。

特别地,如果将张量的两个指标互换位置,张量不变,则称张量关于这两个指标对称。在我们的方法中,大多数时候处理的都是对称的张量,这时上标和下标的顺序是可以交换的。

如果将上标和下标的位置换成数字,就不再表示整个张量,而表示那个位置的分量。例如

$$ a^{ij}=((1,2,3),(4,5,6),(7,8,9)),a^{1}=(1,2,3),a^{12}=2 $$$$ a^{ij}_{\ \ \ k}= (([1,2,3],[4,5,6],[7,8,9]),\\ ([10,11,12],[13,14,15],[16,17,18]),\\ ([19,20,21],[22,23,24],[25,26,27])),\\ a^{i2}_{\ \ \ k} = ([4,5,6],[13,14,15],[22,23,24]) $$

在这种意义下,张量可以写成分量式,例如

$$ a^{ij}=((a^{11},a^{12},a^{13}),(a^{21},a^{22},a^{23}),(a^{31},a^{32},a^{33})) $$

我们看到,随着张量分量数量的增加,为了便于计算与书写,我们可以把二阶张量,或者任意张量的其中两个分量写成矩阵的形式,例如

$$ a^{ij}= \begin{pmatrix} (a^{11},a^{12},a^{13})\\ (a^{21},a^{22},a^{23})\\ (a^{31},a^{32},a^{33}) \end{pmatrix} = \begin{pmatrix} a^{11} & a^{12} & a^{13} \\ a^{21} & a^{22} & a^{23} \\ a^{31} & a^{32} & a^{33} \end{pmatrix} $$$$ a^{ij}_{\ \ \ k}= \begin{pmatrix} [1,2,3] & [4,5,6] & [7,8,9] \\ [10,11,12] & [13,14,15] & [16,17,18] \\ [19,20,21] & [22,23,24] & [25,26,27] \end{pmatrix} $$

我们约定,一个含有 3×3 个分量的圆括号矩阵,展开为嵌套括号的形式时,内层和外层都是圆括号。方括号矩阵同理。如果要用矩阵表示一个外层是圆括号、内层是方括号的张量,则只能写成一个有三个方括号分量的 1×3 矩阵,例如

$$ a^{ij}= \begin{pmatrix} [a^{11},a^{12},a^{13}]\\ [a^{21},a^{22},a^{23}]\\ [a^{31},a^{32},a^{33}] \end{pmatrix} $$

在后文中,为了简洁地表示张量,将广泛地使用矩阵的记号。

补充一句,这部分中的小括号、中括号是我个人的想法,并不是通行的记号,如果要学习正规的记号请查阅相关权威著作。

张量积

可以将矢量的加法和数乘推广到张量上。相同类型(点或线)和阶数的张量之间,可以进行加法,也就是将相同的指标对应的分量相加。单独的一个张量可以进行数乘,也就是将实数乘到每一个分量上。例如

$$ a^i=(1,2),b^i=(3,4),a^i+b^i=(4,6),2a^i=(2,4),3b^i=(9,12) $$

指标位置不同的张量,例如 $a^i=(1,2),b_i=[3,4]$ ,即便大小和形状相同,也不能进行加法运算。

那么,张量和张量之间能否相乘呢?答案是肯定的。两个张量的张量积将得到一个新的张量,新的张量的指标是原先张量指标的总合,新张量的每一个分量等于原先两个张量对应项的乘积。例如对于张量 $a^{ij}$ 和 $b_{ij}$ ,它们的张量积 $a^{ij}b_{kl}$ 将得到一个新的张量 $f^{ij}_{\ \ \ \ kl}$ ,它的分量 $f^{i_0j_0}_{\ \ \ \ \ \ \ k_0l_0}=a^{i_0j_0} \cdot b_{k_0l_0}$ ,其中 $a^{i_0j_0}$ 和 $b_{k_0l_0}$ 都是实数,它们中间的点代表的是实数之间的乘法。除此之外,我们可以直接将 $a^{ij}b_{kl}$ 看成一个整体,表示一个 $(2,2)$ 型张量,而不必再多引入一个 $f$ 来表示。下面给出两个例子:

$$ a^i=(1,2),b^j=(3,4),a^i b^j = \begin{pmatrix} a^1b^1 & a^1b^2 \\ a^2b^1 & a^2b^2 \end{pmatrix}= \begin{pmatrix} 3 & 4 \\ 6 & 8 \end{pmatrix} $$$$ a^i=(x_1,y_1,1),b^i=(x_2,y_2,1), a^ib^j= \begin{pmatrix} x_1x_2 & x_1y_2 & x_1\\ x_2y_1 & y_1y_2 & y_1\\ x_2 & y_2 & 2 \end{pmatrix} $$

张量的缩并

我们看到,通过张量积,可以由两个较小的张量运算得到一个较大的张量。而缩并这种运算,可以通过求和将一个较大的张量缩小为一个较小的张量。在求和时,我们需要选取一个上指标和一个下指标,将它们用同一个字母表示,这时这个指标不再发挥作用,因此我们把它称为哑指标。这就是爱因斯坦求和约定。下面给出了一个例子。

$$ a^{i}_{\ \ j}= \begin{pmatrix} [3,4] \\ [6,8] \end{pmatrix}, a^{i}_{\ \ i}=\sum_{x=1}^n a^{x}_{\ \ x}=a^{1}_{\ \ 1}+a^{2}_{\ \ 2}=3+8=11 $$

在实际的计算中,直接对张量进行缩并的操作很少,更多的是同时进行张量积和缩并。同时进行张量积和缩并时,我们定义:得到一个不含哑指标的新张量,新张量的每一项来源于原来张量对应项的哑指标相乘并求和。例如,$a^{ij}b_{kl}$ ,对 $j,k$ 进行缩并,得到新张量 $a^{ij}b_{jk}$ ,它的分量 $a^{i_0j}b_{jk_0}=\sum_{x=1}^n a^{i_0x} \cdot b_{xk_0}$ 。下面给出一个具体的例子:

$$ a_{ij}=\begin{pmatrix} a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \\ c_1 & c_2 & c_3 \end{pmatrix} , b_{ij} = \begin{bmatrix} d_1 & e_1 & f_1 \\ d_2 & e_2 & f_2 \\ d_3 & e_3 & f_3 \end{bmatrix}, a^{ij}b_{jk} = \begin{pmatrix} [a_1d_1+a_2d_2+a_3d_3 , a_1e_1+a_2e_2+a_3e_3 , a_1f_1+a_2f_2+a_3f_3 ] \\ [b_1d_1+b_2d_2+b_3d_3 , b_1e_1+b_2e_2+b_3e_3 , b_1f_1+b_2f_2+b_3f_3 ] \\ [c_1d_1+c_2d_2+c_3d_3 , c_1e_1+c_2e_2+c_3e_3 , c_1f_1+c_2f_2+c_3f_3 ] \end{pmatrix} $$

我们还可以将一个张量缩并两次,沿用上一个例子,继续缩并一次,得到

$$ a^{ij}b^{ji}=(a_1d_1+a_2d_2+a_3d_3)+(b_1e_1+b_2e_2+b_3e_3)+(c_1f_1+c_2f_2+c_3f_3) $$

缩并两次的情况还有一种算法,就是在 $a^{ij}b^{ji}$ 中,让 $i$ 和 $j$ 分别取遍一次 $1,2,3$ ,得到 9 个数,将它们进行求和。在这种理解方式下,我们发现,两个二阶张量缩并的结果,实质上是前一个张量分别与后一个张量沿主对角线(左上到右下的对角线)对称的位置相乘并求和的结果。

只有上指标和下指标之间可以缩并,上指标和上指标、下指标和下指标之间不能缩并。之所以这么规定,一部分原因来自于张量的几何意义,这将在后文详细讨论。

事实上,张量积和缩并还有另一种算法,请看这篇文章:张量傻瓜版入门。我一开始基于“张量傻瓜版入门”中的算法做计算,并写下了张量积和缩并这两小节,但是这种方法实在是繁琐。后来突然想到我现在文章中的这种算法,于是我大幅度修改了这两小节,并得以进行了很多更复杂的计算。

二、几何对象的表示

点和直线

学习齐次坐标后,我们知道平面上的点可以用一个含三个分量的矢量 $a^i=\left(x,y,z\right)$ 来表示。我们把它称为点矢量,或者简称点矢。对偶地,平面上的直线也可以用一个三维矢量表示,称为线矢量或线矢。为了区分点和直线,我们依旧用圆括号包裹的矢量表示点,而用方括号包裹的矢量 $l_i=\left[A,B,C\right]$ 表示直线。

二次曲线

当我们用一个含三个分量的一位矢量表示了一次的直线,自然会想到如何表示二次的圆锥曲线。一个现成的方案是线性代数中的二次型。我们将二次型迁移到张量语言中,给出定义:对于二次曲线

$$ Ax^2+2Bxy+Cy^2+2Dxz+2Eyz+Fz^2=0 $$

可以用张量

$$ g^{ij} = [[A,B,D],[B,C,E],[D,E,F]] = \begin{bmatrix} A & B & D \\ B & C & E \\ D & E & F \end{bmatrix} $$

表示。我们看到,矩阵的形式将三个分量排成一列,更能体现对称性。

当二次曲线满足某些条件时,可能退化为两条直线、一条直线,或者其他特殊情况。两条直线的特殊情况对我们的意义很大,之后我们将会给出通过两个线矢构造它对应的退化二次曲线的方法。用原文中的语言说,在这种表示方法下,决定二次曲线是否退化的一个量称为号差。但是我们在这里暂时不讨论号差,详细请参考原文章 圆锥曲线第三节:升降指标、点乘和叉乘

当我们讨论一个二次曲线的时候,我们脑中会浮现出它的图象,如一个椭圆。但是,换个角度想,这条完整的曲线也可以看作无数满足二次曲线方程的、连续的点组成的。也就是说,可以通过在二次曲线上的所有点组成的点列描述曲线。与二次曲线相同,“一次曲线”直线同样可以用在直线上的所有点组成的点列描述。这个思路将对于我们研究二次点有帮助。

在原文中还有一个概念——“度规”。这个概念是为了解决同时含有多个二次曲线的问题而建构的,但是这对于我们来说并不重要,因此在这里不做介绍。需要进一步理解的读者请阅读原文。

二次点

与一次的直线与点的对偶类似,我们可以构造一种“二次点”,用

$$ a^{ij} = ((x,y,u),(y,z,v),(u,v,w)) = \begin{pmatrix} x & y & u \\ y & z & v \\ u & v & w \end{pmatrix} $$

表示。简写方式同理。

我们可以用全部在二次曲线上的点组成的点列描述二次曲线。我们知道,与点在二次曲线上相对的概念是直线与二次曲线相切。点的对偶是直线,而我们刚刚将二次曲线的对偶定义为二次点,所以这句话可以重新表述为,与一次点在二次曲线上相对的是直线经过二次点。我们马上会在二次曲线与二次点之间建立起一个大致的一一对应关系,所以基于相切的思想,我们可以用所有与二次点对应的二次曲线相切的直线来形象地描述二次点。

与退化二次曲线类似,也存在退化二次点,包括两个点、一个点,以及其他特殊情况。两个点的情况对我们的意义也比较大,我们将在之后给出用两个点构造它对应的退化二次点的方法。

三、几何对象的运算

对称积

由于二次点和二次线的形式都是对称的,所以我们更需要构造出一个对称的张量。建立了张量积的概念后,我们可以定义点矢 $a^i,b^i$ 的对称积 $f^{ij}$ ,或简记为 $(ab)$ :

$$ (ab)=f^{ij}=a^ib^j+a^jb^i $$

两点对称积运算的结果是一个二次点。可以证明,这个二次点是一个退化的二次点,表示两个点,也就是点矢 $a^i,b^i$ 对应的两个点。

同样地,可以定义线矢 $m_i,n_i$ 的对称积 $g_{ij}$ , 或简记为 $[mn]$ :

$$ [mn]=h_{ij}=m_in_j+m_jn_i, $$

两个线矢对称积运算的结果是一个二次曲线。可以证明,这个二次曲线是退化二次曲线,表示线矢 $m_i,n_i$ 对应的退化二次曲线。二次曲线系的知识告诉我们,将两条直线的方程直接相乘也可以构造出退化二次曲线。经过简单的计算,可以证明这与线矢对称积运算的结果是等价的。

现在我们构造出了两个点、两条直线对应的退化二次曲线、退化二次点。那么,如何构造一个点、一条直线对应的退化二次曲线和退化二次点呢?可以让这个点与自己做对称积。由于我们自始至终建立的坐标系都是齐次坐标系,所以也可以让这个点、线与自己做一次张量积,这与对称积是等效的。

在通常的坐标系下,点矢的齐次坐标经常被写为 $a^i=(x_1,y_1,1),b^i=(x_2,y_2,1)$ 。让我们计算 $(ab)$ 的值。

$$ a^ib^j=(x_1,y_1,1)(x_2,y_2,1)= \begin{pmatrix} x_1x_2 & x_1y_2 & x_1\\ x_2y_1 & y_1y_2 & y_1\\ x_2 & y_2 & 2 \end{pmatrix} $$$$ a^j b^i=b^i a^j=(x_2,y_2,1)(x_1,y_1,1)= \begin{pmatrix} x_1x_2 & x_2y_1 & x_2\\ x_1y_2 & y_1y_2 & y_2\\ x_1 & y_1 & 1 \end{pmatrix} $$$$ (ab)= \begin{pmatrix} x_1x_2 & x_1y_2 & x_1\\ x_2y_1 & y_1y_2 & y_1\\ x_2 & y_2 & 1 \end{pmatrix} + \begin{pmatrix} x_1x_2 & x_2y_1 & x_2\\ x_1y_2 & y_1y_2 & y_2\\ x_1 & y_1 & 1 \end{pmatrix}= \begin{pmatrix} 2x_1x_2&x_1y_2+x_2y_1&x_1+x_2\\ x_1y_2+x_2y_1&2y_1y_2&y_1+y_2\\ x_1+x_2&y_1+y_2&2\\ \end{pmatrix} $$

可以看到,这其中出现了韦达定理以及其他的一些对称结构。这是我们在计算圆锥曲线的题目时经常遇见的。这让我们认识到张量法具有处理这类问题的潜力。如果这个结构没有受到一般坐标第三个分量为 1 的限制,可以得到更加对称的形式,读者可自行计算。

同理,可以计算线矢对称积的一般形式。设 $m_i=[A_1,B_1,C_1],n_i=[A_2,B_2,C_2]$ ,以同样的方法计算得到

$$ [mn]= \begin{bmatrix} 2A_1A_2&A_1B_2+A_2B_1&A_1C_2+A_2C_1\\ A_1B_2+A_2B_1&2B_1B_2&B_1C_2+B_2C_1\\ A_1C_2+A_2C_1&B_1C_2+B_2C_1&2C_1C_2\\ \end{bmatrix} $$

写出这个

如果我们把直线写成斜截式 $m_i=[k_1,-1,b_1],n_i=[k_2,-1,b_2]$ ,可以同样计算得到

$$ [mn]= \begin{bmatrix} 2k_1k_2&-(k_1+k_2)&k_1b_2+k_2b_1\\ -(k_1+k_2)&2&-(b_1+b_2)\\ k_1b_2+k_2b_1&-(b_1+b_2)&2b_1b_2\\ \end{bmatrix} $$

这可以帮助我们处理有关斜率的对称结构 $k_1+k_2$ 或 $k_1k_2$ 为定值的问题。

相同阶数对象的点乘

接下来的两节我们将将矢量的点乘推广到张量上。定义两个张量的点乘为其先做张量积,再缩并相邻的一个指标。由于只有上指标和下指标之间可以缩并,因此只有类型不同的张量,即只有圆括号和方括号之间可以直接点乘。

对于点矢 $a^i=(x,y,z)$ 和线矢 $l_i=[A,B,C]$,我们推导它们点乘的表达式:

$$ a^il_j=(x,y,z)[A,B,C]= \begin{pmatrix} [Ax,Ay,Az] \\ [Bx,By,Bz] \\ [Cx,Cy,Cz] \end{pmatrix} $$$$ a^i \cdot l_j=a^il_i=Ax+By+Cz $$

也就是说,它们的点乘为对应分量相乘再求和,这与一般矢量点乘的定义相符。如果把 $\left(x,y,z\right)$ 看作一般的点,得到的就是直线的方程。如果把 $\left(x,y,z\right)$ 看作一个定点,得到的是将点代入直线方程的表达式。因此,我们说:点在直线上的充要条件是点和直线对应的点矢和线矢点乘为零。

现在,我们已经定义了两种乘法:张量积和点乘。它们中间的乘号都可以省略,我们可以通过指标的不同区分它们。如果使用不同的自由指标,则认为它们之间做张量积;如果使用相同的哑指标,则认为它们之间做点乘。

类似地,我们可以定义二次点和二次曲线之间的点乘。为了像点矢和线矢的点乘一样,得到一个实数,我们需要缩并两次。由于缩并的次数不同,我们引入记号 $f^{ij}:g_{ji}$ 来表示二次点和二次曲线之间的点乘,并把它特别地称为二次点乘。

二次点乘推导的过程在“张量的缩并”一节中已经做过。根据计算结果,二次点和二次曲线之间的点乘,只需要将二次点对应的张量分别与二次曲线对应的张量沿主对角线对称的位置相乘并求和。由于二次点和二次曲线对应的张量都是对称的,所以甚至可以省去对称这一步骤,直接将对应位置的分量相乘并求和即可。

点乘等于一个任意实数,一般不是规范不变的。但是,点乘为零是规范不变的,其意义是点在线上或线经过点,这里的点指的是一次点或二次点,线指的是直线或二次曲线。如果二次曲线是退化的,图象为两条直线,那么点可能在任意一条上;同理,如果二次点是退化的,图象为两个点,那么线可能经过任意一点。

我们看到,目前的两种点乘,结果都是实数,而且结构关于点和线是对称的,因此我们说点乘具有交换律。

不同阶数对象之间的点乘

类似点矢和线矢之间的点乘,同样定义点和二次曲线、直线和二次点之间的点乘为其先做张量积,再缩并相邻的一个指标。点矢 $a^i=(x_0,y_0,z_0)$ 和二次曲线张量

$$ g_{ij}=\begin{bmatrix} A & B & D \\ B & C & E \\ D & E & F \end{bmatrix} $$

的点乘 $a^ig_{ij}$ 表达式:

$$ a^ig_{ij}=\left[Ax_0+By_0+Dz_0,Bx_0+Cy_0+Ez_0,Dx_0+Ey_0+Fz_0\right] $$

也就是说,它们的点乘得到一个线矢,计算方法为点矢和二次曲线张量的每一行(列也可以,因为二次曲线张量的行列是对称的)分别相乘,得到的三个实数依次组成线矢的三个分量。

将这条直线改写为方程的形式并整理,得到

$$ Ax_0x+B(y_0x+x_0y)+Cy_0y+D(z_0x+x_0z)+E(y_0z+z_0y)+Fz_0z=0 $$

即这个点关于二次曲线的极线方程。

在这里,可以把二次曲线看成“两层”的线矢,与一个点矢点乘后,消去“一层”线矢,得到剩下的一个线矢。按照这种理解方式,两个均为“一层”的点矢和线矢点乘,分别消去一层后,不再剩余任何矢量结构,得到一个实数。如果把一个动点 $a^i=\left(x,y,z\right)$ 与二次曲线点乘两次,即

$$ a^ia^jg_{ji}= \left(x,y,z\right) \cdot \left(x,y,z\right) \begin{bmatrix} A & B & D \\ B & C & E \\ D & E & F \end{bmatrix} =\left(x,y,z\right) \cdot \left[Ax+By+Dz,Bx+Cy+Ez,Dx+Ey+Fz\right] =Ax^2+2Bxy+Cy^2+2Dxz+2Eyz+Fz^2 $$

$$ a^ia^jg_{ji}= \left(x,y,z\right) \left(x,y,z\right) \cdot \begin{bmatrix} A & B & D \\ B & C & E \\ D & E & F \end{bmatrix} =\begin{pmatrix} x^2 & xy & xz \\ xy & y^2 & yz \\ xz & yz & z^2 \end{pmatrix} \begin{bmatrix} A & B & D \\ B & C & E \\ D & E & F \end{bmatrix} =Ax^2+2Bxy+Cy^2+2Dxz+2Eyz+Fz^2 $$

得到二次曲线的一般方程。这个计算,也可以看作

类似点矢与二次曲线张量的点乘,可以定义线矢与二次点的点乘,得到一个点矢,即

$$ \left[A,B,C\right] \cdot\ \begin{pmatrix} x & y & u \\ y & z & v \\ u & v & w \end{pmatrix} =\left(Ax+By+Cu,Ay+Bz+Cv,Au+Bv+Cw\right) $$

按照点与线的对偶原则,这个点矢是这条直线关于二次曲线的极点的齐次坐标。另外,可以看出,张量之间的点乘是具有交换律的,因为只有点和线之间可以点乘,通过上下指标或括号的形式可以明确地对它们进行区分,无论先后顺序。

指标升降

我们在二次点的部分提到,二次点和二次曲线之间可以建立起一个大致一一对应的关系,进行相互转化。之所以说“大致”一一对应,是因为退化二次曲线、退化二次点没有对应的二次点、二次曲线。这一点是由于退化二次曲线的定义保证的,但是由于我们没有详细介绍号差,所以在此不证明这一点,具体可查阅原文章 圆锥曲线第三节:升降指标、点乘和叉乘

我们把二次曲线 $g_{ij}$ 对应的二次点用 $g^{ij}$ 表示,定义 $g^{ij}$ 满足

$$ g_{ij}g^{jk}=\begin{bmatrix} (1,0,0) \\ (0,1,0) \\ (0,0,1) \end{bmatrix} $$

那么,如何求出 $g^{ij}$ 呢?目前我所知最简单的方案是通过逆矩阵。熟悉线性代数的读者可以很清晰的看出 $g_{ij}$ 与 $g^{ij}$ 互为逆矩阵。对于没有线性代数基础的同学,我在此给出一个折中的方案。

由于我们处理的圆锥曲线,大多是中心在原点、对称轴为坐标轴的圆锥曲线,此时它们对应的 $g_{ij}$ 只在主对角线(左上到右下的对角线)上分量不为 0。对于这种特殊的二次曲线张量,它对应的二次点 $g^{ij}$ 依旧满足只在主对角线上分量不为零,且主对角线上的分量是 $g_{ij}$ 的倒数。例如,

$$ g_{ij}=\begin{bmatrix} \frac{1}{a^2} & & \\ & \frac{1}{b^2} & \\ & & -1 \end{bmatrix},g^{ij}=\begin{pmatrix} a^2 & & \\ & b^2 & \\ & & -1 \end{pmatrix} $$

由于我们今后见到的张量中可能会有很多 $0$ ,所以我们约定:所有空白的位置都代表省略的 $0$ 。我会在不引起混淆的情况下尽可能省略更多的 $0$ ,以求简洁与清晰。

我们知道,点和线可以进行点乘运算,然而点和点、线和线之间不能进行点乘运算。但是,如果在点和线之间建立一种映射关系,就可以让点和点、线和线之间也具有点乘运算。一个普遍存在的映射关系是圆锥曲线的极点与极线。由于我们大多数情况下都只讨论一条圆锥曲线,所以这个映射可以建立起来而不产生歧义。

因此,我们定义:点矢 $a^i$ 对应的线矢 $a_i=g_{ij}a^i$ ,线矢 $a_i$ 对应的点矢 $a^i=g^{ij}a_i$ 。如果寻找一个线矢对应的点矢,在寻找这个点矢对应的线矢,那么它和原来的线矢之间会相差一个常数。但是由于我们的坐标系是齐次坐标,所以常数可以忽略,因此我们说点矢与线矢之间的对应是可逆的。

进一步,定义点矢与点矢之间的点乘 $a^i \cdot b^i = a_i b^i = a^i b_i = g_ij a^i b^j$ ,线矢与线矢之间的点乘 $a_i \cdot b_i = a_i b^i = a^i b_i = g^ij a_i b_j$ 。线矢或点矢与自己点乘记为平方的形式。

叉乘与混合积

我们知道,对于三维矢量,还有叉乘这一种运算。为了定义叉乘,我们先引入一组特殊的张量:标准反对称张量 $\epsilon^{ijk}$ 与 $\epsilon_{ijk}$ 。之所以叫反对称张量,是因为交换这个张量的一个分量的一组指标,得到的另一个分量是原来分量的相反数。之所以叫标准,是因为这个张量的分量只有 $0,1,-1$ 。满足这两个条件的张量一共有两个,分别对应两个标准反对称张量。我们规定:

$$ \epsilon^{ijk}=\left( \begin{pmatrix} 0& & \\ & & -1 \\ &1& \\ \end{pmatrix},\begin{pmatrix} & & 1\\ & 0& \\ -1&& \\ \end{pmatrix},\begin{pmatrix} &-1& \\ 1 & & \\ && 0\\ \end{pmatrix} \right) $$$$ \epsilon_{ijk}=\left( \begin{bmatrix} 0& & \\ & & 1 \\ &-1& \\ \end{bmatrix},\begin{bmatrix} & & -1\\ & 0& \\ 1&& \\ \end{bmatrix},\begin{bmatrix} &1& \\ -1 & & \\ && 0\\ \end{bmatrix}\right) $$

有了标准反对称张量,我们可以定义矢量之间的叉乘:两个点矢的叉乘 $a^i\times b^i$ 是一个线矢,定义为 $(a^i\times b^i)_i=\epsilon_{ijk}a^jb^k$ ;两个线矢的叉乘 $a_i\times b_i$ 是一个点矢,定义为 $(a_i\times b_i)^i=\epsilon^{ijk}a_jb_k$ 。

下面我们计算两个点矢 $a^i=(x_1,y_1,z_1),b^i=(x_2,y_2,z_2)$ 叉乘的一般情况:

$$ (a^i\times b^i)_i=\epsilon_{ijk}a^jb^k= \begin{bmatrix} 0 & -z_1 & y_1 \\ z_1 & 0 & -x_1 \\ -y_1 & x_1 & 0 \end{bmatrix} (x_2,y_2,z_2) = [y_1x_2-y_2z_1,x_2z_1-x_1z_2,x_1y_2-x_2y_1] $$

这与空间解析几何中向量叉乘的定义相符。根据齐次坐标的知识,两个点矢叉乘的结果是过两个点矢对应点的直线,两个线矢叉乘的结果是两个线矢的交点。

定义三个点矢 $a^i,b^i,c^i$ 的混合积 $[a^ib^ic^i]=\epsilon_{ijk}a^ib^jc^k$ ,三个线矢 $a_i,b_i,c_i$ 的混合积 $[a_ib_ic_i]=\epsilon^{ijk}a_ib_jc_k$ 。容易证明,混合积是一个实数,结果与空间解析几何中的算法相同。

类似点矢、线矢的叉乘,我们可以定义二次点、二次线的二次叉乘:两个二次点的二次叉乘 $f^{ij}\times h^{ij}$ 为二次曲线,定义为 $(f\times h)_{kl}=\epsilon_{imk}\epsilon_{jnl}f^{ij}h^{mn}$ ; 两个二次线的二次叉乘 $f_{ij}\times h{ij}$ 为二次点,定义为 $(f_{ij}\times h_{ij})^{kl}=\epsilon^{imk}\epsilon^{jnl}f_{ij}h_{mn}$ 。但是,由于二次叉乘的计算过于复杂,而且我目前还尚未找到二次叉乘的简便算法,因此在这里不着重讨论。

虽然二次叉乘过于复杂,但是二次叉乘的一个退化情况比较重要。当二次点和二次线的其中一个是退化的一个点或一条直线时,我们可以得到二次叉乘的一个导出式:

$$ g^{ij} \times a^ia^j = a^2g_{ij}-a_ia_j $$$$ g_{ij} \times l_il_j = l^2g^{ij}-l^il^j $$

由于我们没有详细讨论一般的二次叉乘,所以这两个导出式不容易推导。如果想详细了解推导过程,可以查阅原文章 圆锥曲线第十四节:二次点乘与二次叉乘

类比两个点矢和两个线矢的叉乘,可以得到这时叉乘的结果是直线与椭圆交点组成的二次点,或过定点作椭圆的两条切线。

与矩阵的联系

目前,我们已经定义了点和曲线的各种运算,熟悉线性代数的读者可能有很多熟悉的感觉。由于我对线性代数学习不多,所以在此仅仅给出部分我想到的几何对象的运算与矩阵的联系。

点和直线可以分别看成列向量和行向量。点和直线的对称积可以看作列向量和行向量做矩阵乘法,点和直线的点乘可以看作行向量和列向量做矩阵乘法。二次点与二次曲线做张量积,再缩并一次,对应矩阵乘法。

二次曲线和二次点可以看作一个 3×3 矩阵。我们看到,用矩阵可以表示二阶张量的分量,但是不能显示出张量的类型,即上指标还是下指标,或者说点还是线。因此我们部分地改造矩阵来表示张量,具体地说是通过方括号和圆括号。

不同阶数对象之间的点乘对应它们的矩阵乘法。但是,运用矩阵乘法,仅仅能得到具体的分量数值,不能表示上标和下标转换的效果,这就是我不使用列向量和行向量表示点和直线的原因。

上面的这几点想法是从矩阵出发的。我们也可以换一个角度,把方阵看作张量在二阶情形下的特殊情况。在这种意义下,矩阵乘法对应一次张量积和一次缩并相邻指标的总和。

四、运用张量法解决问题

点与曲线运算的几何意义

在点与曲线的运算一节中,我们已经给出了部分运算的几何意义。在这里,我们将其进行总结。以下这些结论,在我们给出了张量的计算法则之后都是比较容易证明的。

  1. $a^il_i=0$ 意味着点在直线上,或者说直线经过点。
  2. 两个点矢叉乘得到线矢,这个线矢表示过这两个点的直线;两个线矢叉乘得到点矢,这个点矢表示这两条直线的交点。
  3. $a^i+\lambda b^i$ 取遍过 $a^i \times b^i$ 上的所有点,这条直线上的所有点构成的集合称为一次点列,或点列。 $m+\lambda n$ 取遍过 $m_i \times n_i$ 的所有直线。这些直线构成的集合称为一次线束,也称线束。
  4. 如果三个点矢的混合积为 0 ,那么 abc 三点共线。如果三个线矢的混合积为 0,那么这三条线共点。
  5. 若点矢 $a^i$ 满足 $g_{ij}a^ia^j=0$ ,则称 $a^i$ 对应的点在 $g_{ij}$ 对应的圆锥曲线上。若线矢 $l_i$ 满足 $g^{ij}l_il_j=0$ ,则称 $l_i$ 对应的直线与 $g^{ij}$ 对应的圆锥曲线相切。
  6. 点矢的平方 $a^2$ 称为点与圆锥曲线的判别式,其值的正、负、零分别对应点在二次曲线外、内、上;线矢的平方 $l^2$ 称为线与圆锥曲线的判别式,其值的正、负、零分别对应线与二次曲线相离、相交、相切。这个结构看似没有出现二次曲线的张量,实际上它隐藏在指标的升降中。
  7. 对任意点矢或线矢 $a$ , $a^i$ 对应的点和 $a_i$ 对应的直线互相称为对方的极点和极线。

直线与圆锥曲线联立

我们知道,求解直线 $l_i=[A,B,C]$ 与椭圆的两个交点 $a^i,b^i$ 可以用二次叉乘$g_{ij} \times l_il_j = l^2g^{ij}-l^il^j$ 解决。下面给出一个具体的计算过程:

$$ g_{ij}=\begin{bmatrix} \frac{1}{a^2}&0&0\\ 0& \frac{1}{b^2}&0\\0 &0&-1\\ \end{bmatrix},g^{ij}=\begin{pmatrix} a^2&0&0\\ 0&b^2&0\\0 &0&-1\\ \end{pmatrix} $$$$ l^i=(a^2A,b^2B,C) , l^2=l_il^i=a^2A^2+b^2B^2-C^2 $$$$ (ab)=l^il^j-l^2g^{ij}= \begin{pmatrix} a^2 \cdot a^2A^2&a^2b^2AB&-a^2AC\\ a^2b^2AB&b^2 \cdot b^2B^2&-b^2BC\\ -a^2AC&-b^2BC&C^2\\ \end{pmatrix} -(a^2A^2+b^2B^2-C^2) \begin{pmatrix} a^2&0&0\\ 0&b^2&0\\ 0 &0&-1 \end{pmatrix} =\begin{pmatrix} a^2(C^2-b^2B^2)&a^2b^2AB&-a^2AC\\ a^2b^2AB&b^2(C^2-a^2A^2)&-b^2BC\\ -a^2AC&-b^2BC&a^2A^2+b^2B^2\\ \end{pmatrix} $$

根据对称积一节中我们做过的计算,设$a^i=(x_1,y_1,1),b^i=(x_2,y_2,1),k_1=\frac{y_1}{x_1},k_2=\frac{y_2}{x_2},x_M=\frac{x_1+x_2}{2},y_M=\frac{y_1+y_2}{2}$ ,得到

$$ (ab)=\begin{pmatrix} 2x_1x_2&x_1y_2+x_2y_1&x_1+x_2\\ x_1y_2+x_2y_1&2y_1y_2&y_1+y_2\\ x_1+x_2&y_1+y_2&2 \end{pmatrix} =\begin{pmatrix} x_1x_2&\frac{x_1x_2}{2}(k_1+k_2)&x_M\\ \frac{x_1x_2}{2}(k_1+k_2)&x_1x_2k_1k_2&y_M\\ x_M&y_M&1 \end{pmatrix} $$

由于我们使用的是齐次坐标,所以两种方法算得的 $(ab)$ 对应项成比例。对比系数就可以得到“硬解定理”,以及齐次化中需要的点与原点连线乘积。

同理,可以得到过一点作圆锥曲线的两条切线方程。梳理圆锥曲线中极点极线的基本脉络(下) 这篇文章中给出了一个利用二次曲线系得到了同样的形式,与我们的 $g^{ij} \times a^ia^j = a^2g_{ij}-a_ia_j$ 结构完全相同。