返回列表 回复 发帖

牛顿分形的“光滑”着色

所谓Newton分形,就是在复平面上给定复函数g(z),构造Newton迭代公式 f(z)=z-g(z)/g'(z),对复平面内的每一点z0,用Newton迭代公式 z_(n+1) = f(z_n)进行迭代计算,得一迭代序列,z0,z1,z2,z3,……(1),根据这序列的不同表现,选定一个颜色值给z0以标记,在复平面内就形成了一个漂亮的图案就是Newton分形。典型的有 g(z)=z^3-1.
N1207260.JPG
N120726.JPG
N120726'.jpg
对于Newton迭代序列,z0,z1,z2,z3,……(1),一般可以很快收敛于g(z)的一个零点,但一般情况下g(z)有多个零点,而且我们不能准确写出g(z)的零点值。为此我们作变换dn=zn-z_(n-1),构造新序列:d1,d2,d3,……(2),它可以很快收敛于0。可以想象,由于z0在平面内的不同位置,它们分属于g(z)的不同零点的领域,即使在同一零点领域,也有离零点远近之分,为此,再引入一个小正数 ε>0,对于z0,若存在一个正整数 N,当 n>=N 时,||dn||<ε,而 n<N 时,||dn||>ε ,这时对于z0,产生几个可用来给z0标记颜色的特殊值,N,zN,dN。N——逃逸时间,zN——迭代终点——应该很接近零点,dN——最后一次迭代的步长。当然,由于时间和技术问题,我们应该设定一个最大迭代次数 M ,对一般的点z0 的 N < M,可是有一些点z0,迭代 M 次后仍有 ||dM||>ε,这些点就是零点领域边界附近的点,画在图上就是Newton分形的分形链上的点。
好象N集光滑作色,不是完全抹平等势圈,如果完全抹平后,每块缺乏立体感,成平面状,边界看起来也不太美。
未命名.JPG
这是UF中的效果,各块看起来光滑,仔细一瞧,仍有等势圈,只不过等势圈十分摸糊,晃眼一看,很是光滑。不知能否象圆陷阱那样,使每块成为 伪3D.
3# 柳烟

是那一个效果,我怎么没找到
2# changxde

关于迭代序列的收敛问题,要用到数学理论,我已经淡忘了,网友可以补上。
为了淡化等势线,我们考虑 ||dN||/ε 这个值,它的值域是(0,1],把它与逃逸时间结合起来,即可淡化等势线。
不过因缺乏迭代序列的收敛理论,||dN||/ε 这个值的变化规律还不太清楚,但可以肯定它不是线性的。望网友们一块探讨。
N120727.JPG
4# changxde
在ahm.ucl中,里面只有一个特效文件。打开任一牛集,再点选outside选项卡,找到ahm.ucl中的文件Extrapolated Bailout,打开后,再在面板中选中四个开关项的newton,即得此图形。代码可单独将此开关项抽出来。这个效果我干了几次,整不出这效果,可能我的造法有问题,代码有些地方费解。
我将那个特效文件,进行大幅度缩水,仅保留newton开关项部分,并动了手脚后,代码及图形效果如下:
VaryingBailout {

final:
complex x = #pixel
If Imag(#pixel)==0
  x=#pixel + 1e-30i
Endif

int iter = 0
repeat

   xold=x
   x=x -( x^3-1)/(3*x^2)

  iter=iter+1
until (|x-xold|<=@SmallBailout )

  float bailTest=|x-xold|
  Power=2
If iter!=1000
    #index=cabs(sqrt(log(Power)*(#maxiter-iter) + log(log(bailTest))))
Else
   #index=sqrt(log(log(bailTest)))
Endif
default:
title="Extrapolated Bailout"

float param SmallBailout
  caption="Small Bailout"
  hint="Should be positive. Smaller values mean more time, but more accurate \
  pictures (assuming you increase the iterations)."

  default=0.0001
endparam

}
Fractal2.png
只能弄到这个程度,要兼顾到多种颜色的一致性很难:

N.JPG (69.54 KB)

N.JPG

我今天试着模糊等势圈,用常老师法,我不得法,结果等势圈越整越浓,用|z-z0|的终象除任意小正数ε(阈值)与et搭配,我是分二个阵营,一是||dM||>ε,二是||dM||<ε分别调色。如何搭配才得当?
我试着翻译8楼光滑N集的代码,结果#index=cabs(sqrt(log(Power)*(#maxiter-iter) + log(log(bailTest))))不好驾驭,弄出无意义。又until (|x-xold|<=@SmallBailout )是啥意思?与后文如何串联?丈二和尚摸不着头脑。再精简代码如下,我在UF中验证了,得到的图形完全一样。个别句子再动手脚。
VaryingBailout {

final:
complex x = #pixel


int iter = 0
repeat

   xold=x
   x=x -( x^3-1)/(3*x^2)

  iter=iter+1
until (|x-xold|<=@SmallBailout )

  float bailTest=|x-xold|
  Power=2
If iter-#maxiter<0
    #index=cabs(sqrt(log(Power)*(#maxiter-iter) + log(abs(log(bailTest)))))
Else
   #index=sqrt(log(abs(log(bailTest))) )
Endif
default:
title="Extrapolated Bailout"

float param SmallBailout
  caption="Small Bailout"
  hint="Should be positive. Smaller values mean more time, but more accurate \
  pictures (assuming you increase the iterations)."

  default=0.0001
endparam

}
短短的代码,怎么那么麻烦,怪得出奇。
返回列表