マンデルブロート(ジュリア)

 投稿者:しばっち  投稿日:2018年 1月23日(火)21時52分51秒
  マンデルブロート(ジュリア)を描画します。
スライドバーを19個使用し、パラメータを変化させます(Ver.7.8.1以上)
TABキーを押すと解像度を変更します。
ESCキーで終了します。
左ドラックすると平行移動します。(引っ張る感じになります)
右クリック後に左ドラッグで拡大範囲を指定します。


OPTION ARITHMETIC COMPLEX
LET LEFT=-2.5 !'計算範囲
LET RIGHT=2.5
LET BOTTOM=-2.5
LET TOP=2.5
LET XSIZE=400
LET YSIZE=400
CALL GINIT(XSIZE,YSIZE)
DIM S$(8)
MAT READ S$
DATA "200*200","300*300","400*400","500*500","600*600","700*700","800*800","1000*1000"
LOCATE VALUE NOWAIT(1),RANGE 1 TO 200,AT 30:KS !'計算精度
LOCATE VALUE NOWAIT(2),RANGE -1.5 TO 1.5,AT .5:R1
LOCATE VALUE NOWAIT(3),RANGE -1.5 TO 1.5,AT .5:I1
LOCATE VALUE NOWAIT(4),RANGE -1.5 TO 1.5,AT .5:R2
LOCATE VALUE NOWAIT(5),RANGE -1.5 TO 1.5,AT .5:I2
LOCATE VALUE NOWAIT(6),RANGE -1.5 TO 1.5,AT .5:R3
LOCATE VALUE NOWAIT(7),RANGE -1.5 TO 1.5,AT .5:I3
LOCATE VALUE NOWAIT(8),RANGE -1.5 TO 1.5,AT 0:R4
LOCATE VALUE NOWAIT(9),RANGE -1.5 TO 1.5,AT 0:I4
LOCATE VALUE NOWAIT(10),RANGE -1.5 TO 1.5,AT 0:R5
LOCATE VALUE NOWAIT(11),RANGE -1.5 TO 1.5,AT 0:I5
LOCATE VALUE NOWAIT(12),RANGE -1.5 TO 1.5,AT 0:R6
LOCATE VALUE NOWAIT(13),RANGE -1.5 TO 1.5,AT 0:I6
LOCATE VALUE NOWAIT(14),RANGE -1.5 TO 1.5,AT 0:R7
LOCATE VALUE NOWAIT(15),RANGE -1.5 TO 1.5,AT 0:I7
LOCATE VALUE NOWAIT(16),RANGE -1.5 TO 1.5,AT 0:R8
LOCATE VALUE NOWAIT(17),RANGE -1.5 TO 1.5,AT 0:I8
LOCATE VALUE NOWAIT(18),RANGE -1.5 TO 1.5,AT 0:R9
LOCATE VALUE NOWAIT(19),RANGE -1.5 TO 1.5,AT 0:I9
DO
   IF FF<>0 THEN
      LOCATE CHOICE(S$) : N
      SELECT CASE N
      CASE 1
         LET XSIZE=200
         LET YSIZE=200
      CASE 2
         LET XSIZE=300
         LET YSIZE=300
      CASE 3
         LET XSIZE=400
         LET YSIZE=400
      CASE 4
         LET XSIZE=500
         LET YSIZE=500
      CASE 5
         LET XSIZE=600
         LET YSIZE=600
      CASE 6
         LET XSIZE=700
         LET YSIZE=700
      CASE 7
         LET XSIZE=800
         LET YSIZE=800
      CASE 8
         LET XSIZE=1000
         LET YSIZE=1000
      END SELECT
      CALL GINIT(XSIZE,YSIZE)
      PRINT "画像サイズ";XSIZE;"*";YSIZE
      LET FF=0
   END IF
   LET DX=(RIGHT-LEFT)/XSIZE
   LET DY=(TOP-BOTTOM)/YSIZE
   SET WINDOW LEFT,RIGHT,BOTTOM,TOP
   PRINT "横:";LEFT;"~";RIGHT
   PRINT "縦:";BOTTOM;"~";TOP
   PRINT
   CLEAR
   DO
      LOCATE VALUE NOWAIT(1):KS
      LOCATE VALUE NOWAIT(2):R1
      LOCATE VALUE NOWAIT(3):I1
      LOCATE VALUE NOWAIT(4):R2
      LOCATE VALUE NOWAIT(5):I2
      LOCATE VALUE NOWAIT(6):R3
      LOCATE VALUE NOWAIT(7):I3
      LOCATE VALUE NOWAIT(8):R4
      LOCATE VALUE NOWAIT(9):I4
      LOCATE VALUE NOWAIT(10):R5
      LOCATE VALUE NOWAIT(11):I5
      LOCATE VALUE NOWAIT(12):R6
      LOCATE VALUE NOWAIT(13):I6
      LOCATE VALUE NOWAIT(14):R7
      LOCATE VALUE NOWAIT(15):I7
      LOCATE VALUE NOWAIT(16):R8
      LOCATE VALUE NOWAIT(17):I8
      LOCATE VALUE NOWAIT(18):R9
      LOCATE VALUE NOWAIT(19):I9
      FOR X=LEFT TO RIGHT STEP DX
         FOR Y=BOTTOM TO TOP STEP DY
            IF GetKeyState(9)<0 THEN !'TABキー
               LET FF=1
               EXIT DO
            ELSEIF GetKeyState(27)<0 THEN !'ESCキー
               STOP
            END IF
            CALL PSET(X,Y,0)
            LET Z=COMPLEX(X,Y)
            FOR K=1 TO KS
               LET Z=COMPLEX(R9,I9)*Z^8+COMPLEX(R8,I8)*Z^7+COMPLEX(R7,I7)*Z^6+COMPLEX(R6,I6)*Z^5+COMPLEX(R5,I5)*Z^4+COMPLEX(R4,I4)*Z^3+COMPLEX(R3,I3)*Z^2+COMPLEX(R2,I2)*Z+COMPLEX(R1,I1)
               IF ABS(Z)>2 THEN
                  CALL PSET(X,Y,MOD(K,7)+1)
                  EXIT FOR
               END IF
            NEXT K
            MOUSE POLL X1,Y1,L,R
            IF R<>0 THEN EXIT DO !'右クリック
            IF L<>0 THEN
               SET DRAW MODE NOTXOR
               SET LINE STYLE 2
               DO
                  PLOT LINES:X1,Y1;X2,Y2
                  PLOT LINES:X1,Y1;X2,Y2
                  MOUSE POLL X2,Y2,LL,RR
               LOOP WHILE LL<>0 !'左ドラッグ
               LET RIGHT=RIGHT-(X2-X1) !'平行移動
               LET LEFT=LEFT-(X2-X1)
               LET TOP=TOP-(Y2-Y1)
               LET BOTTOM=BOTTOM-(Y2-Y1)
               PRINT "移動量 X:";X2-X1;"Y:";Y2-Y1
               SET DRAW MODE OVERWRITE
               EXIT DO
            END IF
         NEXT  Y
      NEXT  X
   LOOP
   IF R<>0 THEN
      PAUSE "拡大する範囲を指定してください"
      CALL GETSQUARE(LEFT,TOP,RIGHT,BOTTOM) !'左ドラッグで範囲指定
      IF LEFT=RIGHT  THEN EXIT DO
   END IF
