数学建模社区-数学中国
标题: Mathematica-用 ContourPlot3D 绘制多面体 [打印本页]
作者: Asdmath2020 时间: 2020-3-24 15:49
标题: Mathematica-用 ContourPlot3D 绘制多面体
曲面除了可以用参数方程的形式表示之外,还可以用隐函数的形式表达,即表示为 F(x, y, z) = 0 的解。这种曲面又称之为等值曲面,因为曲面上的每个点都满足 F(x, y, z) = 0 这一条件。Mathematica 提供了绘制等值曲面的函数 ContourPlot3D。不过在这篇文章里,我们并不用它来绘制各种婀娜多姿的曲面,而是尝试用它探索、绘制一些"多面体"。
2 W2 H$ p& G) |9 j% d从最简单的开始
q4 n' j, M: z1 }& [- p8 }' x让我们从最简单的,大家耳熟能详的球面方程开始:
2 W! W; y! H3 u
6 h, X& {; M2 S( M
方程 x^2+y^2+z^2==1 的意义非常简单:每个点到原点的距离都是 1,这就形成了一个球面。相比较之下,球面的参数方程就不是这么简单了:! A5 M$ ~* O- V$ |3 {
多面体' g! Z. n1 }5 W, b/ @
从球面方程出发,我们可以看一下更一般的形式,比如 x^n+y^n+z^n==1 的图形是什么样子的: ; t( q/ W: U4 T# R
' p: S7 z& e/ ?5 j6 _! s# V3 ?
可以看到随着 n 的值不断增大,方程表示的曲面越来越接近一个立方体。这是为什么呢?我并不能完全解释,只能提出这么一个猜测。考虑如下表达式:
9 L, X6 P% l! @$ y
6 y5 S+ i& o- h3 m这是 Lp 范数的定义,当 p 趋向于正无穷时,上述表达式的极限是:$ \. G+ a3 d1 n- Q) D! \+ D! _
I7 |) A$ M8 W也就是 n 个绝对值中的最大值。把这个结论放到我们的方程 x^n+y^n+z^n==1 上,当 n 不断变大时,在不同方向上就不断接近 | x | == 1、| y | == 1、| z | == 1 三个方程,而这三个方程恰恰是立方体的六个面:x = ±1、y= ±1、z= ±1。根据这个猜测,我们只要能知道多面体各个面的平面方程,就能类比的求得类似上述立方体的“多面体渐近方程”。更进一步的,多面体各个面的平面方程,只要知道面法向量就可以确定平面方程了,如果面法向量是 (a, b, c),则成对的平面方程就是 a x+b y+ c z = ±1。
利用 PolyhedronData 可定义求各种多面体法向量的函数如下:
- ^3 i9 }; S: Q7 T9 G k/ L
. m' e, R/ q, X" f4 r1 N
接下来就让我们用实际计算来验证一下这个猜测吧:% X% w6 J" r- ^6 A
正八面体
5 P/ _3 \; w3 h% q5 _1 l9 f/ T
求正八面体的法向量:
& \" @$ A! C5 C7 h; E化简并去除方向刚好相反的法向量,因为之前方程的常数项 ±1 可以由一个法向量得到两个相对的面的方程:
) G0 B p0 Y( l9 t/ ~
+ J* g* E/ l1 R# D: d8 F. a, p
然后就可以根据这个求八面体渐近方程了:/ U! r2 M1 w9 S: R; b
) ^8 S, U& s3 `& R; \; b
9 G; K6 _/ h0 N! @8 D正十二面体
) [# V4 }! b$ C6 M: v. X
正十二面体的法向量:
% `* s; [8 ~ |2 x |' F
5 K; Z; E/ v* b9 D! q化简并去除方向刚好相反的:
6 A( P& E" }* |. m4 w4 @, _2 Y
5 d: z7 u, z( _# v
隐函数表达式:9 n* p0 V/ t+ O
- S8 o9 f9 h* @- J/ I1 B
' u: }2 r3 z& J: r为了计算方便,我们用数值近似取代根号形式:
绘制图形,可以看到,随着次数 n 的不断升高,图形越来越接近正十二面体:
) e: c4 k6 t X' g: F( A- X
: u7 i! \; Q6 ~4 c3 j, ^
十二面体
b- [( I" ^, U4 O; i3 W' X
计算各个面的法向量:1 T3 s2 @5 w4 d/ t# B7 E1 i+ @: e
3 S: B& J) g6 F) B化简并去除方向相反的:
7 ?" ]( I8 ]( _* b& ~8 J2 v# j: f1 b: K \2 L& S% f, d( ]" Y
得到方程左侧表达式:
2 o1 b- y2 a6 [/ |3 B. g5 X为了计算方便,取近似值:$ [0 i5 t3 G4 X+ n- F
" C+ u1 x* A% h2 Y
绘制正二十面体的曲面方程:
( z7 X+ }; w; D+ a k绘制正二十面体的曲面方程:
8 @ B' R; u2 f$ @8 P# g& y; ^
复合多面体
从上面的计算可以看到,根据猜测做的推论基本上是对的:确实据此得到了各种正多面体的渐近方程并成功绘制了出来。但同时也可以看到,这种方法有很多局限性。首先,所生成的多面体必须有平行的相对的面,这样采用的法向量才能一个顶俩,发挥应有的作用得到对应的多面体。五种正多面体里,只有四种满足这个条件,还剩下一个正四面体不能用这种方法表示。其次,用这种方法只能表示凸多面体,所谓凸多面体,就是内部任意两点的连线仍然落在内部的多面体。这两个问题都是可以解决的,解决方法是引入指数函数。( C" e0 Z& e- ~
正四面体
m5 P; i# _9 F8 {' h9 j计算正四面体的法向量:
9 e) t8 ~' `4 Y0 Z& b
化简:
如果用之前的高次方程的方法,那么只能得到一个朝向比较特别的正八面体,因为每个法向量都生成了两个平面:
7 v6 @7 s) \* s& Y# R6 w2 C9 u8 `- J
2 m1 K8 l+ a* V: I; V& f而改用指数,则可得到如下表达式:+ w" o' L1 Q$ p) @# Q
. z2 w, q' c( T8 H7 J, t$ h, i以此作为隐函数果然可以画出正四面体:5 c2 h X. u/ c; H0 @+ j! w
. c/ r& O/ P2 T& l
为什么这样可行?我也只能给个近似的猜测:对 E^(a x + by + c z)==C 这样的方程,两边取对数就是 a x+ b y+ c z==log C 这就是一个平面的方程,把几个这样的平面方程加起来,就"围成"了一个多面体。而指数的增长保证了每个方向上不会受其它项的影响,保持大体是个平面。
/ p, v G( U/ O* P$ W: {& I另外还值得指出的是,可以在指数上再加次数,让这样生成的多面体的边缘更加"锐利":
3 k6 P& V# v! g5 L0 |9 |: [ D+ m
' U, m5 a# H4 m* X! D
星形八面体
在各种各样的多面体中,有一类多面体可以看作是若干基本的多面体彼此叠合组成,我们称之为复合多面体。比如下图所示的星形八面体,就可以看作两个正四面体彼此叠合而成。
' G$ y* `7 J" U9 x, v
P# p1 X; C5 F. l7 R+ y/ m观察这个复合多面体的面的组成指标可以发现,前四组只包含顶点 2、4、5、8,后四组只包含顶点 1、3、6、7。这恰好是各自组成两个正四面体。我们可以照样算出这八个面的法向量,然后分组各自生成两个正四面体曲面:
& ?' {7 M% Z, h0 A2 C
^2 }" D; g7 C. N3 Z; p I( q
求法向量,化简并分组:6 f( G: O* X* @$ |
1 U" J2 c/ ]9 ^3 S
得到两个指数和的表达式:2 G H. o* H9 z
; B- d F! m" p" b+ X分别绘制可以看到两个正四面体:! N4 i6 Q r, O( B$ K
) z; |. C+ `: I3 `6 S0 a如何从这两个四面体得到想要的星形八面体呢?直接相加肯定是不行的,那样得到的就是正八面体了。这里我们采用 The Nature of Mathematics and the Mathematics of Nature 一书中提到的一个小技巧:把两个方程表达式再次放到指数上。这个技巧称为 Exponential Scale:3 d7 S# i7 A, h6 E5 `5 z9 ?/ A# w$ j
8 b. {9 P, F! X7 B+ G9 N可以看到,这个方程确实可以绘制出星形八面体:
3 f, D: x5 f. e& U" c! _
4 f7 e/ e; c; Z- r$ h
可以把旋转观察这个星形八面体曲面的过程输出为动画:
7 t( z6 r( T. ^/ s- z
+ Y$ H# C/ n( e2 o
* c4 Y4 L! Y: M/ t$ ~8 t
: l6 B6 J7 f- b
五复合正四面体
7 ]: F( Z* A7 K& b6 P
我们可以再举一个例子,五复合正四面体,这是由五个正四面体内接于一个正十二面体形成的复合多面体:
6 H1 V0 g- F3 O* e照例求面法向量,化简并分组:
6 W# T, T3 C) X9 ]# [. \
: O/ q0 O, \7 n1 T# A+ b) t
得到方程:
- w4 a+ o$ S2 g3 K! M/ ~- [
9 B/ w+ m& C1 ?* i/ D; ^6 U$ |, W绘制可以得到五复合正四面体的近似曲面(警告:由于项数太多,运行绘制速度很慢,运行时请耐心等待):
- f3 X2 R- g, [0 c& T' E2 ^
% t$ Q" @7 f z" x9 J
我们也用它生成一个旋转观察的动图:
0 f2 V: F0 Y! _2 h# e" d
: t/ E |8 j! r6 O
! y& Y& v9 Q( a' i) t' ?; K
更多的复合多面体
/ i- u& j- O. k$ Q; f" L! }
只要是由凸多面体组成的复合多面体,理论上都可以用上面的方法,先求得各个多面体的方程,然后“抬升”到指数位置,得到复合多面体的方程。Mathematica 提供的PolyhedronData 函数里有许多复合多面体,我全部列在下面,感兴趣的读者可以自己实验生成想要的复合多面体曲面。! b4 m; r( ?# v: t; }
2 u3 ]( `$ U6 S# n
' V; b& ^- v8 B2 U, g: s
对此有兴趣的,欢迎联系我们共同探讨。
( {/ j+ V H" J6 P) o( k5 Vmarket@asdoptics.com ; F0 o: n; X6 X5 V" x4 z) [
www.asdoptics.com
4 f) r$ \! m# P5 Z1 {. g R# o; h/ F& \" s5 k: u
-
12.jpg
(7.97 KB, 下载次数: 393)
作者: 宏心 时间: 2020-5-14 13:27
变幻无穷,无穷% h3 b9 o6 A2 k" v3 J7 A% `: l
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |