返回列表 回复 发帖
120# xiaongxp
会不会是按幅角来决定三种不同算法?
120# xiaongxp
会不会是按幅角来决定三种不同算法?
柳烟 发表于 2012-7-11 12:01
可能是的。就不知这四种算法是一步到位还是分次进行。分次进行大家都能办到,只是一步到位……,得动动脑筋。还有,不知电脑处理速度是否跟得上。
复变分形M集的定位点,为一阶导数的零点,牛顿分形M集的定位点,通常为二阶导数的零点,这样造出的复分形美,小M集完备。不知是否有例外。UF中的分形:
c(z?1/z? Mandel
Fractal2.png
当初不知为何定位于(1,0),现在明白了,刚好是一阶导数的零点。
好久没扫过牛顿M集了,自创一个,今扫一张图:
未命名.jpg
问题1:牛集的分块作色,坛子上有人用过根作色法。此法不很理想,如果方程次数不是很高,如三次四次方程,还可招架,如果次数更高次,就麻烦了。FSK中的分块作色,可能不是根作色法。不知有何妙法,在牛集J中分块作色?
问题2:牛集J中等势圈部分如何抹平,成光滑状态?UF中有这种作色效果,可惜,我干了几天,没整成。
未命名.jpg
lk3.ufm中的Rational Newton Mandelbrot一个开关项代码精简如下:
rational-newton-mandelbrot {

init:

  float theta=@lightangle*#pi/180.0

  dr=size*(cos(theta)+flip(sin(theta)))
  c1=#pixel-dr
  c2=#pixel+dr

  int iter1=0


  int iter=0

  z=@zc
  z1=@zc


  temp=z^(@m-1)
  p=z*temp+@b
  pp=@m*temp
  ppp=(@m-1)*pp/z

  temp=z^(@n-1)
  q=z*temp-@b
  qp=@n*temp
  qpp=(@n-1)*qp/z


    hpp=ppp+qpp

  a=-0.5*hpp
loop:
  iter=iter+1

  if(iter1==0)

    temp=z1^(@m-1)
    p=z1*temp+@b
    pp=@m*temp

    temp=z1^(@n-1)
    q=z1*temp-@b
    qp=@n*temp


      h=p+q
      hp=pp+qp

    g=h+a*sqr(z1)+c1
    gp=hp+2*a*z1

    dz=g/gp
    z1=z1-dz
    temp=1/dz
    if(|temp|>@bailout)
      iter1=iter
    endif
  endif

      z=z1


bailout:
  (iter1==0)
default:
  title="Rational Newton Mandelbrot"
  method=multipass
  maxiter=100
  periodicity=0
  center=(0,0)
  magn=0.01

  heading
    caption="Rational Newton parameters"
  endheading
  param zc
    caption="critical point"
    default=(1,0)
    hint="Keep to a fairly small value."
  endparam
  param bailout
    caption="bailout"
    default=1000.0
    hint="Set to a large value."
  endparam
  param m
    caption="m"
    default=8.0
    hint="Exponent in p(z) function; p(z) = z^m + b."
  endparam
  param n
    caption="n"
    default=4.0
    hint="Exponent in q(z) function; q(z) = z^n - b."
  endparam
  param b
    caption="b"
    default=(-1,0)

  endparam

  heading
    caption="Embossing parameters"
  endheading
  bool param emboss
    caption="embossed image"
    default=false
  endparam
  float param sizefac
    caption="contour size"
    default=1.0
    hint="Specifies the relative size of the contour bands. Larger values \
          give thicker bands."

  endparam
  float param lightangle
    caption="light angle"
    default=0.0
    hint="Angle of apparent light source, in degrees."

  endparam
switch:
  type="rational-newton-julia"
  zc=zc
  julparam=#pixel
  bailout=bailout
  m=m
  n=n
  b=b
  htype=htype
  ztype=ztype
  emboss=emboss
  sizefac=sizefac
  lightangle=lightangle
}
效果图:
未命名.JPG
我整了一天,没整出,代码看起来不长,要算上一大篇.此分形代码解读不是很难的,就是整不出.
126# 柳烟


开关项中有浮雕效果的,如果不用那应该还能大大简化的。那些光照效果,c1,c2...就都没用了。浮雕效果很吸引人的:

Fractal1.jpg (171.06 KB)

Fractal1.jpg

127# 榕坚
说得甚是,很受启发,先在UF中尝试,易除浮雕效果,仅保留开关项(p+q)的普通牛M集代码如下:
Rational Newton Mandelbrot(p+q) {
;
; Mandelbrot and Newton set in one
; iterates z = f(z), beginning at zc = critical point of f(z)
; f(z) = Newton algorithm = z - g(z)/g'(z)
; g(z) = h(z) + a*z^2 + c
; h(z) = rational combination of 2 polynomial functions p(z) & q(z)
; p(z) = z^m + b
; q(z) = z^n - b
; a = -h"(zc)/2, so that g"(zc) = 0 and zc is a critical point of f(z)
; b = user input
; c = pixel
;
init:
  z=1
  c =66*#pixel
loop:
    zold = z
    a=-34
    fz = z^8+z^4+a*z^2+c
    f1z =8*z^7+4*z^3+2*a*z
    z = z - fz /f1z
bailout:
  |z - zold| >=0.000001
default:
  title = "Rational Newton Mandelbrot(p+q)"
  helpfile = "Uf*.chm"
  helptopic = "Html\formulas\standard\newton.html"
$IFDEF VER50
  rating = recommended
$ENDIF
  maxiter = 100

  param bailout
    caption = "Bailout value"
    default = 1e-10
    min = 0
$IFDEF VER40
    exponential = true
$ENDIF
    hint = "This parameter defines how soon a convergent orbit bails out while \
            iterating. Smaller values give more precise results but usually \
            require more iterations."
  endparam
}
注:以上代码经柳烟整理,对原代码进行了较大改动,便于更容易阅读,并用画板造之。以上代码在UF中运行没问题。init前面那段注释代码太重要了,一直以来,对代码中的注释部分没有引起足够的重视,现在要对注释代码另眼相看了。
Z的定位初始值为1的由来是这样的,求出g(z)的二阶导数,刚好是g''(z)=h''(z)+2a=56*z^6+12*z^2+2*a,令其为0,求出z的零值点,如果先给定a值,则求z的初始值时,要解一个6次方程,太过麻烦。若先确定z值,则求出a值容易又容易。令z=1,求出a=-h''(z)/2=-34.这样的牛M集中,不缺乏标准的小M集。指定其它的z作为初值,再算出相应的a值行不行呢呢?答案是肯定的。
未命名.JPG
这是定位于z=0.5算出a=-31/16时的分形:
未命名.JPG
返回列表