LOOP
PRINT "終了します"
END

EXTERNAL SUB PSET(X,Y,C)
OPTION ARITHMETIC COMPLEX
SET POINT COLOR C
PLOT POINTS:X,Y
END SUB

EXTERNAL SUB GINIT(XSIZE,YSIZE)
OPTION ARITHMETIC COMPLEX
SET BITMAP SIZE XSIZE,YSIZE
!'SET WINDOW 0,XSIZE-1,YSIZE-1,0
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
SET COLOR MIX(0) 0,0,0
SET COLOR MIX(1) 0,0,1
SET COLOR MIX(2) 1,0,0
SET COLOR MIX(3) 1,0,1
SET COLOR MIX(4) 0,1,0
SET COLOR MIX(5) 0,1,1
SET COLOR MIX(6) 1,1,0
SET COLOR MIX(7) 1,1,1
CLEAR
END SUB

EXTERNAL SUB GETSQUARE(L,T,R,B)
OPTION ARITHMETIC COMPLEX
ASK LINE STYLE LSTYLE
SET DRAW MODE NOTXOR
SET LINE STYLE 2
DO
   MOUSE POLL L,T,I,J
LOOP WHILE I=0
LET L0=L
LET T0=T
LET R0=L0
LET B0=T0
PLOT LINES:L0,T0;L0,B0;R0,B0;R0,T0;L0,T0
DO WHILE I=1
   MOUSE POLL R,B,I,J
   LET W=R-L
   LET H=T-B
   IF ABS(H)<ABS(W) THEN
      LET B=T-SGN(H)*ABS(W)
   ELSE
      LET R=L+SGN(W)*ABS(H)
   END IF
   IF L0<>L OR R0<>R OR B0<>B OR T0<>T THEN
      PLOT LINES:L0,T0;L0,B0;R0,B0;R0,T0;L0,T0
      PLOT LINES:L,T;L,B;R,B;R,T;L,T
      LET L0=L
      LET T0=T
      LET R0=R
      LET B0=B
   END IF
LOOP
WAIT DELAY 1
PLOT LINES:L,T;L,B;R,B;R,T;L,T
SET DRAW MODE OVERWRITE
SET LINE STYLE LSTYLE
IF L>R THEN SWAP L,R
IF B>T THEN SWAP B,T
END SUB
 

Re: マンデルブロート(ジュリア)

 投稿者:yoshipyuta  投稿日:2018年 1月24日(水)16時20分53秒
  > No.4478[元記事へ]

しばっちさんへのお返事です。

> マンデルブロート(ジュリア)を描画します。
> スライドバーを19個使用し、パラメータを変化させます(Ver.7.8.1以上)
> TABキーを押すと解像度を変更します。
> ESCキーで終了します。
> 左ドラックすると平行移動します。(引っ張る感じになります)
> 右クリック後に左ドラッグで拡大範囲を指定します。
>

しばっちさんのJuria②プログラムの内容もわからないKidsが早速、下記の2つのJuliaで類似部分があることを理解したようです。

LET Z=z^3+COMPLEX(1.503,-0.8046)*z^2     下図1
LET Z=z^2+COMPLEX(-0.122561,0.744862)   下図2

Kidsは現在Newtonフラクタルの研究で頭が一杯でJuliaには手が出ないようです。スライドバー19個とは?4個のみ表示ですが。またRe(R1,R2)、Im(I1,I2)のバーが2つありますが、意味がわからないKidsです。c点を固定したらバーは動かない位しかわかりません。

このc点導入(可変・固定)をニュートン・フラクタルに導入したらKidsはパニックでしょう。LET XX=X-FUNC(X)/DIFF(X,1)+cなのか。
 

Re: マンデルブロート(ジュリア)

 投稿者:yoshipyuta  投稿日:2018年 1月26日(金)17時47分28秒
  > No.4478[元記事へ]

しばっちさんへのお返事です。

> マンデルブロート(ジュリア)を描画します。
> スライドバーを19個使用し、パラメータを変化させます(Ver.7.8.1以上)
> TABキーを押すと解像度を変更します。
> ESCキーで終了します。
> 左ドラックすると平行移動します。(引っ張る感じになります)
> 右クリック後に左ドラッグで拡大範囲を指定します。
>

このプログラムを用いてKidsは終日、2次Julia集合の探索をしています。Newton・フラクタルはしばしの休みです。赤いサンマルコ寺院と呼ばれるJulia内部に興味を持ったようです。

しばっち・Juriaプログラム②でサンマルコ寺院の中身J(z^2+complex(-0.745432,0.11321))を見ますと、下図1になります。中央部分の小さな渦の会合が見えにくい状況です。


拡大すると明瞭に渦の会合が観察されます。この描画可能でしょうか。

 

Re: マンデルブロート(ジュリア)

 投稿者:しばっち  投稿日:2018年 1月29日(月)20時10分36秒
  > No.4481[元記事へ]

yoshipyutaさんへのお返事です。

>
> 拡大すると明瞭に渦の会合が観察されます。この描画可能でしょうか。

上記サイト内にソースリストがありますので、とりあえず移植を試みてみました。
しかしながら、この言語についての知識はなく、不明な点もありパラメータも不明なので
サイト内の画像のように中心部分の拡大を2~3度繰り返すとサイト内の画像とはなんだか違う画像になりますが
サイトの内容を理解しているわけでもないのであしからず。

OPTION ARITHMETIC COMPLEX
OPTION BASE 0
LET XSIZE=1000 !'画像サイズ
LET YSIZE=1000
CALL GINIT(XSIZE,YSIZE)
DIM COUNT(XSIZE,YSIZE),FL(100)
LET KS=800
LET C=COMPLEX(-0.74543,0.11301)
LET R=(1+SQR(1+4*ABS(C)))/2
LET LEFT=-R
LET RIGHT=R
LET TOP=R
LET BOTTOM=-R
SET TEXT BACKGROUND "OPAQUE"
SET TEXT JUSTIFY "LEFT" , "TOP"
DO
   SET COLOR COLORINDEX(1,1,1)
   SET TEXT HEIGHT (TOP-BOTTOM)/5
   MAT FL=ZER
   LET KMAX=0
   LET KMIN=0
   SET WINDOW LEFT,RIGHT,BOTTOM,TOP
   CLEAR
   LET DX=(RIGHT-LEFT)/XSIZE
   LET DY=(TOP-BOTTOM)/YSIZE
   FOR ZR=LEFT TO RIGHT STEP DX
      LET P=INT((ZR-LEFT)/(RIGHT-LEFT)*100)
      IF FL(INT(P/5))=0 THEN
         PLOT TEXT ,AT LEFT,TOP:STR$(P)&"%"
         LET FL(INT(P/5))=1
      END IF
      FOR ZI=BOTTOM TO TOP STEP DY
         LET Z=COMPLEX(ZR,ZI)
         FOR K=1 TO KS
            LET Z=Z*Z+C
            IF ABS(Z)>R THEN EXIT FOR
         NEXT K
         LET X=PIXELX(ZR)
         LET Y=PIXELY(ZI)
         LET COUNT(X,Y)=K
         LET KMAX=MAX(KMAX,K)
      NEXT ZI
   NEXT ZR
   FOR ZR=LEFT TO RIGHT STEP DX
      FOR ZI=BOTTOM TO TOP STEP DY
         LET X=PIXELX(ZR)
         LET Y=PIXELY(ZI)
         LET K=COUNT(X,Y)
         LET Z=COMPLEX(ZR,ZI)
         CALL PSET(ZR,ZI,255*(K-KMIN)/(KMAX-KMIN),255*(1-(K-KMIN)/(KMAX-KMIN)),255*MIN(1,ABS(Z)/R))
      NEXT ZI
   NEXT ZR
   PAUSE "拡大する範囲を指定してください"
   CALL GETSQUARE(LEFT,TOP,RIGHT,BOTTOM)
   IF LEFT=RIGHT  THEN EXIT DO
LOOP
END

EXTERNAL SUB GINIT(XSIZE,YSIZE)
OPTION ARITHMETIC COMPLEX
SET BITMAP SIZE XSIZE,YSIZE
SET COLOR MIX(0) 0,0,0
SET COLOR MODE "NATIVE"
CLEAR
SET POINT STYLE 1
SET WINDOW 0,XSIZE-1,YSIZE-1,0
END SUB

EXTERNAL SUB PSET(X,Y,R,G,B)
OPTION ARITHMETIC COMPLEX
LET RR=MIN(255,MAX(0,INT(R)))
LET GG=MIN(255,MAX(0,INT(G)))
LET BB=MIN(255,MAX(0,INT(B)))
SET COLOR COLORINDEX(RR/255,GG/255,BB/255)
PLOT POINTS:X,Y
END SUB

EXTERNAL SUB GETSQUARE(L,T,R,B)
OPTION ARITHMETIC COMPLEX
ASK LINE STYLE LSTYLE
SET DRAW MODE NOTXOR
SET LINE STYLE 2
DO
   MOUSE POLL L,T,I,J
LOOP WHILE I=0
LET L0=L
LET T0=T
LET R0=L0
LET B0=T0
PLOT LINES:L0,T0;L0,B0;R0,B0;R0,T0;L0,T0
DO WHILE I=1
   MOUSE POLL R,B,I,J
   LET W=R-L
   LET H=T-B
   IF ABS(H)<ABS(W) THEN
      LET B=T-SGN(H)*ABS(W)
   ELSE
      LET R=L+SGN(W)*ABS(H)
   END IF
   IF L0<>L OR R0<>R OR B0<>B OR T0<>T THEN
      PLOT LINES:L0,T0;L0,B0;R0,B0;R0,T0;L0,T0
      PLOT LINES:L,T;L,B;R,B;R,T;L,T
      LET L0=L
      LET T0=T
      LET R0=R
      LET B0=B
   END IF
LOOP
WAIT DELAY 1
PLOT LINES:L,T;L,B;R,B;R,T;L,T
SET DRAW MODE OVERWRITE
SET LINE STYLE LSTYLE
IF L>R THEN SWAP L,R
IF B>T THEN SWAP B,T
END SUB
 

Re: マンデルブロート(ジュリア)

 投稿者:yoshipyuta  投稿日:2018年 1月31日(水)16時54分42秒
  > No.4485[元記事へ]

しばっちさんへのお返事です。

>
> 上記サイト内にソースリストがありますので、とりあえず移植を試みてみました。
> しかしながら、この言語についての知識はなく、不明な点もありパラメータも不明なので
> サイト内の画像のように中心部分の拡大を2~3度繰り返すとサイト内の画像とはなんだか違う画像になりますが
> サイトの内容を理解しているわけでもないのであしからず。

しばっちさんのプログラムを理解しているわけではありませんが、描画は成功と思います。%描画時間待ちはKidsをワクワクさせる良きアイディアですね。今、Kidsはしばっち・Newton プログラム②を用いてf(z)=cos(z)のフラクタルを作成しています。アトラクターが実数軸上に周期πで並んでいます。

プログラムを手直しして、解を4つほど並べて解決と思ったらしい。

LET Z1=COMPLEX(PI/2,0)
LET Z2=COMPLEX(-PI/2,0)
LET z3=COMPLEX(3*PI/2,0)
LET z4=COMPLEX(-3*PI/2,0)

EXTERNAL FUNCTION FUNC(X)
OPTION ARITHMETIC COMPLEX
LET FUNC=ccos(x)
END FUNCTION


ところが原点に近づくほど遠くのアトラクターの収束領域になるので、下図のようにのような黒領域になって正しく表示されません。すべての解nπ-π/2(n:整数)をLet文で並べるわけにもいかないので、どのように解決できますか?
 

Re: マンデルブロート(ジュリア)

 投稿者:しばっち  投稿日:2018年 2月 1日(木)21時54分19秒
  > No.4486[元記事へ]

yoshipyutaさんへのお返事です。

> プログラムを手直しして、解を4つほど並べて解決と思ったらしい。
>
> LET Z1=COMPLEX(PI/2,0)
> LET Z2=COMPLEX(-PI/2,0)
> LET z3=COMPLEX(3*PI/2,0)
> LET z4=COMPLEX(-3*PI/2,0)
>
> EXTERNAL FUNCTION FUNC(X)
> OPTION ARITHMETIC COMPLEX
> LET FUNC=ccos(x)
> END FUNCTION
>
> ところが原点に近づくほど遠くのアトラクターの収束領域になるので、下図のようにのような黒領域になって正しく表示されません。すべての解nπ-π/2(n:整数)をLet文で並べるわけにもいかないので、どのように解決できますか?


まず、COS(x)=0 の一般解 x=π/2+nπなのでxからπ/2を引いたものはπの倍数、つまりπで割り切れるので

MOD(X-PI/2,PI)=0

という式が出てきます。
但し、この時のX は複素数なのでこのままでは使えません。RE(X)やIM(X)関数を使い、許容誤差を含めて

IF ABS(IM(X))<EPS AND ABS(MOD(RE(X)-PI/2,PI))<EPS THEN

とすれば解決するかと思います。
なお、色については、一般解のNを使うのがいいと思います。

N=(RE(X)-PI/2)/PI

このままではNが整数にならないかもしれないので

N=INT((RE(X)-PI/2)/PI+.5)

と四捨五入したほうがいいかもしれません。

このNの範囲については全くわかりませんが、例えば100色ならMOD(N,100)+1とすれば1~100までの色番号を使用します。
ただし、Nは負数の場合もあるはずなので絶対値をとって MOD(ABS(N),100)+1 とするか
補数を足して MOD(N+100,100)+1 のようにすればいいかと思います。
 

Re: マンデルブロート(ジュリア)

 投稿者:yoshipyuta  投稿日:2018年 2月 2日(金)10時24分53秒
  しばっちさんへのお返事です。

>
> まず、COS(x)=0 の一般解 x=π/2+nπなのでxからπ/2を引いたものはπの倍数、つまりπで割り切れるので
>
> MOD(X-PI/2,PI)=0
>
> という式が出てきます。
> 但し、この時のX は複素数なのでこのままでは使えません。RE(X)やIM(X)関数を使い、許容誤差を含めて
>
> IF ABS(IM(X))<EPS AND ABS(MOD(RE(X)-PI/2,PI))<EPS THEN
>
> とすれば解決するかと思います。

懇切なご指導ありがとうございます。わがKidsは最新のしばっち・Juliaプログラム②に夢中です。

ご返事中の色の取り扱いが分からなくて(プログラム上で)、ガムシャラKidsはどうも安易に解を左右に16個並べて、この問題をスルーするらしいのです(下図、未完成)。

まあ、それはそれでプログラムを触ると様々なことが可能になるということが分かれば、ひとつの成果であります。
 

Re: マンデルブロート(ジュリア)

 投稿者:yoshipyuta  投稿日:2018年 2月 2日(金)10時46分50秒
  > No.4485[元記事へ]

しばっちさんへのお返事です。

> 上記サイト内にソースリストがありますので、とりあえず移植を試みてみました。
> しかしながら、この言語についての知識はなく、不明な点もありパラメータも不明なので
> サイト内の画像のように中心部分の拡大を2~3度繰り返すとサイト内の画像とはなんだか違う画像になりますが
> サイトの内容を理解しているわけでもないのであしからず。

しばっちさん、このプログラムはKidsにはかなり面白いようです。朝から晩までDR.Michel BeckerとともにJuliaの美しさに堪能のようですが探索はかなりむずかしそうです。

まずはC=complex(0.100,0.0700),LET Z=(Z^5-C*Z+0.09)/Z^3です。正に宇宙におけるRandom Walkです(上段の図)。但しプログラム出力図は見えにくいのでPhotoshopで色を変えています。

これをC=complex(0.0100,0.0702),LET Z=(Z^5-C*Z+0.09)/Z^3では何やら暗青色の海が見えてきます(中断の図)。

Tune-upすると超新星星雲のなかになんとDouadyのウサギが出現します。

 

Re: マンデルブロート(ジュリア)

 投稿者:yoshipyuta  投稿日:2018年 2月 8日(木)00時10分52秒
  > No.4485[元記事へ]

しばっちさんへの質問です。

>
> >
> > 拡大すると明瞭に渦の会合が観察されます。この描画可能でしょうか。
>
> 上記サイト内にソースリストがありますので、とりあえず移植を試みてみました。
> しかしながら、この言語についての知識はなく、不明な点もありパラメータも不明なので
> サイト内の画像のように中心部分の拡大を2~3度繰り返すとサイト内の画像とはなんだか違う画像になりますが
> サイトの内容を理解しているわけでもないのであしからず。

移植に成功したJuliaプログラムでKidsが困っています。大半の関数形では正しく表示されるのですが、中には手ごわいものがあります。どうも次数が上がるとパターンがはっきりとでないのです。たとえば次の関数のジュリア集合の場合です。


LET Z=z^7+z^3+0.01/z

で上段の図が得られます。かなり薄くパターンが出ており、これはPhotoshopでもお手上げです。

Dr.MihaelBeckerによると下段のような明確なパターンであると主張しています。精度KSの問題でもないようです。白黒ラインでラインを強く出す方法は考えられませんか?
 

