对四维空间感兴趣的可以看看这部科普片《维度:数学漫步》
如果你已经有高等代数和解析几何的知识,那我们就开始吧。
四维超正方体介绍
空间,即在高等代数中介绍的欧几里得空间。所谓高维空间的维,就是指欧几里得空间中的维数。显然,用这种方式来解释高维空间是非常自然的,同时也是很容易理解的。
然而,在学高等代数时,课本上所用的几何例子无一例外全都是三维空间中的例子。这也正是为什么,即便我们在大学时主修的是数学专业,仍然对高维空间没有直观的理解。以致于,当我们遇到别人在谈论高维空间时,自己却是一脸茫然!
既然高等代数中介绍了欧几里得空间中的基本理论,那么自己应该很自然地去多想一步,而事实证明这一步是非常关键的!本文从欧几里得空间的基本理论出发,来了解一下四维超正方体。
预备知识
四维空间$\mathbb{V}$中,向量$\mathbf{v}=\left( {{x}_{1}},{{x}_{2}},{{x}_{3}},{{x}_{4}} \right)$,其中${{x}_{i}}\in \mathbb{R}$。
两向量${{\mathbf{v}}_{1}},{{\mathbf{v}}_{2}}$垂直:${{\mathbf{v}}_{1}}\cdot {{\mathbf{v}}_{2}}=\mathbf{0}$
两向量${{\mathbf{v}}_{1}},{{\mathbf{v}}_{2}}$平行:$\exists \lambda $使得${{\mathbf{v}}_{1}}=\lambda {{\mathbf{v}}_{2}}$
向量$\mathbf{v}$的模:$\left| \mathbf{v} \right|=\sqrt{x_{1}^{2}+x_{2}^{2}+x_{3}^{2}+x_{4}^{2}}$
两点${{P}_{1}},{{P}_{2}}$间的距离可以通过向量的模来定义:$d\left( {{P}_{1}},{{P}_{2}} \right)=\left| {{P}_{2}}-{{P}_{1}} \right|$。
两非零向量${{\mathbf{v}}_{1}},{{\mathbf{v}}_{2}}$的夹角:$\cos \left\langle {{\mathbf{v}}_{1}},{{\mathbf{v}}_{2}} \right\rangle =\frac{{{\mathbf{v}}_{1}}\cdot {{\mathbf{v}}_{2}}}{\left| {{\mathbf{v}}_{1}} \right|\left| {{\mathbf{v}}_{2}} \right|}$
平面方程:$a{{x}_{1}}+b{{x}_{2}}+c{{x}_{3}}+d{{x}_{4}}+e=0$,其中$\left( a,b,c,d \right)$是平面的法方向。
实际上,玩耍四维超正方体的预备知识也就这些。
数学专业的朋友,肯定也学过好多其它空间理论,那么玩耍的空间就真的好大好大。有兴趣的自己去玩吧,反正以后我是会去玩的。
构建单位超正方体
从二维空间中的单位正方形和三维空间中的单位立方体,不难想象四维空间中的单位超正方体。它应该是由体面线点组成的,而且满足正交和单位模的性质,即:过同一顶点的所有棱互相垂直,过同一顶点的所有面互相垂直,过同一顶点的所有体互相垂直;所有棱的长度等于1,所有面的面积等于1,所有体的体积等于1。
超正方体的构造方法可以通过以下方式来想象:
从零维到一维:两个点A和B可以被连接起来,我们就得到一个新的线段AB。
从一维到二维:两个平行的线段AB和CD可以被连接起来,我们就得到了一个正方形,以顶点为标记记作正方形ABCD。
从二维到三维:两个平行的正方形ABCD和EFGH可以被连接起来,我们就得到了一个立方体,以顶点标记为立方体ABCDEFGH。
从三维到四维:两个平行的立方体ABCDEFGH和IJKLMNOP可以被连接起来,我们于是就得到了一个超正方体,以顶点标记为超正方体ABCDEFGHIJKLMNOP。
四维方体的结构不易想象,但可以投射至3维或2维空间。在我们将其投影到二维空间中后,把顶点位置调整,可以了解更多。如此获得的图像,不再反映四维方体空间构造,而是反映顶点间的联系。——维基百科
两个条件:构建超正方体,只需要上面的条件中的两个即可——过同一顶点的所有棱互相垂直,所有棱的长度等于1。
顶点:如果将单超正方体靠在坐标轴上(所有坐标为正的那一处,即三维坐标中说的第一象限),那么有5个点已经确定了,它们分别是:(0,0,0,0),(1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1)。进一步,不难想到每个点的坐标只可能是由0和1组成的4维向量,而且恰好所有的组合正是单位超正方体的所有顶点(共2^4个)。实际根据这5个顶点再加上两个条件即可推算出其它所有的点,但这样做的话,数学就显得不那么美妙了。
棱:显然超正方体每个顶点处都有4条棱,那么它共有多少条棱呢?只需要把每顶点拆开成4个顶点,即可做得到每条棱有两个独立的顶点,因此共有2^4*4/2=32条棱。(记得高中化学里有类似的题目)
那么如何确定哪两个顶点之间存在一条棱呢?很简单,只需要两点的距离等于1即可。
面:由于棱的正交性,超正方体的每个面仍然是正方形,共有24个面。方法和上面类似。
体:超正方体中的体(3-胞)也都是3维立方体,共有8个体。方法和上面类似,但比较难想象。
观测
一般来说,可以将n维空间中的物体投影到n-1维空间中观看。比如,屏幕是二维的,但我们可以通过物体在二维空间中的投影图像构建出三维物体(当你在屏幕上看到一个苹果时,你反应的不是一个平面的苹果)。
可惜这项人人都会的本领却是后天非常难学会的。对于天生的肓人,当其成年后恢复了视力,但在他的视野里都是二维的。因此,即使我们把四维空间中的物体投影到三维空间,你几乎也无法想象它在四维空间是什么样子。进一步,既然我们只能感受三维空间,那么我们自然会认为世界是三维的,但实际上呢?
闲话少说,开始玩耍吧。
Mathematica在很多领域确实是个好工具,让人爱不释手。
首先,构建一个超正方体:
n = 4;(*维数*) Vs = Tuples[{0, 1}, n];(*所有顶点*) AllEs = Subsets[Vs, {2}];(*所以边*) d = Norm[#[[1]] - #[[2]]] & /@ AllEs; Es = AllEs[[Flatten[Position[d, 1]]]];(*可能的边*) xk = Table[ToExpression["x" <> ToString[k]], {k, n}];(*投影平面-变量*)
再设置投影平面,并求解方程:
ak = {1, 1, 0.1, 1.};(*投影方向,修改此处改变旋转曲线*) x0 = {0, 0, 0, 0};(*投影平面-过某点*) plane = ak.(xk - x0);(*投影平面*) fc1 = {ak.(xk - x0) == 0}; pro[list_] := Module[{fc1 = {ak.(xk - x0) == 0}, plane = ak.(list - x0)}, fc = fc1~Join~Thread[list - xk == $\lambda $ ak]; If[plane == 0, Thread[xk -> list], Solve[fc, xk~Join~{$\lambda $}]]]; proVs = Flatten /@ (xk /. pro /@ Vs); proEs = Es /. Thread[Vs -> proVs]; RM = RotationMatrix[{ak, {0, 0, 0, 1}}];(*旋转矩阵*) RproVs = Transpose[RM.Transpose[proVs]];(*旋转,使得第4个维度恒为0*) RproEs = Transpose[RM.Transpose[#]] & /@ proEs;(*旋转,使得第4个维度恒为0*)
绘制图像:
Graphics3D[ Flatten[{{RGBColor[{0.5, 1, 0}], Opacity[.9], Cylinder[#, 0.02]} & /@ (RproEs[[;; , ;; , ;; 3]]), {PointSize[ 0.03], Sphere[#, 0.06]} & /@ (RproVs[[;; , ;; 3]])}], Boxed -> False, AspectRatio -> Automatic, Background -> Black, ImageSize -> {500, 500}, ViewVector -> {{10, 5, 5}, {0, 0, 0}}]
再把多幅图导出为gif动画即可,这里使用修改“投影方向”来替代旋转超正方体。下面的图像,投影方向制为:ak = {Cos[t], Sin[t], 1, 1};。
>>>程序下载(含导出动画部分):百度网盘
参考
后话,原来在Mma10中已经有了关于高维空间的函数,比如超立方体函数——HypercubeGraph