Mandelbrot集不是哪一集!!啊不对……
Mandelbrot集是哪一集!!好像也不对……
Mandelbrot集是数集!!所以……他不是一集而是数集??……
所以这个M...dem...集到底是什么啊??
Mandelbrot集\(\mathbb{M}\)(简称曼集)是一个由二元复数构成的集合,也就是一个复数集:
\[
\mathbb{M}\subset\mathbb{C}
\]
也就是说,曼集的元素都是复数,也就是如下的形式:
\[
\forall m\in \mathbb{M},m=a+b\mathrm{i},\left(a,b\in \mathbb{R}\right)
\]
本华·曼德勃罗特(Benoit B.Mandelbrot)是分形学(Fractals) 的鼻祖,是的,Fractals这个词就是他提出的。
不过,这个集合本身并不是他本人提出的,而是一个叫做阿德里安·杜阿迪的法国数学家提出的,至于为什么以曼德勃罗特命名,根据wiki的说法是提出者为了向曼德勃罗特致敬而放弃用自己的名字命名。
一个复数\(z\)在或不在曼集中,取决于如下数列是否收敛:
\[
\zeta:z,f(z;c),f(f(z;c);c),\cdots,f\circ^n(z;c) \tag{1}
\]
\[
z,c\in\mathbb{C}
\]
其中,\(f(z;c)=z^2+c\),\(c\)是一个复参数。
如果把\(f\circ^n(z;c)\)展开写的话就是:
\[
\begin{split}
\zeta_n&=f\circ^n(z;c)=z_n^2+nc \z_n&=z_{n-1}^2+c
\end{split}
\tag{2}
\]
由于在其中迭代的前一个\(z\)都是以平方的形式出现,这也就意味着
\[
\left|\Re\left(z_n\right)\right|\ge\left|\Re\left(z_{n-1}\right)\right|\ge 0 \\left|\Im\left(z_n\right)\right|\ge\left|\Im\left(z_{n-1}\right)\right|\ge 0
\]
这样一来,若\(z_n\)收敛,则\(z_m(m<n)\)必然收敛。
综上描述,有下结论:
\[
z\in\mathbb{M} \Leftrightarrow \lim_{n\rightarrow\infty}\zeta_n\in\mathbb{R} \tag{3}
\]
式3即曼集判定的充要条件或定义。
为了让问题变得简单,这里可以令初始值\(z=0\),这样式2变成了仅与参数\(c\)相关的形式:
\[
\begin{split}
z_0 &=0 \z_1 &=c \z_2 &= z_1^2+c = c^2+c \z_3 &= z_2^2+c = c^4+2c^3+c^2+c \&\cdots \\end{split}
\]
这个……是的,这些东西听起来很不直观,以至于我也花了好久看了大量资料才搞清楚是什么意思。
但是,这件事本身的中心思想并不复杂,其无非做了这样的一件事情:
不必沮丧,我们甚至没打算去推导出\(z_n\)的完整展开形式,而且,计算机也无法处理需要运行无数次才能解决的问题(停机问题)。
但是,在有限的,可预见的次数(迭代数)内,进行这样的判定还是可行的并且能得出结果的。
说的对,因为只要迭代数\(n\)有限,\(z_n\)是总能求出确定值。但正因为如此,迭代数的增长才会产生实际的意义。这就好像,没有人能求出\(\pi\)的所有小数位数,但是每当有人多求出正确的一位的时候,其结果与实际值就总会更加接近。也就是说,只要范围有限,我们求得的曼集就总比实际的曼集大,但随着次数的增多,结果集合会向曼集逐渐地靠近。
所幸,在有限的次数内,我们尽管不能立即断言哪些数一定属于曼集,但我们能断言哪些数一定不属于曼集,那正是:
还没上高速公路就要起飞的,那必然是要玩完的
在有限次计算就体现出明显的发散趋势的时候,那基本也就抢救无效了
根据迭代函数的定义,\(f(z;c)=z^2+c\),我们对函数的范数(也就是模,或者称为复数的绝对值)进行考察,至少如果\(f\)收敛,其模与带入z的模至少是相等的(当然,原则上幅角也应当相等),:
\[
|f(z;c)|=\left|z^2+c\right|=|z| \|z|^2-|c|=|z^2|-|c|\le|f(z;c)|=|z|\le|z^2|+|c|=|z|^2+|c| \|z|\ge0
\]
根据绝对值三角不等式(这个对复数域同样成立,实际上就是向量绝对值三角不等式的移植),若\(|z|=0\)则\(|c|\)必然为\(0\),否则
\[
1-|c|\le|z|\le1+|c|
\]
由于迭代初始条件\(z_0=0\),因此经过n次迭代后的\(z\)一定是
\[
z_n=\sum_{m=0}^{(n-2)^2}{k_mc^{m}} \c\le|z_n|\le\sum_{m=0}^{(n-2)^2}{|k_m||c^{m}|}
\]
上面的不等数右侧产生了一个很熟悉的形式——幂级数,如果要幂级数\(\sum_{m=0}^{(n-2)^2}{|k_m||c^{m}|}\)收敛,则\(|c|<1\)是必要条件(由于\(k_m\)的大小这里没有多加考虑,即使\(|c|<1\)满足,同样有发散的可能,这个可以在后续的迭代过程中会进一步的),否则根据幂级数的性质级数必然发散,这样得到了一个必要阈值:\(|c_\Theta|=1\),将这个阈值带入,我们就能得到\(|z|\)的基础发散判定值:
\[
|z|\ge2\Rightarrow \lim_{n\rightarrow\infty}{\zeta_n}=\infty
\]
在后面的程序中,我们将使用这个值作为发散判定,意思就是说,如果算出\(|z|\ge 2\)了,那就不用考虑了,你不可能收敛的,至于剩下的值,我只假设但不断言它一定在集合内,因此我暂且将它认为是集合内的,如果经过更多的计算发现也达到这个红线条件了,那么同样不论这个值挣扎了多久,OUT!
但是,复数的收敛并不限于模收敛,当复数被整理为辐角形式\(r\angle\theta\)时,若\(\theta\)没有稳定值即便\(r\)已经收敛仍然不能断言复数收敛(毕竟啊,那个复平面上的向量如果一直在原地打转,分量就总在以一个有界值变化,宛如论证的丧钟在转动),但是对于这个函数而言根本不会不存在这种情形!
其实很容易,找到这样的向量,利用迭代函数平方相加后保持模不变即可,所幸的是,这样的值非常有限,因为首先一个条件就将范围急剧缩减:
\[
|c|=1
\]
是的,只有\(|c|=1\)的时候,平方计算后才可能保证模不变(依据辐角计算法若\(z=r_z\angle\theta\),则\(z^2=r_z^2\angle{2\theta}\)),当然我是指仅一次,因为还另外需要一件事保证\(z^2+c=c^2+c\)后的模长也是\(|c|\)或者说是\(1\):
\[
\cos{<c^2,c>}=-\frac{1}{2}
\]
也就是说\(\arg{z^2}-\arg{c}=\frac{2k\pi}{3}\)才可以(这个式子写的不是很严谨,但你当成是两个夹角为\(120^\circ\)就好),当然你会反驳:
\(c\)是随意取得,也就是说幅角就可以是任意值,当然,\(z^2\)的取值决定于\(c\),也就是\(z^2\)可以和\(c\)构造连续的函数映射,那么你根本保证不了\(z^2\)一定能够避开这些值啊你个代数白痴!!
啊是的,但是你很快就会意识到一个事实:
这个丧钟,转不久的!!
什么??
确实,当满足上述两个条件之后,得到的\(z_+\)的结果模仍然是\(1\),只是转了个角度,但是架不住这个函数是迭代的啊,这次得到的\(z_+\)很明显位于这\(z^2\)和\(c\)的角平分线处……
然后,夹角条件被打破了!!
就像雪崩一样,这个微妙的平衡很快就被打破了,并且马上开始急剧的发散(或收敛)。
如丸走坂
原文:https://www.cnblogs.com/oberon-zjt0806/p/10835741.html