Re: マンデルブロート(ジュリア)

 投稿者:しばっち  投稿日:2018年 2月 8日(木)20時18分45秒
  > No.4496[元記事へ]

yoshipyutaさんへのお返事です。

> Dr.MihaelBeckerによると下段のような明確なパターンであると主張しています。精度KSの問題でもないようです。白黒ラインでラインを強く出す方法は考えられませんか?

一般的な方法ではないのなら、特殊な方法で収束判定しているとしか思えません。
どこかにその方法が記されていない限り、理論も理解していない素人がその方法を思いつくことはありえません。
素人の私には残念ながら分かりません。yoshipyutaさんの方が、このjulia集合に関して詳しいのではないでしょうか。
ネット上にその回答があるのかは分かりませんが、ネットで調べるなりDr.MihaelBeckerの文献等を調べるかしない限り、
その方法は分からないと思います。
 

Re: マンデルブロート(ジュリア)

 投稿者:yoshipyuta  投稿日:2018年 2月 9日(金)10時27分49秒
  > No.4500[元記事へ]

しばっちさんへのお返事です。

> yoshipyutaさんへのお返事です。
>
> > Dr.MihaelBeckerによると下段のような明確なパターンであると主張しています。精度KSの問題でもないようです。白黒ラインでラインを強く出す方法は考えられませんか?
>
> 一般的な方法ではないのなら、特殊な方法で収束判定しているとしか思えません。
> どこかにその方法が記されていない限り、理論も理解していない素人がその方法を思いつくことはありえません。
> 素人の私には残念ながら分かりません。yoshipyutaさんの方が、このjulia集合に関して詳しいのではないでしょうか。
> ネット上にその回答があるのかは分かりませんが、ネットで調べるなりDr.MihaelBeckerの文献等を調べるかしない限り、その方法は分からないと思います。

ご迷惑をおかけしています。この問題は恐らく収束法判定の問題ではなくてTechnial Colouringの選択か?と思います。Dr.Mihael BeckerはソースCodeを公開していないので分かりませんが、点Plotではなく、J境界を陰関数表示している?まさかトレースではないと思いますが。

類似問題は実はNewton Fractalでもあります。しばっち・Newtonプログラム②でf(z)=z^3-2*z+2,R = 0.98を描くと上段の図が得られます。骨格ラインのみを強調すると(どうやって?)下段の図となります。

次のサイトのDistance Shadingという手法かな?と思ったりします。Codeも公開しています。



function colourDistance
parameters: h, s, v: real: components of the HSV colour space;
    distance: real: the distance estimate calculated during iteration;
    pixelWidth: real: the width represented by a pixel on the screen;
    boundaryFraction: real: value > 0 used to control prominence of the boundary

let:
    dScale = log2(distance / pixelWidth),
    factor = 0;

if (dScale > 0) {
    factor = 1;
}
else if (dScale > -boundaryFraction) {
    factor = (boundaryFraction + dScale) / boundaryFraction;
}

// Darken v when factor < 1
return hsv2rgb(h, s, v * factor);

私やKidsにはさっぱり分かりませんので、是非チャレンジされて、お示しください。次のRoot Finding法も興味深い。

Finding Complex Roots of a Function
Basin colouring for Newtonian fractals requires us to know the roots of the function before we generate the fractal.

We can also anticipate a future requirement of identifying critical points of a function for generating Mandelbrot sets. Therefore, we need a generic root finding algorithm. This algorithm uses - what else? - Newton's method.

definition rootObject
properties: x: the real component of z;
    y: the imaginary component of z;
    r: the modulus of z;
    theta: the angle of z

function findRoots
parameters: f: a pointer to a function that takes a complex number, z, and computes f(z);
    fprime: a pointer to a function that takes a complex number, z, and computes f?(z)
constants: XMAX, XMIN, YMAX, YMIN: the limits of the complex plane to be tested

let:
    eV = 1e-8,
    // For checking suspiciously small real / imaginary components
    delta = eV * 100,
    // For comparing roots found
    tolerance = delta * 100,
    rSpan = XMAX - XMIN,
    iSpan = YMAX - YMIN,
    // If we don't find a root after n iterations, give up and move on
    iterations = 100,
    // We'll test this many points in the x- and y- axes
    points = 30,
    rInt = rSpan / points,
    iInt = iSpan / points,
    roots = [];

// Test a reasonably large sample of points in the plane; assuming that we only have to
// do this when we regenerate a fractal, we can use a conservatively large value to minimize
// the chances of failing to find distinct roots that are close to each other
for (i = 0..points) {
    for(j = 0..points) {
        let:
            x = XMIN + i * rInt,
            y = YMIN + j * iInt,
            diff = 1,
            iter = 0;

        while (iter < iterations AND diff > eV) {
            // Get the numerator and denominator
            [nomX, nomY] = f(x, y);
            [denomX, denomY] = fprime(x, y);

            // Divide f(z) by f'(z) - multiply through by conjugate of denominator
            tmp = nomX * denomX + nomY * denomY;
            nomY = nomY * denomX - nomX * denomY;
            nomX = tmp;
            denomX = denomX * denomX + denomY * denomY;
            if (!denomX) {
                // Try another number
                break;
            }
            // Now we can divide
            _x = x - nomX / denomX;
            _y = y - nomY / denomX;

            // Get the differences from last round
            diffX = x - _x;
            diffY = y - _y;
            diff = sqrt(diffX * diffX + diffY * diffY);
            // Set up the next guess
            x = _x;
            y = _y;
            ++iter;
        }

        if (diff < eV) {
            let:
                newRoot = TRUE;
            // Zero suspiciously small real / imaginary components so that the roots can
            // be sorted deterministically
            if (abs(x) < delta) {
                x = 0;
            }
            if (abs(y) < delta) {
                y = 0;
            }
            for (k = 0..LENGTH(roots)) {
                if (complexCompare(x, y, roots[k].x, roots[k].y, tolerance)) {
                    newRoot = FALSE;
                    break;
                }
            }
            if (newRoot) {
                push(roots, rootObject{ x : x, y : y, r : sqrt(x * x + y * y), theta : atan2(y, x) });
            }
        }
    }
}

