数学建模社区-数学中国

标题: Mathematica-用 ContourPlot3D 绘制多面体 [打印本页]

作者: Asdmath2020    时间: 2020-3-24 15:49
标题: Mathematica-用 ContourPlot3D 绘制多面体
曲面除了可以用参数方程的形式表示之外,还可以用隐函数的形式表达,即表示为 F(x, y, z) = 0 的解。这种曲面又称之为等值曲面,因为曲面上的每个点都满足 F(x, y, z) = 0 这一条件。Mathematica 提供了绘制等值曲面的函数 ContourPlot3D。不过在这篇文章里,我们并不用它来绘制各种婀娜多姿的曲面,而是尝试用它探索、绘制一些"多面体"。) ]5 v: s6 L9 h3 P& J& ~
从最简单的开始! y" p# l  ]) o/ ~3 H) V) r. e. q
让我们从最简单的,大家耳熟能详的球面方程开始:
9 I' \2 \& P* A, S; u/ `7 p 11.jpg
$ D  Z' i" P' @# ]$ \$ J方程 x^2+y^2+z^2==1 的意义非常简单:每个点到原点的距离都是 1,这就形成了一个球面。相比较之下,球面的参数方程就不是这么简单了:
( K! Y' M- `1 o2 |6 L# p# E- a多面体
. A, u0 c2 Z! `$ T  j从球面方程出发,我们可以看一下更一般的形式,比如 x^n+y^n+z^n==1 的图形是什么样子的:
3 U% u% b3 W" E# n6 ~. m4 L8 V/ } 13.jpg , M8 U9 e8 |0 Y; J% n5 c
可以看到随着 n 的值不断增大,方程表示的曲面越来越接近一个立方体。这是为什么呢?我并不能完全解释,只能提出这么一个猜测。考虑如下表达式:0 X; x$ l+ k! c" g+ B" |
02.png
! `! g3 @; d1 Y" w' p, A% G- p: Y这是 Lp 范数的定义,当 p 趋向于正无穷时,上述表达式的极限是:/ {8 j, X. O2 u* ~
03.png % L# ]' L+ g6 s5 R8 U0 Y+ X
也就是 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 可定义求各种多面体法向量的函数如下:

- G) H; Z8 `8 w; L! Y+ _. S$ Q 14.jpg
$ @% R4 L' R6 g8 K1 Y& }接下来就让我们用实际计算来验证一下这个猜测吧:3 b- v  \7 \/ G0 n( v5 ?* P( n
正八面体

! p0 S. I2 H4 ?+ u
求正八面体的法向量:
04.png
, d5 {" h( |4 c. _( i2 y; U2 E3 f化简并去除方向刚好相反的法向量,因为之前方程的常数项 ±1 可以由一个法向量得到两个相对的面的方程:, i1 |5 j' s( m7 S$ x
05.png
8 j) Y0 ^) Q* b# k0 R& T3 g然后就可以根据这个求八面体渐近方程了:& p3 H. o( ?, Y; B: {
06.png 1 P; |- J) h' J2 x
15.jpg & {/ F5 j( K1 u& s" G
正十二面体

+ p$ g( }9 |0 z$ w$ c, h% T; L
正十二面体的法向量:
07.png & h4 i% {5 q5 u7 l

. H9 m' P. Z8 f& B' Y; ~4 A化简并去除方向刚好相反的:" _4 L6 E% \$ e2 v! E7 b6 T- j
16.jpg ' M! p5 h5 l* T" k2 r, u2 o9 l4 g
隐函数表达式:' w' D  d/ C; r+ c& M% `  A
08.png * Z- }- ]9 T, Z
) R* P( u5 O+ r# Y$ z5 C2 U
为了计算方便,我们用数值近似取代根号形式: 09.png 绘制图形,可以看到,随着次数 n 的不断升高,图形越来越接近正十二面体:4 R. V" p; u, |2 o
17.jpg
) {0 e. ?. X, @; i) w# `- Q
十二面体
. p* r7 s  g) |+ l$ M* ?/ q
计算各个面的法向量:
- _! b9 G0 ?3 |& G1 O) ^7 {, g 10.png
* ]% l9 h5 e) K9 a& k
化简并去除方向相反的:
18.jpg ; |! _9 F) w6 Y& C0 I

