分形/复平面迭代/q迭代
迭代在数学中指的是迭代一个函数的过程,即重复应用一个函数,使用一次迭代的输出作为下一次迭代的输入。[1] 即使是看似简单的函数的迭代也会产生复杂的行为和难题。[2]
可以进行逆(向后迭代)
- 排斥器用于绘制Julia集(IIM/J)[3]
- Jlia集外的圆圈(半径=ER)用于绘制逃逸时间等值线(趋向于Julia集)[4]
- Julia集内的圆圈(半径=AR)用于绘制吸引时间等值线(趋向于Julia集)[5]
- 临界轨道(在Siegel圆盘情况下)用于绘制Julia集(可能仅在黄金分割的情况下)
- 用于绘制外部射线
向前迭代的排斥器是向后迭代的吸引器
- 迭代始终在动态平面上。
- 参数平面上没有动态。
- Mandelbrot集没有动力学。它是一组参数值。
- 参数平面上没有轨道,不应该在参数平面上绘制轨道。
- 临界点的轨道在动态平面上
这是安德鲁·罗宾斯2006-02-15在Tetration论坛上的文章的一部分,作者是安德鲁·罗宾斯
"迭代是动力学、混沌、分析、递归函数和数论的基础。在这些学科中,大多数情况下所需的迭代是整数迭代,即迭代参数为整数。然而,在动力系统研究中,连续迭代对于解决某些系统至关重要。
不同的迭代类型可以分类如下
- 离散迭代
- 整数迭代
- 分数迭代或有理迭代
- 非解析分数迭代
- 解析分数迭代
- 连续迭代
迭代函数
迭代的通常定义,其中函数方程
用于生成序列
称为f(x)的自然迭代,在组合下形成一个幺半群。
对于可逆函数f(x),逆函数也被认为是迭代,并形成序列
称为f(x)的整数迭代,在组合下形成一个群。
求解函数方程:。求解完该函数方程后,就可以求出有理迭代,即的整数迭代。
非解析分数迭代
[edit | edit source]选择非解析分数迭代,得到的结果将不是唯一的。(Iga 的方法)
解析分数迭代
[edit | edit source]求解解析分数迭代,将得到一个唯一的解。(Dahl 的方法)
连续迭代
[edit | edit source]这是对通常迭代概念的推广,其中函数方程(FE):f n(x) = f(f n-1(x)) 必须在域(实数或复数)的所有 n 中成立。如果不是这样,那么为了讨论这些类型的“迭代”(即使它们在技术上不是“迭代”,因为它们不遵循迭代的 FE),我们将讨论它们,就好像它们是 f n(x) 的表达式,其中 0 ≤ Re(n) ≤ 1,并且在其他地方由迭代的 FE 定义。因此,即使一种方法是解析的,如果它不满足这个基本的 FE,那么根据这个重新定义,它就是非解析的。
非解析连续迭代
[edit | edit source]选择非解析连续迭代,得到的结果将不是唯一的。(Galidakis 和 Woon 的方法)
解析连续迭代或解析迭代
[edit | edit source]求解解析连续迭代,将得到一个唯一的解。
实解析迭代
[edit | edit source]复解析迭代或全纯迭代
[edit | edit source]步长
[edit | edit source]
可视化
[edit | edit source]分解
[edit | edit source]在复二次多项式的情况下,迭代过程中的移动是复数。它包含 2 个移动
- 角移动 = 旋转(参见倍增映射)
- 径向移动(参见外部和内部射线,不变曲线)
- 落入目标集和吸引子(在双曲和抛物线情况下)
-
半径 abs(z) = r < 1.0,经过一些使用 f0(z) = z*z 的迭代后
-
点的重复迭代之间的距离小于 1
-
倍增映射后的角度为 1/7
-
倍增映射后的角度为 1/15
-
倍增映射后的角度为 11/36
角移动(旋转)
[edit | edit source]以转数计算复数的幅角[14]
/*
gives argument of complex number in turns
*/
double GiveTurn( double complex z){
double t;
t = carg(z);
t /= 2*pi; // now in turns
if (t<0.0) t += 1.0; // map from (-1/2,1/2] to [0, 1)
return (t);
}
方向
[edit | edit source]正向
[edit | edit source]反向
[edit | edit source]反向迭代或逆迭代[15]
- Peitgen
- W Jung
- John Bonobo[16]
Peitgen
[edit | edit source] /* Zn*Zn=Z(n+1)-c */
Zx=Zx-Cx;
Zy=Zy-Cy;
/* sqrt of complex number algorithm from Peitgen, Jurgens, Saupe: Fractals for the classroom */
if (Zx>0)
{
NewZx=sqrt((Zx+sqrt(Zx*Zx+Zy*Zy))/2);
NewZy=Zy/(2*NewZx);
}
else /* ZX <= 0 */
{
if (Zx<0)
{
NewZy=sign(Zy)*sqrt((-Zx+sqrt(Zx*Zx+Zy*Zy))/2);
NewZx=Zy/(2*NewZy);
}
else /* Zx=0 */
{
NewZx=sqrt(fabs(Zy)/2);
if (NewZx>0) NewZy=Zy/(2*NewZx);
else NewZy=0;
}
};
if (rand()<(RAND_MAX/2))
{
Zx=NewZx;
Zy=NewZy;
}
else {Zx=-NewZx;
Zy=-NewZy; }
Mandel
[edit | edit source]以下是使用来自 Wolf Jung 编写的程序 Mandel 的代码,进行逆迭代的 c 代码示例。
/*
/*
gcc i.c -lm -Wall
./a.out
z = 0.000000000000000 +0.000000000000000 i
z = -0.229955135116281 -0.141357981605006 i
z = -0.378328716195789 -0.041691618297441 i
z = -0.414752103217922 +0.051390827017207 i
*/
#include <stdio.h>
#include <math.h> // M_PI; needs -lm also
#include <complex.h>
/* find c in component of Mandelbrot set
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
double t = InternalAngleInTurns *2*M_PI; // from turns to radians
double R2 = InternalRadius * InternalRadius;
double Cx, Cy; /* C = Cx+Cy*i */
switch ( Period ) // of component
{
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 iPeriodChild there are 2^(iPeriodChild-1) roots.
default: // higher periods : to do, use newton method
Cx = 0.0;
Cy = 0.0;
break; }
return Cx + Cy*I;
}
/* mndyncxmics::root from mndyncxmo.cpp by Wolf Jung (C) 2007-2014. */
// input = x,y
// output = u+v*I = sqrt(x+y*i)
complex double GiveRoot(complex double z)
{
double x = creal(z);
double y = cimag(z);
double u, v;
v = sqrt(x*x + y*y);
if (x > 0.0)
{ u = sqrt(0.5*(v + x)); v = 0.5*y/u; return u+v*I; }
if (x < 0.0)
{ v = sqrt(0.5*(v - x)); if (y < 0.0) v = -v; u = 0.5*y/v; return u+v*I; }
if (y >= 0.0)
{ u = sqrt(0.5*y); v = u; return u+v*I; }
u = sqrt(-0.5*y);
v = -u;
return u+v*I;
}
// from mndlbrot.cpp by Wolf Jung (C) 2007-2014. part of Madel 5.12
// input : c, z , mode
// c = cx+cy*i where cx and cy are global variables defined in mndynamo.h
// z = x+y*i
//
// output : z = x+y*i
complex double InverseIteration(complex double z, complex double c, char key)
{
double x = creal(z);
double y = cimag(z);
double cx = creal(c);
double cy = cimag(c);
// f^{-1}(z) = inverse with principal value
if (cx*cx + cy*cy < 1e-20)
{
z = GiveRoot(x - cx + (y - cy)*I); // 2-nd inverse function = key b
if (key == 'B') { x = -x; y = -y; } // 1-st inverse function = key a
return -z;
}
//f^{-1}(z) = inverse with argument adjusted
double u, v;
complex double uv ;
double w = cx*cx + cy*cy;
uv = GiveRoot(-cx/w -(cy/w)*I);
u = creal(uv);
v = cimag(uv);
//
z = GiveRoot(w - cx*x - cy*y + (cy*x - cx*y)*I);
x = creal(z);
y = cimag(z);
//
w = u*x - v*y;
y = u*y + v*x;
x = w;
if (key =='A'){
x = -x;
y = -y; // 1-st inverse function = key a
}
return x+y*I; // key b = 2-nd inverse function
}
/*f^{-1}(z) = inverse with argument adjusted
"When you write the real and imaginary parts in the formulas as complex numbers again,
you see that it is sqrt( -c / |c|^2 ) * sqrt( |c|^2 - conj(c)*z ) ,
so this is just sqrt( z - c ) except for the overall sign:
the standard square-root takes values in the right halfplane, but this is rotated by the squareroot of -c .
The new line between the two planes has half the argument of -c .
(It is not orthogonal to c ... )"
...
"the argument adjusting in the inverse branch has nothing to do with computing external arguments. It is related to itineraries and kneading sequences, ...
Kneading sequences are explained in demo 4 or 5, in my slides on the stripping algorithm, and in several papers by Bruin and Schleicher.
W Jung " */
double complex GiveInverseAdjusted (complex double z, complex double c, char key){
double t = cabs(c);
t = t*t;
z = csqrt(-c/t)*csqrt(t-z*conj(c));
if (key =='A') z = -z; // 1-st inverse function = key a
// else key == 'B'
return z;
}
// make iMax inverse iteration with negative sign ( a in Wolf Jung notation )
complex double GivePrecriticalA(complex double z, complex double c, int iMax)
{
complex double za = z;
int i;
for(i=0;i<iMax ;++i){
printf("i = %d , z = (%f, %f) \n ", i, creal(za), cimag(za) );
za = InverseIteration(za,c, 'A');
}
printf("i = %d , z = (%f, %f) \n ", i, creal(za), cimag(za) );
return za;
}
// make iMax inverse iteration with negative sign ( a in Wolf Jung notation )
complex double GivePrecriticalA2(complex double z, complex double c, int iMax)
{
complex double za = z;
int i;
for(i=0;i<iMax ;++i){
printf("i = %d , z = (%f, %f) \n ", i, creal(za), cimag(za) );
za = GiveInverseAdjusted(za,c, 'A');
}
printf("i = %d , z = (%f, %f) \n ", i, creal(za), cimag(za) );
return za;
}
int main(){
complex double c;
complex double z;
complex double zcr = 0.0; // critical point
int iMax = 10;
int iPeriodChild = 3; // period of
int iPeriodParent = 1;
c = GiveC(1.0/((double) iPeriodChild), 1.0, iPeriodParent); // root point = The unique point on the boundary of a mu-atom of period P where two external angles of denominator = (2^P-1) meet.
z = GivePrecriticalA( zcr, c, iMax);
printf("iAngle = %d/%d c = (%f, %f); z = (%.16f, %.16f) \n ", iPeriodParent, iPeriodChild, creal(c), cimag(c), creal(z), cimag(z) );
z = GivePrecriticalA2( zcr, c, iMax);
printf("iAngle = %d/%d c = (%f, %f); z = (%.16f, %.16f) \n ", iPeriodParent, iPeriodChild, creal(c), cimag(c), creal(z), cimag(z) );
return 0;
}
测试
[edit | edit source]可以无限次迭代。测试将告知何时可以停止。
- 正向迭代的逃逸测试
目标集 用于测试。当 zn 在目标集中时,就可以停止迭代。
"曼德布罗特集没有动力学。它是一组参数值。参数平面上没有轨道,不应该在参数平面上绘制轨道。临界点的轨道在动力学平面上"
"The polynomial Pc maps each dynamical ray to another ray doubling the angle (which we measure in full turns, i.e. 0 = 1 = 2π rad = 360◦), and the dynamical rays of any polynomial “look like straight rays” near infinity. This allows us to study the Mandelbrot and Julia sets combinatorially, replacing the dynamical plane by the unit circle, rays by angles, and the quadratic polynomial by the doubling modulo one map." Virpi K a u k o[17]
假设 c=0,那么可以将动力学平面称为 平面。
这里,动力学平面可以被分为:
- Julia 集 =
- Fatou 集,它包含两个子集:
- Julia 集的内部 = 有限吸引子的吸引域 =
- Julia 集的外部 = 无穷大的吸引域 =
其中:
- r 是复数 z = x + i 的绝对值、模数 或幅值
- 是复数 z 的辐角(在许多应用中称为“相位”),是半径与正实轴的夹角。通常使用主值。
因此
以及前向迭代:[18]
正向迭代
你可以交互式地检查它
- Geogebra plet by Jorj Kowszun-Lecturer - 尝试沿着从中心到外边的径向线移动,看看行为的变化
- M McClure 对复数平方迭代的可视化
- W Jung 的 Mandel 程序
- Jeffrey Ventrella 对复数的平方
- MIT mathlets:复数指数
混沌与复数平方映射
[edit | edit source]迭代呈现混沌现象的非正式原因是,角度在每次迭代中翻倍,而翻倍随着角度变得越来越大而迅速增长,但相差 2π 弧度的倍数的角度是相同的。因此,当角度超过 2π 时,它必须通过 2π 除以余数进行*循环*。因此,角度根据二元变换(也称为 2x 模 1 映射)进行变换。由于初始值 *z*0 被选择为其幅角不是 π 的有理倍数,因此 *z**n* 的前向轨迹不能重复自身并变得周期性。
更正式地说,迭代可以写成
其中 是通过迭代上述步骤获得的复数序列,而 代表初始起始数字。我们可以精确地解决此迭代
从角度 θ 开始,我们可以将初始项写成 ,因此 。这使得角度的连续加倍变得清晰。(这等效于关系 )。
逃逸测试
[edit | edit source]如果距离
- 点 z 属于 Julia 集外部
- Julia 集
是
那么点 z 逃逸(= 它的幅度大于 逃逸半径 = ER)
之后
另请参阅
反向迭代
[edit | edit source]每个角度(实数)α ∈ R/Z 以周为单位测量,都具有
注意,这两个原像之间的差异
是半个周转 = 180 度 = Pi 弧度。
在复动力平面使用二次多项式 进行反向迭代
给出反向轨道 = **原像的二叉树**
在这样的树中,如果没有额外信息,就无法选择好的路径。
注意,原象显示旋转对称性(180 度)
有关其他函数,请参阅 Fractalforum[25]
另请参阅
fc 的动态平面
[edit | edit source]可以使用以下方法进行检查
逃逸时间或吸引时间的等高线
[edit | edit source]-
外部圆的原象给出逃逸时间的等高线
-
内部圆的原象给出吸引时间的等高线
IIM/J 绘制的朱莉娅集
[edit | edit source]理论
- 周期点在朱莉娅集中稠密
- 朱莉娅集是排斥周期点的集合的闭包
因此,绘制排斥周期点及其轨道(正向和反向 = 逆向)可以直观地很好地近似朱莉娅集 = 点集足够稠密,这些点在朱莉娅集上的非均匀分布并不重要。
-
当 C = i 时,排斥不动点的原象趋向于朱莉娅集。图像和源代码
-
使用 MIIM 绘制的朱莉娅集。图像和 Maxima 源代码
-
在西格尔圆盘情况下,临界轨道的原象趋向于整个朱莉娅集
-
简单 IIM/J 中的点分布
-
c = -0.750357820200574 +0.047756163825227 i
-
C = ( 0.4 0.3 )
在逃逸时间中,计算点 z 的正向迭代。
在 IIM/J 中,计算
- 复杂二次多项式的排斥不动点[26]
- 通过逆向迭代计算 的原象
"We know the periodic points are dense in the Julia set, but in the case of weird ones (like the ones with Cremer points, or even some with Siegel disks where the disk itself is very 'deep' within the Julia set, as measured by the external rays), the periodic points tend to avoid certain parts of the Julia set as long as possible. This is what causes the 'inverse method' of rendering images of Julia sets to be so bad for those cases." Jacques Carette[27]
因为平方根是多值函数,所以每个 都有两个原象 。因此,逆向迭代会创建二叉树 的原象。
-
二叉树
-
二叉树的扩展增长
由于二叉树的扩展增长,原象的数量呈指数级增长:完整二叉树中节点的数量 为
其中
- 是树的高度
如果要绘制完整二叉树,则存储二叉树的方法会浪费大量内存,因此另一种方法是
- 线程二叉树
- 只绘制二叉树中的某些路径
- 随机路径:最长路径 = 从根到叶的路径
另请参阅
树的根
[edit | edit source]“...排斥不动点β的原像。它们形成一棵树状的
beta beta -beta beta -beta x y
因此,当您从β开始构建树时,每个点最终都会被计算两次。如果您从-β开始,您将获得相同数量的点,但计算次数减半。
类似的情况也适用于临界轨道的原像。如果z在临界轨道上,它的两个原像中也会有一个在其中,所以您应该绘制-z及其原像的树,以避免重复计算相同点。”(Wolf Jung)
- 随机选择两个根中的一个 IIM(直到选择的最大级别)。随机遍历树。最简单的编码和快速,但效率低下。从它开始。
- 两个根以相同的概率
- 一个根比另一个根更频繁
- 绘制所有根(直到选择的最大级别)[31]
- 使用递归
- 使用堆栈(更快?)
- 在二叉树中绘制一些罕见路径 = MIIM。这是绘制所有根的修改。停止使用一些罕见路径。
代码示例
Maxima CAS 源代码 - 简单 IIM。点击右侧查看 |
---|
所有代码只有一个函数 请点击这里查看 |
finverseplus(z,c):=sqrt(z-c); finverseminus(z,c):=-sqrt(z-c); c:%i; /* define c value */ iMax:5000; /* maximal number of reversed iterations */ fixed:float(rectform(solve([z*z+c=z],[z]))); /* compute fixed points of f(z,c) : z=f(z,c) */ if (abs(2*rhs(fixed[1]))<1) /* Find which is repelling */ then block(beta:rhs(fixed[1]),alfa:rhs(fixed[2])) else block(alfa:rhs(fixed[1]),beta:rhs(fixed[2])); z:beta; /* choose repeller as a starting point */ /* make 2 list of points and copy beta to lists */ xx:makelist (realpart(beta), i, 1, 1); /* list of re(z) */ yy:makelist (imagpart(beta), i, 1, 1); /* list of im(z) */ for i:1 thru iMax step 1 do /* reversed iteration of beta */ block (if random(1.0)>0.5 /* random choose of one of two roots */ then z:finverseplus(z,c) else z:finverseminus(z,c), xx:cons(realpart(z),xx), /* save values to draw it later */ yy:cons(imagpart(z),yy) ); plot2d([discrete,xx,yy],[style,[points,1,0,1]]); /* draw reversed orbit of beta */ |
与之比较
Maxima CAS 源代码 - 使用命中表的 MIIM。点击右侧查看 |
---|
所有代码只有一个函数 请点击这里查看 |
/* Maxima CAS code */ /* Gives points of backward orbit of z=repellor */ GiveBackwardOrbit(c,repellor,zxMin,zxMax,zyMin,zyMax,iXmax,iYmax):= block( hit_limit:4, /* proportional to number of details and time of drawing */ PixelWidth:(zxMax-zxMin)/iXmax, PixelHeight:(zyMax-zyMin)/iYmax, /* 2D array of hits pixels . Hit > 0 means that point was in orbit */ array(Hits,fixnum,iXmax,iYmax), /* no hits for beginning */ /* choose repeller z=repellor as a starting point */ stack:[repellor], /*save repellor in stack */ /* save first point to list of pixels */ x_y:[repellor], /* reversed iteration of repellor */ loop, /* pop = take one point from the stack */ z:last(stack), stack:delete(z,stack), /*inverse iteration - first preimage (root) */ z:finverseplus(z,c), /* translate from world to screen coordinate */ iX:fix((realpart(z)-zxMin)/PixelWidth), iY:fix((imagpart(z)-zyMin)/PixelHeight), hit:Hits[iX,iY], if hit<hit_limit then ( Hits[iX,iY]:hit+1, stack:endcons(z,stack), /* push = add z at the end of list stack */ if hit=0 then x_y:endcons( z,x_y) ), /*inverse iteration - second preimage (root) */ z:-z, /* translate from world to screen coordinate, coversion to integer */ iX:fix((realpart(z)-zxMin)/PixelWidth), iY:fix((imagpart(z)-zyMin)/PixelHeight), hit:Hits[iX,iY], if hit<hit_limit then ( Hits[iX,iY]:hit+1, stack:endcons(z,stack), /* push = add z at the end of list stack to continue iteration */ if hit=0 then x_y:endcons( z,x_y) ), if is(not emptyp(stack)) then go(loop), return(x_y) /* list of pixels in the form [z1,z2] */ )$ |
Octave 源代码 - 使用命中表的 MIIM。点击右侧查看 |
---|
iimm_hit.m |
# octave m-file
# IIM using Hit table
# save as a iimm_hit.m in octave working dir
# run octave and iimm_hit
#
# stack-like operation
# http://www.gnu.org/software/octave/doc/interpreter/Miscellaneous-Techniques.html#Miscellaneous-Techniques
# octave can resize array
# a = [];
# while (condition)
# a(end+1) = value; # "push" operation
# a(end) = []; # "pop" operation
#
# -------------- general octave settings ----------
clear all;
more off;
pkg load image; # imwrite
pkg load miscellaneous; # waitbar
# --------------- const and var -----------------------------
# define some global var AT EACH LEVEL where you want to use it ( Pascal CdeMills)
# ? for global variables one can't define and give initial value at the same time
# integer ( screen ) coordinate
iSide = 1000
ixMax = iSide
iyMax = iSide
#
global HitLimit;
HitLimit=1 # proportional to number of details and time of drawing
global Hits; # 2D array of pixels . Hit > 0 means that point was in orbit
Hits = zeros(iyMax,ixMax);
# image as a 2D matrix of 24 bit colors coded from 0.0 to 1.0
global MyImage;
MyImage = zeros(iyMax,ixMax,3); # matrix filled with 0.0 ( black image)= [rows, columns, color_depth]
# world ( float) coordinate - dynamical (Z) plane
global dSide;
global ZxMin ;
global ZxMax;
global ZyMin;
global ZyMax ;
global z;
global PixelHeight ;
global PixelWidth ;
# add values to global variables
dSide=1.25
ZxMin = -dSide
ZxMax = dSide
ZyMin = -dSide
ZyMax = dSide
PixelHeight = (ZyMax - ZyMin)/(iyMax - 1)
PixelWidth = (ZxMax - ZxMin)/(ixMax - 1)
# pseudo stack = resizable array
global Stack;
Stack=[];
global StackIndex;
StackIndex=0;
c = complex(.27327401, 0.00756218);
global Color24White;
Color24White=[1.0, 1.0, 1.0];
# ---------------- functions ------------------
function [iY, iX] = f(z)
# define some global var AT EACH LEVEL where you want to use it ( Pascal CdeMills)
global ZxMin;
global ZyMax;
global PixelWidth;
global PixelHeight;
# translate from world to screen coordinate
iX=int32((real(z)-ZxMin)/PixelWidth);
iY=int32((ZyMax - imag(z))/PixelHeight); # invert y axis
endfunction;
# plot point with integer coorfinate to array MyImage
function Plot( iY, iX , color )
global MyImage;
MyImage(iY, iX, 1) = color(1);
MyImage(iY, iX, 2) = color(2);
MyImage(iY, iX, 3) = color(3);
endfunction;
# push = put point z on the stack
function push(z)
global Stack;
global StackIndex;
StackIndex =size(Stack,2); # update global var
StackIndex = StackIndex +1; # update global var
Stack(StackIndex) = z; # "push" z on pseudo stack
endfunction;
# pop = take point z from the stack
function z = pop()
global Stack;
global StackIndex;
StackIndex =size(Stack,2); # update global var
z = Stack(StackIndex); # pop z from pseudo stack
Stack(StackIndex) = []; # make pseudo stack shorter
StackIndex = StackIndex -1 ; # update global var
endfunction;
function CheckPoint(z)
# error is here
global Hits;
global HitLimit;
global Color24White;
[iY, iX] = f(z);
hit = Hits(iY, iX);
if (hit < HitLimit)
push(z); # (put z on the stack) to continue iteration
if (hit<1) Plot( iY, iX , Color24White ); endif; # plot
Hits(iY, iX) = hit + 1; # update Hits table
endif;
endfunction; # CheckPoint
# -------------------- main ---------------------------------------
# Determine the unstable fixed point beta
# http://en.wikipedia.org/wiki/Periodic_points_of_complex_quadratic_mappings
beta = 0.5+sqrt(0.25-c)
z=-beta
CheckPoint(z);
while (StackIndex>0) # if stack is not empty
z = pop(); # take point z from the stack
# compute its 2 preimages z and -z ( inverse function of complex quadratic polynomial)
z= sqrt(z-c);
# check points : draw, put on the stack to continue iterations
CheckPoint(z);
CheckPoint(-z);
endwhile;
# ------------------- image --------------------------------------
imread("a7.png");# first load any existing image to resolve bug : panic crash using imwrite: octave: magick/semaphore.c:525 first load any image
image(MyImage); # Display Image
name = strcat("iim",int2str(HitLimit), " .png");
imwrite(MyImage,name); # save image to file. this requires the ImageMagick "convert" utility.
|
另请参阅
- 颜色:朱利亚集的不同部分具有不同的颜色
- 动力系统
- 不动点
- 李雅普诺夫数
- 函数方程
- 阿贝尔函数
- 施罗德函数
- 博特切函数
- 朱利亚函数
- 特殊矩阵
- 卡莱曼矩阵
- 贝尔矩阵
- 阿贝尔-罗宾斯矩阵
- ↑ 维基百科:迭代
- ↑ 从局部到全局的迭代理论 - 瓦茨拉夫·库切拉
- ↑ 朱利亚集的逆迭代算法 - 马克·麦克卢尔
- ↑ 微型计算机的复迭代
- ↑ 关于具有两个临界点的有理映射 - 约翰·米尔诺,图 5
- ↑ 迭代函数 - 汤姆·戴维斯
- ↑ 迭代函数的泰勒级数的存在性和唯一性 - 丹尼尔·盖斯勒
- ↑ 动力学映射的连续迭代 - R. 阿尔德罗万迪,L. P. 弗雷塔斯(圣保罗,IFT)
- ↑ 分形的连续迭代 - 格拉德·维斯特多普
- ↑ 如何折叠朱利亚分形 - 史蒂文·维滕斯
- ↑ 将圆形折叠成朱利亚集 - 卡尔·西姆斯
- ↑ 朱利亚集中复杂性的视觉解释 - 奥克·施赖弗斯,雅克·J·范·维克(见支持信息中的视频)
- ↑ 如何构建朱利亚集
- ↑ 转向
- ↑ 理解朱利亚集和曼德布罗集 - 卡尔·西姆斯
- ↑ 绘制朱利亚集的快速方法:逆迭代 - 约翰·博诺博
- ↑ 曼德布罗集中可见分量的树 - 维尔皮·考科,FUNDAMENTA MATHEMATICAE 164(2000)
- ↑ 多项式迭代的实部和虚部 - 朱莉娅·A·巴恩斯,克林顿·P·卡里和丽贝斯·E·绍布罗克。纽约数学杂志 16(2010)749-761。
- ↑ mandelbrot-hue - 理查德·A·汤姆森
- ↑ 相位 - 利纳斯·维普斯塔斯
- ↑ 复数 - 戴维·E·乔伊斯
- ↑ 复数的幂 - 梦之箱
- ↑ 抛物线朱利亚集是多项式时间可计算的 - 马克·布拉弗曼
- ↑ 符号动力学和自相似群 - 弗拉基米尔·涅克拉舍维奇
- ↑ 关于一般朱利亚集 IFS 的更高次幂查询。
- ↑ 维基百科:排斥不动点
- ↑ mathbbc/185430 mathoverflow 问题:多项式迭代的周期点聚类
- ↑ Wolfram Alpha
- ↑ 示例
- ↑ wikipedia : 排斥不动点
- ↑ Fractint 文档 - 逆 Julia 集
- ↑ 图像和 c 源代码 : 使用命中限制的 IIMM
- ↑ 克里斯·金 - 探索混沌的黑暗之心
- ↑ Drakopoulos V.,比较 Julia 集的渲染方法,WSCG 杂志 10 (2002),155-161
- ↑ bugman123:分形
- ↑ dhushara : DarkHeart