SORT roots;
return roots;
 

Re: マンデルブロート(ジュリア)

 投稿者:yoshipyuta  投稿日:2018年 2月 9日(金)11時30分47秒
  > No.4500[元記事へ]

しばっちさんへのお返事です。

> yoshipyutaさんへのお返事です。
>
> > Dr.MihaelBeckerによると下段のような明確なパターンであると主張しています。精度KSの問題でもないようです。白黒ラインでラインを強く出す方法は考えられませんか?
>
> 一般的な方法ではないのなら、特殊な方法で収束判定しているとしか思えません。
> どこかにその方法が記されていない限り、理論も理解していない素人がその方法を思いつくことはありえません。
> 素人の私には残念ながら分かりません。yoshipyutaさんの方が、このjulia集合に関して詳しいのではないでしょうか。
> ネット上にその回答があるのかは分かりませんが、ネットで調べるなりDr.MihaelBeckerの文献等を調べるかしない限り、その方法は分からないと思います。


カリンさんが2010年に公開されている以下のCodeにも、参考になるかも知れません。なんとNewton Fractalの境界を光り輝くラインで描画しています。是非、しばっち流に改善してFractal研究に使わせて下さい。

!10進BASIC専用
!任意の範囲をドラッグ+正方形クリックで拡大操作
!
!カラーコード 193色(RGB)
data 000000
data FF0000,FF0800,FF1000,FF1800,FF2000,FF2800,FF3000,FF3800,FF4000,FF4800,FF5000,FF5800,FF6000,FF6800,FF7000,FF7800
data FF8000,FF8800,FF9000,FF9800,FFA000,FFA800,FFB000,FFB800,FFC000,FFC800,FFD000,FFD800,FFE000,FFE800,FFF000,FFF800
data FFFF00,F8FF00,F0FF00,E8FF00,E0FF00,D8FF00,D0FF00,C8FF00,C0FF00,B8FF00,B0FF00,A8FF00,A0FF00,98FF00,90FF00,88FF00
data 80FF00,78FF00,70FF00,68FF00,60FF00,58FF00,50FF00,48FF00,40FF00,38FF00,30FF00,28FF00,20FF00,18FF00,10FF00,08FF00
data 00FF00,00FF08,00FF10,00FF18,00FF20,00FF28,00FF30,00FF38,00FF40,00FF48,00FF50,00FF58,00FF60,00FF68,00FF70,00FF78
data 00FF80,00FF88,00FF90,00FF98,00FFA0,00FFA8,00FFB0,00FFB8,00FFC0,00FFC8,00FFD0,00FFD8,00FFE0,00FFE8,00FFF0,00FFF8
data 00FFFF,00F8FF,00F0FF,00E8FF,00E0FF,00D8FF,00D0FF,00C8FF,00C0FF,00B8FF,00B0FF,00A8FF,00A0FF,0098FF,0090FF,0088FF
data 0080FF,0078FF,0070FF,0068FF,0060FF,0058FF,0050FF,0048FF,0040FF,0038FF,0030FF,0028FF,0020FF,0018FF,0010FF,0008FF
data 0000FF,0800FF,1000FF,1800FF,2000FF,2800FF,3000FF,3800FF,4000FF,4800FF,5000FF,5800FF,6000FF,6800FF,7000FF,7800FF
data 8000FF,8800FF,9000FF,9800FF,A000FF,A800FF,B000FF,B800FF,C000FF,C800FF,D000FF,D800FF,E000FF,E800FF,F000FF,F800FF
data FF00FF,FF00F8,FF00F0,FF00E8,FF00E0,FF00D8,FF00D0,FF00C8,FF00C0,FF00B8,FF00B0,FF00A8,FF00A0,FF0098,FF0090,FF0088
data FF0080,FF0078,FF0070,FF0068,FF0060,FF0058,FF0050,FF0048,FF0040,FF0038,FF0030,FF0028,FF0020,FF0018,FF0010,FF0008

declare sub shift_sfn
declare sub fpr_sfn
declare sub select_area
declare sub updateparam
declare sub draw_area
declare sub tdraw_area
declare sub flood_area
declare sub draw_point
declare sub pointdraw
declare sub draw_side
declare sub draw_inside
declare sub draw_srline
declare sub printdata

set point style 1
set color mode "native"
set draw mode explicit
option base 0
option arithmetic complex

declare function fcos !複素数拡張 cos() 関数
declare function fsin !複素数拡張 sin() 関数

let   cnum = 193        !色数(64×3+1)
let    kcn = cnum-1
let kcolor = 1/255      !RGB指数変換定数(24bits)
dim ind(kcn)            !色指標用配列
let undolimit = 100
let ul = undolimit
let lv = 0
dim graphics(ul)
dim realpartmin(ul),imaginarypartmin(ul)
dim realpartmax(ul),imaginarypartmax(ul)
dim repeatlimit(ul),uupdate(ul)

!━━━━━━━━━━━━━━━━━━━━━━━━━━━カラーコードを色指標に変換━━━━━━━━━━━━━━━━━━━━
for g1 = 0 to kcn
   read cl$
   let r = bval(cl$(1:2),16)*kcolor
   let g = bval(cl$(3:4),16)*kcolor
   let b = bval(cl$(5:6),16)*kcolor
   let ind(g1) = colorindex(r,g,b)
next g1


!━━━━━━━━━━━━━━━━━━━━━━━━━━━境界走査―境界描画と境界判定━━━━━━━━━━━━━━━━━━━
sub draw_side
   for gx = mgx to mgxp
      let gxf = gx1 + krg*gx
      let  gy = mgy
      let gyf = gy1 + krg*gy
      call draw_point!<--------------------------------draw_point -> pointdraw で判定
      let  gy = mgyp
      let gyf = gy1 + krg*gy
      call draw_point!<--------------------------------draw_point -> pointdraw で判定
   next gx

   for gy = mgy1 to mgym
      let gyf = gy1 + krg*gy
      let  gx = mgx
      let gxf = gx1 + krg*gx
      call draw_point!<--------------------------------draw_point -> pointdraw で判定
      let  gx = mgxp
      let gxf = gx1 + krg*gx
      call draw_point!<--------------------------------draw_point -> pointdraw で判定
   next gy