2 w" C9 c) S8 X6 ?5 t; A9 |得到方程左侧表达式: 19.jpg 7 ~7 ~8 s4 p7 ~4 G5 N$ b
为了计算方便,取近似值:
! D5 F3 H! ~( Y$ V. D! M. k 20.jpg
  W( n6 A4 ]3 a. C1 C, r0 Z: N. ~# l
绘制正二十面体的曲面方程:
21.jpg
9 A7 f/ G9 a0 _* ~
绘制正二十面体的曲面方程:
22.jpg
7 A6 U2 o' u' P! }9 X8 q: n
复合多面体
从上面的计算可以看到,根据猜测做的推论基本上是对的:确实据此得到了各种正多面体的渐近方程并成功绘制了出来。但同时也可以看到,这种方法有很多局限性。首先,所生成的多面体必须有平行的相对的面,这样采用的法向量才能一个顶俩,发挥应有的作用得到对应的多面体。五种正多面体里,只有四种满足这个条件,还剩下一个正四面体不能用这种方法表示。其次,用这种方法只能表示凸多面体,所谓凸多面体,就是内部任意两点的连线仍然落在内部的多面体。这两个问题都是可以解决的,解决方法是引入指数函数。/ L; |, x0 p1 O* p8 Y
正四面体
$ `0 R4 `7 S# ?
计算正四面体的法向量:
/ {) T4 `' Z4 ? 11.png
化简:
12.png 如果用之前的高次方程的方法,那么只能得到一个朝向比较特别的正八面体,因为每个法向量都生成了两个平面: 13.png
/ x/ L& G$ `& D( _$ O( P/ Z0 n 23.jpg : @( I% K; V, m1 ~  r7 Y
而改用指数,则可得到如下表达式:
0 a+ t* d' `, `  D 14.png
6 O" S' g2 r( U$ S7 T4 L- a以此作为隐函数果然可以画出正四面体:3 D7 B6 w7 z/ X" c. x7 Q. ?# u/ _/ Q
24.jpg
' [/ A9 j( H" U; _' R
为什么这样可行?我也只能给个近似的猜测:对 E^(a x + by + c z)==C 这样的方程,两边取对数就是 a x+ b y+ c z==log C 这就是一个平面的方程,把几个这样的平面方程加起来,就"围成"了一个多面体。而指数的增长保证了每个方向上不会受其它项的影响,保持大体是个平面。
. T7 t  `5 `2 f3 V5 i7 z
另外还值得指出的是,可以在指数上再加次数,让这样生成的多面体的边缘更加"锐利":
2 ?# Q5 u) i6 U! F3 y5 C
25.jpg
5 d, C9 [, |5 O. d3 W
星形八面体
在各种各样的多面体中,有一类多面体可以看作是若干基本的多面体彼此叠合组成,我们称之为复合多面体。比如下图所示的星形八面体,就可以看作两个正四面体彼此叠合而成。( s0 S$ L! O' u& J
26.jpg 0 R% U9 @5 j/ Y" ^) B, E( w
观察这个复合多面体的面的组成指标可以发现,前四组只包含顶点 2、4、5、8,后四组只包含顶点 1、3、6、7。这恰好是各自组成两个正四面体。我们可以照样算出这八个面的法向量,然后分组各自生成两个正四面体曲面:" g) J1 ?& ]/ P2 ^# a. ~
15.png
6 M% [# O6 q& D2 E3 p! L求法向量,化简并分组:
* j+ Q% _( Q' O. S5 q7 u) ^4 o 16.png
. H( Z/ t! W* ^9 I1 j* E& G# e* ~  {得到两个指数和的表达式:
; G) D: g( o6 } 17.png
+ `1 R9 D/ n( g+ d; H分别绘制可以看到两个正四面体:
4 x3 i! z. I! U& N$ ^0 w: t 27.jpg
4 @" C/ S3 g. q( B" [; b* V如何从这两个四面体得到想要的星形八面体呢?直接相加肯定是不行的,那样得到的就是正八面体了。这里我们采用 The Nature of Mathematics and the Mathematics of Nature 一书中提到的一个小技巧:把两个方程表达式再次放到指数上。这个技巧称为 Exponential Scale:
+ Y+ w6 n! k  w" {/ D 18.png . q1 U' u8 ~* \3 I7 G
可以看到,这个方程确实可以绘制出星形八面体:
* G& P+ l1 D- ^+ E' q$ A1 X 28.jpg
( h, V9 p! g' i# w& s# g8 |可以把旋转观察这个星形八面体曲面的过程输出为动画:! y9 A  a1 h% `4 a8 G. N7 |7 u
19.png
3 x/ s/ X/ e- Y* {3 p1 U 20.png
3 Y4 ?5 i# o0 g5 L5 s) W 微信图片_20200324153944.gif , O5 D' R5 w' |) m2 N7 v+ o
五复合正四面体

2 o, U$ a- T6 Z  I1 R, y! K
我们可以再举一个例子,五复合正四面体,这是由五个正四面体内接于一个正十二面体形成的复合多面体:
29.jpg " }! `; D5 J. v4 W( U( J1 h9 B
照例求面法向量,化简并分组:
30.jpg 3 v/ y! T1 ^8 S  a, o
3 b3 T% x( G; W7 G/ [! q
得到方程:. @9 T3 U/ b" U9 f7 O
31.jpg 6 G. |. w, {: v, |7 u* B
绘制可以得到五复合正四面体的近似曲面(警告:由于项数太多,运行绘制速度很慢,运行时请耐心等待):
32.jpg " Q3 G; r+ u8 J" L
  r& o  g  V: o) V" {
我们也用它生成一个旋转观察的动图:
33.jpg
- B3 p6 R1 r, L& D  F' ^6 V& `' ]+ b2 t- ^
微信图片_20200324154410.gif " R% r0 A4 {8 @: A
更多的复合多面体
& J9 I+ b+ T( S* P/ h/ ^
只要是由凸多面体组成的复合多面体,理论上都可以用上面的方法,先求得各个多面体的方程,然后“抬升”到指数位置,得到复合多面体的方程。Mathematica 提供的PolyhedronData 函数里有许多复合多面体,我全部列在下面,感兴趣的读者可以自己实验生成想要的复合多面体曲面。
/ p* @& \  ~! N 21.png
$ q! n! ^* i  _* ?0 X, e, _& x 34.jpg
2 U3 Y2 B! \; D! Z对此有兴趣的,欢迎联系我们共同探讨。, W/ A" @* j3 g7 C0 \0 K$ s! L
market@asdoptics.com 9 O) \( Z* U" @! i' l" @
www.asdoptics.com / T4 z' k; E" a- R) B# M$ z4 w, b
+ h" q+ b' {& t! Y1 k

12.jpg (7.97 KB, 下载次数: 393)

12.jpg


作者: 宏心    时间: 2020-5-14 13:27
变幻无穷,无穷
# J# k! g9 q! x6 [




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5