分形/复平面迭代/抛物线
"大多数用于计算 Julia 集的程序在底层动力学为双曲线时工作良好,但在抛物线情况下会遇到指数级减速。" (Mark Braverman)[1]
换句话说,这意味着使用标准/朴素算法可能需要几天时间才能制作出抛物线 Julia 集的优质图像。
这里有两个问题
- 缓慢(= 懒惰)的局部动力学(在抛物线不动点附近)
- 某些部分非常薄(使用标准平面扫描很难找到)
动态平面 = 复 z 平面
- Julia 集 是一个公共边界:
- Fatou 集
另请参阅
- 填充的Julia集[3]
- 抛物线棋盘或棋盘
- 抛物线内爆
- Fatou 坐标
- 夏威夷耳环
- 维基百科中 = “由一系列圆形组成,所有圆形在同一处相切,且半径序列收敛为零。”(MathWorld 的 Margherita Barile)[4]
- commons:Category:Hawaiian earrings
- Gevrey 渐近展开
- (7.1) 在原点的 Écalle-Voronin 不变量具有 Gevrey- 1/2 渐近展开[5]
- 胚芽[6][7][8]
- 函数的胚芽:函数的泰勒展开
- 重数[9]
- Julia-Lavaurs 集
- Leau-Fatou 花定理:[10] 排斥或吸引花。花由花瓣组成
- Leau-Fatou 花
- 抛物线线性化定理
- 喇叭映射
- Blaschke 积
- Inou 和 Shishikura 的近抛物线重整化
- 复多项式向量场[11]
- 数字
- “一个正整数 ν,即 **抛物线退化**,具有以下性质:存在 νq 个吸引花瓣和 νq 个排斥花瓣,它们围绕不动点交替循环。”[12]
- 组合旋转数
- 函数 f 在抛物线不动点处的庞加莱线性化器[13]
- “抛物线铅笔。这是一个圆族,它们都有一个共同点,因此彼此相切,内部或外部。”[14]
Leau-Fatou 花定理指出,如果函数 具有泰勒展开[15]
则复数 在单位圆上 描述单位向量(方向)
- 如果 ,则 f 在原点处的排斥向量(从原点到 v)
- 如果 ,则吸引向量(从 v 到原点)
存在 n 个等距的吸引方向,由 n 个等距的排斥方向隔开。整数 n+1 称为不动点的重数
函数展开:z+z^5
/* Maxima CAS */ display2d:false; taylor(z+z^5, z,0,5); z + z^5
所以
- a = 1
- n = 4
计算吸引方向
/* Maxima CAS */ solve (4*v^4 = 1, v); [v = %i/sqrt(2),v = -1/sqrt(2),v = -%i/sqrt(2),v = 1/sqrt(2)]
函数 m*z+z^2
(%i7) taylor(m*z+z^2, z,0,5); (%o7) m*z+z^2
所以
- a = 1
- n = 1
(%i9) solve (v = 1, v); (%o9) [v = 1]
Ecalle 柱面[16] 或 Ecalle-Voronin 柱面(由 Jean Ecalle[17][18])[19]
“... 在将 z 和 f(z) 等同(如果 z 和 f(z) 都属于 P)的等价关系下,花瓣 P 的商。这个商流形称为 Ecalle 柱面,它与无限柱面 C/Z 构形同构。”[20]
-
手动打蛋器
-
以下是对抛物线情况下发生的真实模型
物理模型:使用打蛋器时蛋糕的行为。
数学模型:具有 2 个中心(二阶退化点)的二维向量场[21][22]
该场围绕中心旋转,但似乎没有发散。
也许对抛物线动力学的更好描述是夏威夷耳环
- z+z^2
- z+z^3
- z+z^{k+1}
- z+a_{k+1}z^{k+1}
- z+a_{k+1}z^{k+1}
- "胚芽 与
≠ 0 , 1 {\displaystyle \vert a_{1}\vert \neq 0,1} 通过全纯共轭到其线性部分 " (Sylvain Bonnot)[26]
向量场的胚芽
"喇叭映射 h = Φ ◦ Ψ,其中 Φ 是 Φattr 的简写,Ψ 是 Ψrep 的简写(扩展的 Fatou 坐标和参数化)。"[27]
定义
- 萼片是吸引花瓣和排斥花瓣的交点。抛物线 Pommerenke-Levin-Yoccoz 不等式。由 Xavier Buf 和 Adam L. Epstein 似乎没有萼片的正式定义。
- "设 l 是第一象限中的不变曲线,L1 是 l ∪ {0} 包围的区域,称为萼片。"[29]
- 包含抛物线不动点的边界上的分量的内部
-
Lea-Fatu 花
-
具有四个花瓣和中心为抛物线点的花
-
内部角为 1/5 的临界轨道,显示 5 个吸引方向
所有 花瓣 的总和形成一朵花[30],中心位于抛物线周期点。[31]
花椰菜或西兰花:[32]
- 空(其内部为空)对于 Mandelbrot 集之外的 c。Julia 集是完全不连通的。
- 对于 Mandelbrot 集边界上的 c=1/4,填充的花椰菜。Julia 集是 Jordan 曲线(准圆)。
-
c = 0 < 1/4
-
c = 0.25 = 1/4 是主心形的根。Julia 集是花椰菜。
-
c = 0.255 > 1/4 "内爆的花椰菜"
-
c = 0.258 > 1/4
-
c = [0.285, 0.01]
请注意
- 图像大小因 z 平面不同而异。
- 使用了不同的算法,因此颜色很难比较。
Julia 集如何沿着实轴变化(从 c=0 到 c=1/4,然后更远)
扰动函数 由复数
当添加一个大于0的ε(沿实轴向正无穷大移动)时,会出现一个抛物型不动点的分叉
- 吸引不动点 (ε<0)
- 一个抛物型不动点 (ε = 0)
- 一个抛物型不动点分裂成两个共轭排斥不动点 (ε > 0)
“如果我们用ε<0稍微扰动,那么抛物型不动点将在实轴上分裂成两个实不动点(一个吸引,一个排斥)。”
参见
- Wolf Jung 的 Mandel 程序中的演示 2,第 9 页
抛物线内爆
[edit | edit source]抛物型内爆
- 在参数平面中
- 点 c 从分量的内部,穿过边界,到曼德尔布罗特集的外部
- 核 (c=0),沿内部射线 0,抛物点 (c= 0.25),沿外部射线 0
- 在动力学平面中
- 连接的朱利亚集(有内部)内爆,并断开连接(没有内部)
- 不动点从内部移动到朱利亚集(抛物型)
- 一个盆地(内部)消失
参数 c | 位置 | 朱利亚集 | 内部 | 动力学类型 | 临界点 | 不动点 |
---|---|---|---|---|---|---|
c = 0 | 中心,内部 | 连接的 | 存在 | 超吸引 | 被吸引到 alfa 不动点 | 固定临界点等于 alfa 不动点,alfa 是超吸引的,beta 是排斥的 |
0<c<1/4 | 内部射线 0,内部 | 连接的 | 存在 | 吸引 | 被吸引到 alfa 不动点 | alfa 是吸引的,beta 是排斥的 |
c = 1/4 | 尖点,边界 | 连接的 | 存在 | 抛物型 | 被吸引到 alfa 不动点 | alfa 不动点等于 beta 不动点,两者都是抛物型的 |
c>1/4 | 外部射线 0,外部 | 断开连接的 | 消失 | - | 排斥到无穷大 | 两个有限不动点都是排斥的 |
YouTube 上的视频[33]
-
c=0
-
c=1/4
-
c= 1/4 + 0.05
-
c = 1/4 + 0.029
-
c = 1/4 + 0.035
向量场
[edit | edit source]- 二维向量场及其
奇点
[edit | edit source]奇点类型
“曲线扇区定义为由半径任意小的圆 C 和两个流线 S 和 S! 围成的区域,这两个流线都收敛到奇点。然后考虑通过开扇区 g 的流线,以区分三种可能的曲线扇区类型。”
动力学
[edit | edit source]动力学
- 全局
- 局部
局部动力学
- 在朱利亚集的外部
- 在朱利亚集上
- 靠近抛物型不动点(在朱利亚集内部)
另请参阅
靠近抛物型不动点
[edit | edit source]为什么分析 f^p 而不是 f?
f 靠近抛物型不动点的正向轨道是复合的。它由两种运动组成
- 围绕不动点
- 向不动点移动/远离不动点
如何计算抛物型 c 值
[edit | edit source]抛物型参数的类型
- 根点
- 尖点
n | 内部角(旋转数)t = 1/n | 根点 c = 抛物型参数 | 落在根点 c 上的参数射线的两个外部角(1/(2^n+1); 2/(2^n+1) | 不动点 | 落在不动点 |
---|---|---|---|---|---|
1 | 1/1 | 0.25 | (0/1 ; 1/1) | 0.5 | (0/1 = 1/1) |
2 | 1/2 | -0.75 | (1/3; 2/3) | -0.5 | (1/3; 2/3) |
3 | 1/3 | 0.64951905283833*%i-0.125 | (1/7; 2/7) | 0.43301270189222*%i-0.25 | (1/7; 2/7; 3/7) |
4 | 1/4 | 0.5*%i+0.25 | (1/15; 2/15) | 0.5*%i | (1/15; 2/15; 4/15; 8/15) |
5 | 1/5 | 0.32858194507446*%i+0.35676274578121 | (1/31; 2/31) | 0.47552825814758*%i+0.15450849718747 | (1/31; 2/31; 4/31; 8/31; 16/31) |
6 | 1/6 | 0.21650635094611*%i+0.375 | (1/63; 2/63) | 0.43301270189222*%i+0.25 | (1/63; 2/63; 4/63; 8/63; 16/63; 32/63) |
7 | 1/7 | 0.14718376318856*%i+0.36737513441845 | (1/127; 2/127) | 0.39091574123401*%i+0.31174490092937 | (1/127; 2/127, 4/127; 8/127; 16/127; 32/127, 64/127) |
8 | 1/8 | 0.10355339059327*%i+0.35355339059327 | 0.35355339059327*%i+0.35355339059327 | ||
9 | 1/9 | 0.075191866590218*%i+0.33961017714276 | 0.32139380484327*%i+0.38302222155949 | ||
10 | 1/10 | 0.056128497072448*%i+0.32725424859374 | 0.29389262614624*%i+0.40450849718747 |
对于内部角 n/p 抛物周期 p 循环,它包含一个具有 p 重数的 z 点[36] 和一个乘子 = 1.0。这个点 z 等于不动点
周期 1
[edit | edit source]可以轻松计算边界点 c
对于给定的内部角(旋转数)t,使用 Wolf Jung 编写的这段cpp 代码[37]
t *= (2*PI); // from turns to radians
cx = 0.5*cos(t) - 0.25*cos(2*t);
cy = 0.5*sin(t) - 0.25*sin(2*t);
或这段 Maxima CAS 代码
/* conformal map from circle to cardioid ( boundary of period 1 component of Mandelbrot set */ F(w):=w/2-w*w/4; /* circle D={w:abs(w)=1 } where w=l(t,r) t is angle in turns ; 1 turn = 360 degree = 2*Pi radians r is a radius */ ToCircle(t,r):=r*%e^(%i*t*2*%pi); GiveC(angle,radius):= ( [w], /* point of unit circle w:l(internalAngle,internalRadius); */ w:ToCircle(angle,radius), /* point of circle */ float(rectform(F(w))) /* point on boundary of period 1 component of Mandelbrot set */ )$ compile(all)$ /* ---------- global constants & var ---------------------------*/ Numerator: 1; DenominatorMax: 10; InternalRadius: 1; /* --------- main -------------- */ for Denominator:1 thru DenominatorMax step 1 do ( InternalAngle: Numerator/Denominator, c: GiveC(InternalAngle,InternalRadius), display(Denominator), display(c), /* compute fixed point */ alfa:float(rectform((1-sqrt(1-4*c))/2)), /* alfa fixed point */ display(alfa) )$
周期 2
[edit | edit source]// cpp code by W Jung http://www.mndynamics.com
t *= (2*PI); // from turns to radians
cx = 0.25*cos(t) - 1.0;
cy = 0.25*sin(t);
周期 1-6
[edit | edit source]/* batch file for Maxima CAS computing bifurcation points for period 1-6 Formulae for cycles in the Mandelbrot set II Stephenson, John; Ridgway, Douglas T. Physica A, Volume 190, Issue 1-2, p. 104-116. */ kill(all); remvalue(all); start:elapsed_run_time (); /* ------------ functions ----------------------*/ /* exponential for of complex number with angle in turns */ /* "exponential form prevents allroots from working", code by Robert P. Munafo */ GivePoint(Radius,t):=rectform(ev(Radius*%e^(%i*t*2*%pi), numer))$ /* gives point of unit circle for angle t in turns */ GiveCirclePoint(t):=rectform(ev(%e^(%i*t*2*%pi), numer))$ /* gives point of unit circle for angle t in turns Radius = 1 */ /* gives a list of iMax points of unit circle */ GiveCirclePoints(iMax):=block( [circle_angles,CirclePoints], CirclePoints:[], circle_angles:makelist(i/iMax,i,0,iMax), for t in circle_angles do CirclePoints:cons(GivePoint(1,t),CirclePoints), return(CirclePoints) /* multipliers */ )$ /* http://commons.wikimedia.org/wiki/File:Mandelbrot_set_Components.jpg Boundary equation b_n(c,P)=0 defines relations between hyperbolic components and unit circle for given period n , allows computation of exact coordinates of hyperbolic componenets. b_n(w,c), is boundary polynomial (implicit function of 2 variables). */ GiveBoundaryEq(P,n):= block( if n=1 then return(c + P^2 - P), if n=2 then return(- c + P - 1), if n=3 then return(c^3 + 2*c^2 - (P-1)*c + (P-1)^2), if n=4 then return(c^6 + 3*c^5 + (P+3)* c^4 + (P+3)* c^3 - (P+2)*(P-1)*c^2 - (P-1)^3), if n=5 then return(c^15 + 8*c^14 + 28*c^13 + (P + 60)*c^12 + (7*P + 94)*c^11 + (3*P^2 + 20*P + 116)*c^10 + (11*P^2 + 33*P + 114)*c^9 + (6*P^2 + 40*P + 94)*c^8 + (2*P^3 - 20*P^2 + 37*P + 69)*c^7 + (3*P - 11)*(3*P^2 - 3*P - 4)*c^6 + (P - 1)*(3*P^3 + 20*P^2 - 33*P - 26)*c^5 + (3*P^2 + 27*P + 14)*(P - 1)^2*c^4 - (6*P + 5)*(P - 1)^3*c^3 + (P + 2)*(P - 1)^4*c^2 - c*(P - 1)^5 + (P - 1)^6), if n=6 then return (c^27+ 13*c^26+ 78*c^25+ (293 - P)*c^24+ (792 - 10*P)*c^23+ (1672 - 41*P)*c^22+ (2892 - 84*P - 4*P^2)*c^21+ (4219 - 60*P - 30*P^2)*c^20+ (5313 + 155*P - 80*P^2)*c^19+ (5892 + 642*P - 57*P^2 + 4*P^3)*c^18+ (5843 + 1347*P + 195*P^2 + 22*P^3)*c^17+ (5258 + 2036*P + 734*P^2 + 22*P^3)*c^16+ (4346 + 2455*P + 1441*P^2 - 112*P^3 + 6*P^4)*c^15 + (3310 + 2522*P + 1941*P^2 - 441*P^3 + 20*P^4)*c^14 + (2331 + 2272*P + 1881*P^2 - 853*P^3 - 15*P^4)*c^13 + (1525 + 1842*P + 1344*P^2 - 1157*P^3 - 124*P^4 - 6*P^5)*c^12 + (927 + 1385*P + 570*P^2 - 1143*P^3 - 189*P^4 - 14*P^5)*c^11 + (536 + 923*P - 126*P^2 - 774*P^3 - 186*P^4 + 11*P^5)*c^10 + (298 + 834*P + 367*P^2 + 45*P^3 - 4*P^4 + 4*P^5)*(1-P)*c^9 + (155 + 445*P - 148*P^2 - 109*P^3 + 103*P^4 + 2*P^5)*(1-P)*c^8 + 2*(38 + 142*P - 37*P^2 - 62*P^3 + 17*P^4)*(1-P)^2*c^7 + (35 + 166*P + 18*P^2 - 75*P^3 - 4*P^4)*((1-P)^3)*c^6 + (17 + 94*P + 62*P^2 + 2*P^3)*((1-P)^4)*c^5 + (7 + 34*P + 8*P^2)*((1-P)^5)*c^4 + (3 + 10*P + P^2)*((1-P)^6)*c^3 + (1 + P)*((1-P)^7)*c^2 + -c*((1-P)^8) + (1-P)^9) )$ /* gives a list of points c on boundaries on all components for give period */ GiveBoundaryPoints(period,Circle_Points):=block( [Boundary,P,eq,roots], Boundary:[], for m in Circle_Points do (/* map from reference plane to parameter plane */ P:m/2^period, eq:GiveBoundaryEq(P,period), /* Boundary equation b_n(c,P)=0 */ roots:bfallroots(%i*eq), roots:map(rhs,roots), for root in roots do Boundary:cons(root,Boundary)), return(Boundary) )$ /* divide llist of roots to 3 sublists = 3 components */ /* ---- boundaries of period 3 components period:3$ Boundary3Left:[]$ Boundary3Up:[]$ Boundary3Down:[]$ Radius:1; for m in CirclePoints do ( P:m/2^period, eq:GiveBoundaryEq(P,period), roots:bfallroots(%i*eq), roots:map(rhs,roots), for root in roots do ( if realpart(root)<-1 then Boundary3Left:cons(root,Boundary3Left), if (realpart(root)>-1 and imagpart(root)>0.5) then Boundary3Up:cons(root,Boundary3Up), if (realpart(root)>-1 and imagpart(root)<0.5) then Boundary3Down:cons(root,Boundary3Down) ) )$ --------- */ /* gives a list of parabolic points for given: period and internal angle */ GiveParabolicPoints(period,t):=block ( [m,ParabolicPoints,P,eq,roots], m: GiveCirclePoint(t), /* root of unit circle, Radius=1, angle t=0 */ ParabolicPoints:[], /* map from reference plane to parameter plane */ P:m/2^period, eq:GiveBoundaryEq(P,period), /* Boundary equation b_n(c,P)=0 */ roots:bfallroots(%i*eq), roots:map(rhs,roots), for root in roots do ParabolicPoints:cons(float(root),ParabolicPoints), return(ParabolicPoints) )$ compile(all)$ /* ------------- constant values ----------------------*/ fpprec:16; /* ------------unit circle on a w-plane -----------------------------------------*/ a:GiveParabolicPoints(6,1/3); a$
/*
gcc c.c -lm -Wall
./a.out
Root point between period 1 component and period 987 component = c = 0.2500101310666710+0.0000000644946597
Internal angle (c) = 1/987
Internal radius (c) = 1.0000000000000000
*/
#include <stdio.h>
#include <math.h> // M_PI; needs -lm also
#include <complex.h>
/*
c functions using complex type numbers
computes c from component of Mandelbrot set */
complex double Give_c( int Period, int n, int d , double InternalRadius )
{
complex double c;
complex double w; // point of reference plane where image of the component is a unit disk
// alfa = ax +ay*i = (1-sqrt(d))/2 ; // result
double t; // InternalAngleInTurns
t = (double) n/d;
t = t * M_PI * 2.0; // from turns to radians
w = InternalRadius*cexp(I*t); // map to the unit disk
switch ( Period ) // of component
{
case 1: // main cardioid = only one period 1 component
c = w/2 - w*w/4; // https://wikibooks.cn/wiki/Fractals/Iterations_in_the_complex_plane/Mandelbrot_set/boundary#Solving_system_of_equation_for_period_1
break;
case 2: // only one period 2 component
c = (w-4)/4 ; // https://wikibooks.cn/wiki/Fractals/Iterations_in_the_complex_plane/Mandelbrot_set/boundary#Solving_system_of_equation_for_period_2
break;
// period > 2
default:
printf("higher periods : to do, use newton method \n");
printf("for each q = Period of the Child component there are 2^(q-1) roots \n");
c = 10000.0; // bad value
break; }
return c;
}
void PrintAndDescribe_c( int period, int n, int d , double InternalRadius ){
complex double c = Give_c(period, n, d, InternalRadius);
printf("Root point between period %d component and period %d component = c = %.16f%+.16f*I\t",period, d, creal(c), cimag(c));
printf("Internal angle (c) = %d/%d\n",n, d);
//printf("Internal radius (c) = %.16f\n",InternalRadius);
}
/*
https://stackoverflow.com/questions/19738919/gcd-function-for-c
The GCD function uses Euclid's Algorithm.
It computes A mod B, then swaps A and B with an XOR swap.
*/
int gcd(int a, int b)
{
int temp;
while (b != 0)
{
temp = a % b;
a = b;
b = temp;
}
return a;
}
int main (){
int period = 1;
double InternalRadius = 1.0;
// internal angle in turns as a ratio = p/q
int n = 1;
int d = 987;
// n/d = local angle in turns
for (n = 1; n < d; ++n ){
if (gcd(n,d)==1 )// irreducible fraction
{ PrintAndDescribe_c(period, n,d,InternalRadius); }
}
return 0;
}
-
检查迭代次数
-
修改后的 DEM
-
检查角度
-
检查 zn 是否在目标集内
-
检查 zn 是否在三角形目标集内
填充朱利亚集内部的所有点都趋向于一个周期轨道(或不动点)。此点位于朱利亚集中,并且是弱吸引的。[38] 您可以分析抛物线不动点附近的行为。可以使用 临界轨道 来完成此操作。
这里有两种情况:简单和困难。
如果抛物线不动点附近的朱利亚集类似于 n 臂星形(未扭曲),则您可以简单地检查 zn 相对于不动点的幅角。例如,请参见 z+z^5。这是一个简单的例子。
在困难的情况下,朱利亚集围绕不动点扭曲。
根点的朱利亚集在拓扑上与子周期中心的朱利亚集相同,但
- 中心(核)朱利亚集非常容易绘制(超吸引盆 = 非常快的动态,因为临界点也是周期点)
- 而根朱利亚集(抛物线)很难绘制(抛物线盆和懒惰动态)
示例
- t = 1/2
- 根点的朱利亚集 = 胖巴塞利卡朱利亚集:c = -3/4 = - 0.75
- 周期 2 中心的朱利亚集 = (细长)巴塞利卡朱利亚集:c = -1
- t = 1/3
描述
步骤
- 选择函数 ,其在原点(z=0)处有一个固定抛物线点
- 选择内部角度
- 计算 ,它是函数 的较高迭代次数的近似值,z 接近于零,使用以零为中心的幂级数(泰勒级数 = 麦克劳林级数)
- 实验性地找出使用幂级数的项数以及使用特定 的环带
每个 将被用于一个环带
其中 K 为固定值
具有在原点处具有乘子 的无差异不动点的复二次多项式的 Lambda 形式[41]
其中
- 定点的乘数
- 内角是一个有理数和真分数
选择
- 因此
- 幂级数的30项
- 环k=4,5,...,10的近似函数,对于z的较大值(在环外),使用默认函数f^n
- 函数的delta等于10^-5
(* code by Professor: Mark McClure from https://marksmath.org/classes/Spring2019ComplexDynamics/ *)
n = 7;
f[z_] = Exp[2 Pi*I/n] z + z^2;
Remove[F];
F[0][z_] = N[Normal[Series[f[z], {z, 0, 30}]]];
Do[F[0][z_] = Chop[N[Normal[Series[F[0][f[z]], {z, 0, 30}]]], 10^-5], {n - 1}];
Do[F[k][z_] = Chop[N[Normal[Series[F[k - 1][F[k - 1][z]], {z, 0, 30}]]], 10^-5], {k, 1, 10}]
(* define and compile function FF *)
FF = With[{
n = n,
f4 = Function[z, Evaluate[F[4][z]]],
f5 = Function[z, Evaluate[F[5][z]]],
f6 = Function[z, Evaluate[F[6][z]]],
f7 = Function[z, Evaluate[F[7][z]]],
f8 = Function[z, Evaluate[F[8][z]]],
f9 = Function[z, Evaluate[F[9][z]]],
f10 = Function[z, Evaluate[F[10][z]]]
},
Compile[{{z, _Complex}},
Which[
Abs[z] > 1/2^3,
Nest[Function[zz, N[Exp[2 Pi*I/n]] zz + zz^2], z, n],
Abs[z] <= 1/2^9, f10[z],
Abs[z] <= 1/2^8, f9[z],
Abs[z] <= 1/2^7, f8[z],
Abs[z] <= 1/2^6, f7[z],
Abs[z] <= 1/2^5, f6[z],
Abs[z] <= 1/2^4, f5[z],
Abs[z] <= 1/2^3, f4[z],
True, 0]]];
(* iterate 1000 times and then see what happens *)
iterate = With[{FF = FF, n = n},
Compile[{{z0, _Complex}},
Module[{z, i},
z = z0;
i = 0;
While[1/2^9 < Abs[z] <= 2 && i++ < 1000 n,
z = FF[z]];
z],
RuntimeOptions -> "Speed", CompilationTarget -> "C"]];
(* now compute some iteration data *)
data = Monitor[
Table[iterate[x + I*y], {y, Im[center] + 1.2, Im[center], -0.0025},
{x, Re[center] - 1.2, Re[center] + 1.2, 0.0025}],
y];
(* use some symmetry to cut computation time in half *)
center = First[Select[z /. NSolve[f[z] == 0, z], Im[#] < 0 &]]/2 (* center = -0.311745 - 0.390916*I *)
data = Join[data, Reverse[Rest[Reverse /@ data]]];
(* plot it *)
kernel = {
{1, 1, 1},
{1, -8, 1},
{1, 1, 1}
};
(*
classifyArg = Compile[
{{z, _Complex}, {z0, _Complex}, {v, _Complex}, {n, _Integer}},
Module[{check, check2},
check = n (Arg[(z0 - z)/v] + Pi)/(2 Pi);
check2 = Ceiling[check];
If[check == check2, 0, check2]]];
classified = Map[classify, data, {2}];
convolvedData = ListConvolve[kernel, classified];
ArrayPlot[Sign[Abs[convolvedData]]]
Wolfram 语言的数学函数(
- Series[f,{x,x0,n}] 生成关于点的f的幂级数展开,阶数为,其中n是一个明确的整数
- N[expr] 给出expr的数值
- Chop[expr,delta] 将绝对值小于delta的数字替换为0
- Normal[expr] 将expr从各种特殊形式转换为正常表达式。
- Do[expr,n] 评估expr n次
- Do[expr,{i,imin,imax}] 评估expr,从i=imin开始
- With[{x=x0,y=y0,…},expr] 指定expr中所有x、y等的出现应该被替换为x0、y0等。
- Compile[{{x1,t1},…},expr] 假设xi的类型与ti匹配。
- Which[test1,value1,test2,value2,…] 依次评估每个testi,返回第一个产生True的valuei的值
- Nest[f,expr,n] 给出对expr应用n次f的表达式。
动态射线
[edit | edit source]可以使用落在抛物线不动点的周期性动态射线来寻找外部的狭窄部分。
让我们检查外部半径=4的周期性射线上的点需要多少次反向迭代才能到达距离抛物线不动点0.003的位置
周期 | 反向迭代 | 时间 |
---|---|---|
1 | 340 | 0m0.021s |
2 | 55 573 | 0m5.517s |
3 | 8 084 815 | 13m13.800s |
4 | 1 059 839 105 | 1724m28.990s |
C源代码 - 点击右侧查看 |
---|
a.c |
/*
c console program
to compile:
gcc double_t.c -lm -Wall -march=native
to run:
time ./a.out
period EscapeTime time
1 340 0m0.021s
2 55 573 0m5.517s
3 8 084 815 13m13.800s
4 1 059 839 105 1724m28.990s
period 1
escape time = 340.000000
internal angle t = 1.000000
period = 1
preperiod = 0
cx = 0.250000
cy = 0.000000
alfax = 0.500000
alfay = 0.000000
real 0m0.021s
===============
escape time = 55573.000000
internal angle t = 0.500000
period = 2
preperiod = 0
cx = -0.750000
cy = 0.000000
alfax = -0.500000
alfay = 0.000000
real 0m5.517s
===============================
period = 3 c = (-0.125000; 0.649519); alfa = (-0.250000;0.433013)
ea = 0.142857;
internal angle t = 0.333333
preperiod = 0
for period = 3 escape time = 8084815
real 13m13.800s
=====================================
period = 4 c = (0.250000; 0.500000); alfa = (0.000000;0.500000)
ea = 0.066667;
internal angle t = 0.250000
preperiod = 0
for period = 4 escape time = 1059839105
real 1724m28.990s
*/
#include <stdio.h>
#include <stdlib.h> // malloc
#include <math.h> // M_PI; needs -lm also
#include <complex.h>
unsigned int period = 4;// of child component of Mandelbrot set
unsigned int numerator=1 ;
unsigned int denominator;
double t ; // internal angle of point c of parent component of Mandelbrot set in turns
unsigned long int maxiter = 100000;
unsigned int preperiod = 0; //of external angle under doubling map
double complex z , c, alfa;
double ea ;// External Angle
/* find c in component of Mandelbrot set
uses complex type so #include <complex.h> and -lm
uses code by Wolf Jung from program Mandel
see function mndlbrot::bifurcate from mandelbrot.cpp
http://www.mndynamics.com/indexp.html
*/
double complex GiveC(double InternalAngleInTurns, double InternalRadius, unsigned int period)
{
//0 <= InternalRay<= 1
//0 <= InternalAngleInTurns <=1
// period of parent component of Mandelbrot set { 1,2 }
double t = InternalAngleInTurns *2*M_PI; // from turns to radians
double R2 = InternalRadius * InternalRadius;
double Cx, Cy; /* C = Cx+Cy*i */
switch ( period ) {
case 1: // main cardioid
Cx = (cos(t)*InternalRadius)/2-(cos(2*t)*R2)/4;
Cy = (sin(t)*InternalRadius)/2-(sin(2*t)*R2)/4;
break;
case 2: // only one component
Cx = InternalRadius * 0.25*cos(t) - 1.0;
Cy = InternalRadius * 0.25*sin(t);
break;
// for each period there are 2^(period-1) roots.
default: // safe values
Cx = 0.0;
Cy = 0.0;
break; }
return Cx+ Cy*I;
}
/*
http://en.wikipedia.org/wiki/Periodic_points_of_complex_quadratic_mappings
z^2 + c = z
z^2 - z + c = 0
ax^2 +bx + c =0 // ge3neral for of quadratic equation
so:
a=1
b =-1
c = c
so:
The discriminant is the d=b^2-4ac
d=1-4c = dx+dy*i
r(d)=sqrt(dx^2 + dy^2)
sqrt(d) = sqrt((r+dx)/2)+-sqrt((r-dx)/2)*i = sx +- sy*i
x1=(1+sqrt(d))/2 = beta = (1+sx+sy*i)/2
x2=(1-sqrt(d))/2 = alfa = (1-sx -sy*i)/2
alfa: attracting when c is in main cardioid of Mandelbrot set, then it is in interior of Filled-in Julia set, it means belongs to Fatou set (strictly to basin of attraction of finite fixed point)
*/
// uses global variables:
// ax, ay (output = alfa(c))
double complex GiveAlfaFixedPoint(double complex c)
{
double dx, dy; //The discriminant is the d=b^2- 4ac = dx+dy*i
double r; // r(d)=sqrt(dx^2 + dy^2)
double sx, sy; // s = sqrt(d) = sqrt((r+dx)/2)+-sqrt((r-dx)/2)*i = sx + sy*i
double ax, ay;
// d=1-4c = dx+dy*i
dx = 1 - 4*creal(c);
dy = -4 * cimag(c);
// r(d)=sqrt(dx^2 + dy^2)
r = sqrt(dx*dx + dy*dy);
//sqrt(d) = s =sx +sy*i
sx = sqrt((r+dx)/2);
sy = sqrt((r-dx)/2);
// alfa = ax +ay*i = (1-sqrt(d))/2 = (1-sx + sy*i)/2
ax = 0.5 - sx/2.0;
ay = sy/2.0;
return ax+ay*I;
}
double DistanceBetween(double complex z1, double complex z2)
{double dx,dy;
dx = creal(z1) - creal(z2);
dy = cimag(z1) - cimag(z2);
return sqrt(dx*dx+dy*dy);
}
/*
principal square root of complex number
http://en.wikipedia.org/wiki/Square_root
z1= I;
z2 = root(z1);
printf("zx = %f \n", creal(z2));
printf("zy = %f \n", cimag(z2));
*/
double complex root(double complex z)
{
double x = creal(z);
double y = cimag(z);
double u;
double v;
double r = sqrt(x*x + y*y);
v = sqrt(0.5*(r - x));
if (y < 0) v = -v;
u = sqrt(0.5*(r + x));
return u + v*I;
}
double complex preimage(double complex z1, double complex z2, double complex c)
{
double complex zPrev;
zPrev = root(creal(z1) - creal(c) + (cimag(z1) - cimag(c))*I);
// choose one of 2 roots
if (creal(zPrev)*creal(z2) + cimag(zPrev)*cimag(z2) > 0)
return zPrev ; // u+v*i
else return -zPrev; // -u-v*i
}
// This function only works for periodic or preperiodic angles.
// You must determine the period n and the preperiod k before calling this function.
// based on same function from src code of program Mandel by Wolf Jung
// http://www.mndynamics.com/indexp.html
double backray(double t, // external angle in turns
int n, //period of ray's angle under doubling map
int k, // preperiod
int iterMax,
double complex c
)
{
double xend ; // re of the endpoint of the ray
double yend; // im of the endpoint of the ray
const double R = 4; // very big radius = near infinity
int j; // number of ray
double iter=0.0; // index of backward iteration
double complex zPrev;
double u,v; // zPrev = u+v*I
double complex zNext;
double distance;
/* dynamic 1D arrays for coordinates (x, y) of points with the same R on preperiodic and periodic rays */
double *RayXs, *RayYs;
int iLength = n+k+2; // length of arrays ?? why +2
// creates arrays: RayXs and RayYs and checks if it was done
RayXs = malloc( iLength * sizeof(double) );
RayYs = malloc( iLength * sizeof(double) );
if (RayXs == NULL || RayYs==NULL)
{
fprintf(stderr,"Could not allocate memory");
getchar();
return 1;
}
// starting points on preperiodic and periodic rays
// with angles t, 2t, 4t... and the same radius R
for (j = 0; j < n + k; j++)
{ // z= R*exp(2*Pi*t)
RayXs[j] = R*cos((2*M_PI)*t);
RayYs[j] = R*sin((2*M_PI)*t);
t *= 2; // t = 2*t
if (t > 1) t--; // t = t modulo 1
}
zNext = RayXs[0] + RayYs[0] *I;
//printf("RayXs[0] = %f \n", RayXs[0]);
//printf("RayYs[0] = %f \n", RayYs[0]);
// z[k] is n-periodic. So it can be defined here explicitly as well.
RayXs[n+k] = RayXs[k];
RayYs[n+k] = RayYs[k];
// backward iteration of each point z
do
{
for (j = 0; j < n+k; j++) // period +preperiod
{ // u+v*i = sqrt(z-c) backward iteration in fc plane
zPrev = root(RayXs[j+1] - creal(c)+(RayYs[j+1] - cimag(c))*I); // , u, v
u=creal(zPrev);
v=cimag(zPrev);
// choose one of 2 roots: u+v*i or -u-v*i
if (u*RayXs[j] + v*RayYs[j] > 0)
{ RayXs[j] = u; RayYs[j] = v; } // u+v*i
else { RayXs[j] = -u; RayYs[j] = -v; } // -u-v*i
} // for j ...
//RayYs[n+k] cannot be constructed as a preimage of RayYs[n+k+1]
RayXs[n+k] = RayXs[k];
RayYs[n+k] = RayYs[k];
// convert to pixel coordinates
// if z is in window then draw a line from (I,K) to (u,v) = part of ray
// printf("for iter = %d cabs(z) = %f \n", iter, cabs(RayXs[0] + RayYs[0]*I));
iter += 1.0;
distance = DistanceBetween(RayXs[j]+RayYs[j]*I, alfa);
printf("distance = %10.9f ; iter = %10.0f \n", distance, iter); // info
}
while (distance>0.003);// distance < pixel size
// last point of a ray 0
xend = RayXs[0];
yend = RayYs[0];
// free memmory
free(RayXs);
free(RayYs);
return iter; //
}
/* ---------------------- main ------------------*/
int main()
{
double EscapeTime;
// internal angle
denominator = period;
t = (double) numerator/denominator;
//
c = GiveC(t, 1.0, 1);
alfa = GiveAlfaFixedPoint(c);
//external angle
denominator= pow(2,period) - 1;
ea = (double) 1.0/ denominator;
//
EscapeTime = backray(ea, period, preperiod, maxiter, c);
//
printf("period = %d ", period);
printf(" c = (%f; %f);", creal(c), cimag(c));
printf(" alfa = (%f;%f)\n", creal(alfa), cimag(alfa));
printf("ea = %f;\n", ea);
printf("internal angle t = %f \n", t);
printf("preperiod = %d \n", preperiod);
printf("for period = %d escape time = %10.0f \n", period, EscapeTime);
//
return 0;
}
|
可以使用外部射线的点z的幅角及其到alfa不动点的距离(参见图像中的代码)。它适用于周期数不超过15(也许更多……)。
从内部估计
[edit | edit source]朱利亚集是填充的朱利亚集Kc的边界。
- 找到Kc内部的点
- 使用边缘检测找到Kc内部的边界
如果内部的组件彼此非常接近,则使用以下方法找到组件:[42]
color = LastIteration % period
对于父组件和子组件之间的抛物线组件:[43]
periodOfChild = denominator*periodOfParent color = iLastIteration % periodOfChild
其中分母是曼德勃罗集的父组件的内角的分母。
角度
[edit | edit source]"如果zn的迭代趋于一个固定的抛物点,那么初始种子z0根据zn−z0的幅角进行分类,分类由花定理提供"(Mark McClure[44])
吸引时间
[edit | edit source]填充的朱利亚集的内部由组件组成。所有组件都是前周期的,其中一些是周期的(吸引力的直接盆地)。
换句话说
- 一次迭代将z移动到另一个组件(以及整个组件移动到另一个组件)
- 所有组件的点都具有相同的吸引时间(到达吸引子周围的目标集所需的迭代次数)
可以使用它来对组件进行着色。因为在抛物线情况下吸引子是弱的(弱吸引),所以某些点需要很多次迭代才能到达它。
// i = number of iteration
// iPeriodChild = period of child component of Mandelbrot set ( parabolic c value is a root point between parant and child component
/* distance from z to Alpha */
Zxt=Zx-dAlfaX;
Zyt=Zy-dAlfaY;
d2=Zxt*Zxt +Zyt*Zyt;
// interior: check if fall into internal target set (circle around alfa fixed point)
if (d2<dMaxDistance2Alfa2) return iColorsOfInterior[i % iPeriodChild];
这里有一些示例值
iWidth = 1001 // width of image in pixels PixelWidth = 0.003996 AR = 0.003996 // Radius around attractor denominator = 1 ; Cx = 0.250000000000000; Cy = 0.000000000000000 ax = 0.500000000000000; ay = 0.000000000000000 denominator = 2 ; Cx = -0.750000000000000; Cy = 0.000000000000000 ax = -0.500000000000000; ay = 0.000000000000000 denominator = 3 ; Cx = -0.125000000000000; Cy = 0.649519052838329 ax = -0.250000000000000; ay = 0.433012701892219 denominator = 4 ; Cx = 0.250000000000000; Cy = 0.500000000000000 ax = 0.000000000000000; ay = 0.500000000000000 denominator = 5 ; Cx = 0.356762745781211; Cy = 0.328581945074458 ax = 0.154508497187474; ay = 0.475528258147577 denominator = 6 ; Cx = 0.375000000000000; Cy = 0.216506350946110 ax = 0.250000000000000; ay = 0.433012701892219 denominator = 1 ; i = 243.000000 denominator = 2 ; i = 31 171.000000 denominator = 3 ; i = 3 400 099.000000 denominator = 4 ; i = 333 293 206.000000 denominator = 5 ; i = 29 519 565 177.000000 denominator = 6 ; i = 2 384 557 783 634.000000
其中
C = Cx + Cy*i a = ax + ay*i // fixed point alpha i // number of iterations after which critical point z=0.0 reaches disc around fixed point alpha with radius AR denominator of internal angle (in turns) internal angle = 1/denominator
请注意,吸引时间i与分母成正比。
现在您看到了弱吸引意味着什么。
你可以
- 使用蛮力方法(吸引半径<像素大小;迭代最大值足够大,让内部的所有点都到达目标集;长时间或快速计算机)
- 找到更好的方法(:-)),如果您觉得时间太长
内部距离估计
[edit | edit source]陷阱
[edit | edit source]Julia 集是填充的 Julia 集和无穷大吸引域的共同边界。
- 找到 Kc 内部/分量的点
- 找到逃逸点
- 使用 Sobel 滤波器找到边界点
它适用于分母不超过 4。
逆迭代 阿尔法不动点。它只对切割点(外部射线落入的地方)有效。其他点仍然没有被击中。
-
从 2 到内部射线 1/1 ; c=-0.75 Julia 集是一个 圣马可分形[47]
-
从周期 2 到 1/2
-
从周期 2 到 1/3
-
从周期 2 到 1/4
-
从周期 3 到 1/3
外部示例
- 图片:Cheritat 的非标准抛物线[48]
- Maxima CAS 中的抛物情况的 Julia 集[49]
- 抛物曼德勃罗集 Pascale ROESCH(与 C. L. PETERSEN 合作)
- 抛物线内爆 ArnaudCheritat 的迷你课程
- 2010 年抛物线内爆研讨会
- 抛物不动点的重整化... 宍倉光志郎和井野裕之
- 全纯映射的动力学:法图坐标的复兴,以及 Julia 集的多项式时间可计算性 Artem Dudko, arxiv.org: Dudko_A
- 迷你课程“展开抛物点的通用族的胚芽的解析分类”作者:Christiane Rousseau
- 全纯动力学中的抛物点视角 - 班夫国际数学创新与发现研究站 (BIRS)
- Richard Oudkerk:f_0(z) = z + z^{nu+1} + O(z^{nu+2}) 的抛物线内爆
- 全纯动力学中的抛物点视角 来自 BIRS 研讨会 15w5082 的视频
- Arnaud Chéritat:具有多个吸引花瓣的抛物点的通用扰动
- 抛物不动点 - Mathematica 笔记本 作者:Mark McClure
- ↑ Mark Braverman:关于抛物 Julia 集的有效计算
- ↑ 关于抛物线的动态稳定扰动的注记 作者:河原智己
- ↑ 维基百科中的填充的 Julia 集
- ↑ Barile, Margherita. "夏威夷耳环。" 来自 MathWorld - Wolfram 网页资源,由 Eric W. Weisstein 创建。http://mathworld.wolfram.com/HawaiianEarring.html
- ↑ Augustin Fruchard, Reinhard Sch¨afke. 复合渐近展开和差分方程。应用信息学与数学非洲研究评论,INRIA,2015,20,pp.63-93。<hal-01320625>
- ↑ 维基百科:胚芽 (数学)
- ↑ 微分同胚的不动点、向量场的奇点及其轨道的 epsilon 邻域 作者:Maja Resman
- ↑ 展开抛物不动点的解析微分同胚胚芽族模空间 作者:Colin Christopher,Christiane Rousseau
- ↑ 维基百科:重数 (数学)
- ↑ 表面同胚的动力学 Leau-Fatou 花定理和稳定流形定理的拓扑版本 作者:Le Roux,F
- ↑ C 中复多项式向量场的动力学 作者:Kealey Dias
- ↑ 退化抛物二次有理映射的极限 作者:XAVIER BUFF、JEAN ECALLE 和 ADAM EPSTEIN
- ↑ 更高维的庞加莱线性化 作者:Alastair Fletcher
- ↑ 圆的铅笔 作者:James King
- ↑ math.stackexchange 问题:抛物临界轨道的形状是什么
- ↑ 全纯不变量理论。国家论文,奥赛,1974 年 3 月
- ↑ 法语维基百科中的让·埃卡勒
- ↑ 让·埃卡勒主页
- ↑ 卢卡斯·盖耶 - 通过一致化实现的标准形式 (2016 年 10 月 28 日)。这是使用一致化定理证明吸引、排斥和抛物不动点局部标准形式的草案,在课堂上分发。最终它将被纳入讲义。
- ↑ 映射 作者:Luna Lomonaco
- ↑ 通用抛物微分同胚展开的解析分类模 作者:P. Mardesic、R. Roussarie¤ 和 C. Rousseau
- ↑ mathoverflow 问题:函数方程 ffxxfx2
- ↑ 维基百科中的胚芽
- ↑ 通用抛物微分同胚展开的解析分类模 作者:P. Mardesic、R. Roussarie 和 C. Rousseau
- ↑ 展开抛物不动点的解析微分同胚胚芽族模空间 作者:Colin Christopher,Christiane Rousseau
- ↑ Mathoverflow:在固定点附近函数的无穷小分类,直到共轭
- ↑ 单奇异全纯映射的近抛物重整化 作者:Arnaud Cheritat
- ↑ Ricardo Pérez-Marco. "不动点和圆周映射." Acta Math. 179 (2) 243 - 294, 1997. https://doi.org/10.1007/BF02392745
- ↑ 关于抛物线的动态稳定扰动的注记 由 川平知己
- ↑ 抛物不动点:Leau-Fatou 花 由 Davide Legacci 2021 年 3 月 18 日
- ↑ 维基百科:玫瑰 (拓扑)
- ↑ 花椰菜 在 MuEncy 由 Robert Munafo
- ↑ 圆圈内爆成火焰 - 视频由 sinflrobot
- ↑ 二维向量场的拓扑简化方法 由 Xavier Tricoche Gerik Scheuermann Hans Hagen
- ↑ 数学百科:常微分方程理论中的扇形
- ↑ 维基百科:数学中的重数
- ↑ Mandel:用于实数和复数动力学的软件 由 Wolf Jung
- ↑ 不动点处的局部动力学 由 Evgeny Demidov
- ↑ 抛物型朱利亚集是多项式时间可计算的 由 Mark Braverman
- ↑ Mark McClure 春季课程 2019:复数动力学,参见代码“抛物点附近的迭代”(Mathematica 笔记本)
- ↑ Michael Yampolsky, Saeed Zakeri:配对西格尔二次多项式。
- ↑ 不动点和周期轨道 由 Evgeny Demidov
- ↑ 绘制抛物型朱利亚集的 C 程序源代码
- ↑ Stack Exchange 问题:抛物型临界轨道的形状是什么?
- ↑ PlanetMath:圣马可分形
- ↑ 维基百科:杜阿迪兔子
- ↑ PlanetMath:圣马可分形
- ↑ 图片:非标准抛物线 由 Cheritat
- ↑ Maxima CAS 中的抛物型情况下的朱利亚集