end sub


!━━━━━━━━━━━━━━━━━━━━━━━━━━━境界走査―内部の描画━━━━━━━━━━━━━━━━━━━━━━━
sub draw_inside(grx,gry)
   let  mgy = mgyt*grc
   let mgyp = mgy+gry-1
   let mgy1 = mgy+1
   let mgym = mgyp-1
   let sign = 1
   call draw_side!<------------------------------------境界の計算、描画と判定
   if sign = 1 then!-----------------------------------境界点がすべて非収束か非発散の場合内部も同様とみなす
      call flood_area(mgx,mgy,mgx+grx-1,mgy+gry-1,ind(0))
   else!<----------------------------------------------sign = 0 のときの内部計算と描画
      for gx = mgx1 to mgxm
         let gxf = gx1 + krg*gx
         for gy = mgy1 to mgym
            let gyf = gy1 + krg*gy
            call draw_point
         next gy
      next gx
   end if
end sub


!━━━━━━━━━━━━━━━━━━━━━━━━━━━境界走査―各列描画━━━━━━━━━━━━━━━━━━━━━━━━
sub draw_srline(grx1,gry1,gry2)
   set draw mode hidden
   let  mgx = mgxt*grc
   let mgxp = mgx+grx1-1
   let mgx1 = mgx+1
   let mgxm = mgxp-1
   call flood_area(mgx,0,mgxp,wx,colorindex(1,1,1))!<---塗りつぶしを上手くするために描画する部分を消す

   for mgyt = 0 to div
      call draw_inside(grx1,gry1)
   next mgyt
   !---------------------------------------------------画像サイズが境界サイズで割り切れない場合の余り部分の描画
   if gmod = 1 then
      call draw_inside(grx1,gry2)
   end if
   set draw mode explicit
end sub


!━━━━━━━━━━━━━━━━━━━━━━━━━━━収束回数による色分けと点の描画━━━━━━━━━━━━━━━━━━
sub pointdraw
!------------------------------------------------------収束しないまたは振動の場合
   if k = pn then
      let nb = 0
   else
   !---------------------------------------------------収束または発散した場合 k が収束か発散までの反復回数
      let   nb = mod(k,kcn) + 1
      let sign = 0!<-----------------------------------収束か発散した点が存在したとき sign = 0 として内部計算も行う
   end if
   set color ind(nb)
   plot points :gx,gy
end sub


!━━━━━━━━━━━━━━━━━━━━━━━━━━━数列 z(n) の収束、振動及び発散の判定と描画━━━━━━━━━━━━
sub draw_point
   when exception in
      let  c = complex(gxf,gyf)
      call fpr_sfn
      let zd = 1
      let  k = 1
      !------------------------------------------------収束、発散の判定文
      do while k =< num and abs(zd) > mindt and abs(zd) < maxdt
         let gz = z
         call shift_sfn
         let zd = z-gz
         let  k = k + 1
      loop
      !------------------------------------------------
      call pointdraw
   use
      call pointdraw
   end when
end sub


!━━━━━━━━━━━━━━━━━━━━━━━━━━━拡大範囲選択の四角の描画━━━━━━━━━━━━━━━━━━━━━
sub tdraw_area
   call draw_area(x1,y1,x1+trangex,y1+trangey,colorindex(0,0,1))
end sub


!━━━━━━━━━━━━━━━━━━━━━━━━━━━描画データの表示━━━━━━━━━━━━━━━━━━━━━━━━━
sub printdata
   print "実部       "&str$(gx1)&"≦Re≦"&str$(gx2)
   print "虚部       "&str$(gy1)&"≦Im≦"&str$(gy2)
   print "幅         "&str$(xrange)
   print "中心座標   ("&str$(lpx1)&","&str$(lpy1)&")"
   print "色数       "&str$(cnum)&"色"
   print "画像サイズ "&str$(wx)&"pixel×"&str$(wx)&"pixel"
   print "境界走査幅 "&str$(grc)&"pixel"
   print "計算回数   "&str$(num)&"回"
end sub


!━━━━━━━━━━━━━━━━━━━━━━━━━━━拡大部分の選択と画像保存、終了の操作をする━━━━━━━━━━━━
sub select_area
   let  left = 0
   let right = 0
   do while left = 0 and right = 0
      mouse poll dx1,dy1,left,right
   loop
   if right = 1 then
      if lu <> 1 then
         let lu = lu - 1
         set draw mode hidden
         gload "~table"&str$(lu)&".bmp"
         set draw mode explicit
         set draw mode notxor
         let wx = graphics(lu)
         set window 0,wx-1,0,wx-1
      end if
   end if

   if left = 1 then
      set draw mode notxor
      let      x1 = dx1
      let      y1 = dy1
      let      x2 = x1
      let      y2 = y1
      let  update = 1
      let trangex = 0
      let trangey = 0
      call tdraw_area
      set draw mode hidden
      do while left = 1
         mouse poll x3,y3,left,right
         if x3 <> x2 or y3 <> y2 then
            set draw mode hidden
            call tdraw_area
            let  trange = max(abs(x1-x3),abs(y1-y3))
            let trangex = sgn(x3-x1)*trange
            let trangey = sgn(y3-y1)*trange
            set draw mode explicit
            call tdraw_area
            let x2 = x3
            let y2 = y3
         end if
      loop

      if x1 = x2 and y1 = y2 then
         if lu <> lv then
            let lu = lu + 1
            set draw mode hidden
            gload "~table"&str$(lu)&".bmp"
            set draw mode explicit
            set draw mode notxor
            let wx = graphics(lu)
            set window 0,wx-1,0,wx-1
         end if
         exit sub
      end if

      let left = 0
      let right = 0
      do while left = 0 and right = 0
         mouse poll x4,y4,left,right
      loop
      let gx41 = sgn(x4-x1)
      let tx41 = sgn(x4-x1-trangex)
      let gy41 = sgn(y4-y1)
      let ty41 = sgn(y4-y1-trangey)
      if left = 1 then
         if gx41 <> tx41 and gy41 <> ty41 then
            let cont = 1
         else
            let cont = 0
            call tdraw_area
         end if
      end if

      if right = 1 then
         if gx41 <> tx41 and gy41 <> ty41 then
            call updateparam
            let cont = 1
         else
            let cont = 0
            call tdraw_area
            do while right = 1
               mouse poll x5,y5,left,right
            loop
         end if
      end if
   end if
