メインコンテンツへスキップ
見出し画像

今週のフラクタル90((x^2-y^2+a,2(x^2-y^2+a)y+b) 他)

    どうも、108Hassiumです。

    今回は(x2−y2+a,2(x2−y2+a)y+b)(x^2-y^2+a,2(x^2-y^2+a)y+b)に関するフラクタル図形を紹介します。

    (x^2-y^2+a,2(x^2-y^2+a)y+b)

    画像
    ☝(x^2-y^2+a,2(x^2-y^2+a)y+b)のマンデルブロ集合


    画像
    ☝(x^2-y^2+a,2(x^2-y^2+a)y+b)の(a,b)=(-1.48,0)のジュリア集合
    画像
    ☝(x^2-y^2+a,2(x^2-y^2+a)y+b)の(a,b)=(-0.17,0.77)のジュリア集合
    画像
    ☝(x^2-y^2+a,2(x^2-y^2+a)y+b)の(a,b)=(-1.11,0.55)のジュリア集合
    画像
    ☝(x^2-y^2+a,2(x^2-y^2+a)y+b)の(a,b)=(-1.23,0.3)のジュリア集合
    画像
    ☝(x^2-y^2+a,2(x^2-y^2+a)y+b)の(a,b)=(-1.2,0.38)のジュリア集合


    画像
    ☝(x^2-y^2+a,2(x^2-y^2+a)y+b)の(a,b)=(-0.19,0.83)のジュリア集合
    画像
    ☝(x^2-y^2+a,2(x^2-y^2+a)y+b)の(a,b)=(-1.2,0.39)のジュリア集合


    画像
    ☝(x^2-y^2+a,2(x^2-y^2+a)y+b)の(a,b)=(-0.18,0.83)のジュリア集合
    画像
    ☝(x^2-y^2+a,2(x^2-y^2+a)y+b)の(a,b)=(-1.15,0.47)のジュリア集合


    (x^2-(2xy+b)^2+a,2xy+b)

    画像
    ☝(x^2-(2xy+b)^2+a,2xy+b)のマンデルブロ集合


    画像
    ☝(x^2-(2xy+b)^2+a,2xy+b)の(a,b)=(-1.48,0)のジュリア集合
    画像
    ☝(x^2-(2xy+b)^2+a,2xy+b)の(a,b)=(-1.22,0.47)のジュリア集合
    画像
    ☝(x^2-(2xy+b)^2+a,2xy+b)の(a,b)=(-1.23,0.35)のジュリア集合
    画像
    ☝(x^2-(2xy+b)^2+a,2xy+b)の(a,b)=(-0.24,0.81)のジュリア集合
    画像
    ☝(x^2-(2xy+b)^2+a,2xy+b)の(a,b)=(-1.25,0.32)のジュリア集合


    画像
    ☝(x^2-(2xy+b)^2+a,2xy+b)の(a,b)=(-0.19,0.83)のジュリア集合


    画像
    ☝(x^2-(2xy+b)^2+a,2xy+b)の(a,b)=(-0.18,0.83)のジュリア集合
    画像
    ☝(x^2-(2xy+b)^2+a,2xy+b)の(a,b)=(-1.22,0.35)のジュリア集合

    マンデルブロ集合あるある?

    以下のコードは、Processingで(z2+cz^2+cの)マンデルブロ集合を描画するコードです。

    void setup(){
      size(2000,2000);
      background(0);
      noStroke();
      double x,y,px,py,a,b;
      boolean o;
      for(int k=0;k<2000;k++){
        for(int m=0;m<2000;m++){
          a=(double)k/500.0-2.0;
          b=(double)m/500.0-2.0;
          x=0;
          y=0;
          o=true;
          for(int n=1;n<=500&&o;n++){
            px=x;
            py=y;
            x=px*px-py*py+a;
            y=2.0*px*py+b;
            if(x*x+y*y>4){
              o=false;
              fill(255);
              rect(k,m,1,1);
            }
          }
        }
      }
    }

    ※☟解説

    このコードのうち、zn+1=zn2+cz_{n+1}=z_n^2+cという数列を計算しているのは以下の部分です。

    ...
            px=x;
            py=y;
            x=px*px-py*py+a;
            y=2.0*px*py+b;
    ...

    xとyがzn+1z_{n+1}の実部と虚部で、znz_nの値はpxとpyに保存しています。

    ところで、この部分を以下のように書き換えるとどんな画像が生成されるでしょうか?

    ...
            x=x*x-y*y+a;
            y=2.0*x*y+b;
    ...

    正解はこうです。

    画像

    x*x-y*y+aの値は書き換え前と同様に正しく計算されますが、次の行のyの計算では更新後のxの値が使われるので、結局(x2−y2+a,2(x2−y2+a)y+b)(x^2-y^2+a,2(x^2-y^2+a)y+b)のマンデルブロ集合が描画されます。

    独学でz2+cz^2+cのマンデルブロ集合の描画に挑戦した経験のある人の中には、間違って(x2−y2+a,2(x2−y2+a)y+b)(x^2-y^2+a,2(x^2-y^2+a)y+b)のマンデルブロ集合を描画してしまったことのある人もいるのではないでしょうか。(私もあります)

    ちなみに(x2−(2xy+b)2+a,2xy+b)(x^2-(2xy+b)^2+a,2xy+b)は、xとyの計算順序を逆にすることで描画されます。


     
     
    数学関係の記事を書きます。毎週日曜更新予定。

    あなたへのおすすめ