end sub
!━━━━━━━━━━━━━━━━━━━━━━━━━━━描画範囲変更に伴う各値の更新━━━━━━━━━━━━━━━━━━━
sub updateparam
   input prompt "繰り返しの回数、画像サイズ、境界走査サイズ":num,wx,grc
   let cont = 1
   if mod(wx,grc) <> 0 then
      let gmod = 1
      let  grm = mod(wx,grc)
   else
      let gmod = 0
   end if
   let uupdate(lu) = 1
end sub


!━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
!------------------------------------------------------初期値
let      wx = 556      !グラフィックス画面の横画素数
let      wy = wx       !グラフィックス画面の縦画素数
let     num = 256      !反復計算回数の上限
let   lpx1_ = 0.0000001!グラフィックス画面の中心の実座標
let   lpy1_ = 0.0000001!グラフィックス画面の中心の虚座標
let xrange_ = 8        !グラフィックス画面に割り当てる複素平面の範囲(初回描画時)
let   mindt = 1e-10    !|z(n)-z(n+1)|=<mindtの時収束と判定する
let   maxdt = 1e+10    !|z(n)-z(n+1)|>=maxdtの時発散と判定する
let     grc = 10       !描画中再描画するまで計算するライン数
let     grt = 1        !描画ラインカウント変数
let     grm = 0
let    lpx1 = lpx1_
let    lpy1 = lpy1_
let  xrange = xrange_
let      zd = 1        !|z(n)-z(n+1)|を代入する変数
let    gmod = 0
set bitmap size wx,wx

let gx1 = lpx1 - xrange/2
let gy1 = lpy1 - xrange/2
let gx2 = lpx1 + xrange/2
let gy2 = lpy1 + xrange/2

let count = 0
let wx_ = wx+1
let i = complex(0,1)       !虚数単位
if mod(wx,grc) <> 0 then
   let gmod = 1
   let grm = mod(wx,grc)
end if

call printdata
!━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
do while count <> 1
   set draw mode overwrite
   if wx <> wx_ then set bitmap size wx,wx
   set window 0,wx-1,0,wx-1
   let wx_ = wx

   let krg = xrange/wx
   let pn = num + 1

   let start_time = time
   let div = int(wx/grc)-1
   let lv = lv + 1
   let graphics(lv) = wx
   let realpartmin(lv) = gx1
   let imaginarypartmin(lv) = gy1
   let realpartmax(lv) = gx2
   let imaginarypartmax(lv) = gy2
   let repeatlimit(lv) = num
   !---------------------------------------------------描画総括
   for mgxt = 0 to div
      call draw_srline(grc,grc,grm)
   next mgxt

   if gmod = 1 then
      call draw_srline(grm,grc,grm)
   end if
   !---------------------------------------------------拡大操作
   set draw mode explicit
   set draw mode notxor

   print "計算時間   "&str$(round(time-start_time,3))&"秒"
   print
   gsave "~table"&str$(lv)&".bmp"
   let lu = lv
   let cont = 0
   do while cont = 0
      do while left = 1 or right = 1
         mouse poll dxu,dyu,left,right
      loop
      call select_area
   loop
   if lv <> lu and uupdate(lu) = 0 then
      let  lv = lu
      let  wx = graphics(lu)
      let  gx1 = realpartmin(lu)
      let  gy1 = imaginarypartmin(lu)
      let  gx2 = realpartmax(lu)
      let  gy2 = imaginarypartmax(lu)
      let  num = repeatlimit(lu)
      let  krg = abs(gx1-gx2)/wx
   end if
   !---------------------------------------------------描画範囲変更に伴う各値の更新
   if update = 1 then
      let    gx1_= gx1
      let    gy1_= gy1
      let    gx1 = gx1_+min(x1,x1+trangex)*krg
      let    gy1 = gy1_+min(y1,y1+trangey)*krg
      let    gx2 = gx1_+max(x1,x1+trangex)*krg
      let    gy2 = gy1_+max(y1,y1+trangey)*krg
      let   lpx1 = (gx1+gx2)/2
      let   lpy1 = (gy1+gy2)/2
      let xrange = abs(trangex)*krg
      let update = 0
   end if
   !---------------------------------------------------
   call printdata
   let uupdate(lu) = 0
loop


!━━━━━━━━━━━━━━━━━━━━━━━━━━━長方形を作る━━━━━━━━━━━━━━━━━━━━━━━━━━━
sub draw_area(x1,y1,x2,y2,cind)
   set color cind
   plot lines : x1,y1 ; x1,y2 ; x2,y2 ; x2,y1 ; x1,y1
end sub


!━━━━━━━━━━━━━━━━━━━━━━━━━━━長方形塗りつぶし━━━━━━━━━━━━━━━━━━━━━━━━━
sub flood_area(x1,y1,x2,y2,cind)
   set area color cind
   plot area : x1,y1 ; x1,y2 ; x2,y2 ; x2,y1 ; x1,y1
end sub


!━━━━━━━━━━━━━━━━━━━━━━━━━━━複素三角関数━━━━━━━━━━━━━━━━━━━━━━━━━━━
function fsin(z_)
   let fsin = (exp(i*z_)-exp(-i*z_))/(2*i)
end function

function fcos(z_)
   let fcos = (exp(i*z_)+exp(-i*z_))/2
end function

!━━━━━━━━━━━━━━━━━━━━━━━━━━━数列z(n)の反復式━━━━━━━━━━━━━━━━━━━━━━━━━
sub shift_sfn
   let z2 = z*z
   LET z = z-(z3*z2+z*z2*c+c)/(5*z2*z2+3*z2*c)
end sub


!━━━━━━━━━━━━━━━━━━━━━━━━━━━数列z(n)の初期値と複素数の変換式━━━━━━━━━━━━━━━━━
sub fpr_sfn
!   let c = c
   let z = -c/2 !数列z(n)の初期値
end sub
end




 
 

戻る