Matlabでのフラクタル形状の構築

「人間からの反復。 再帰は神からです。」L。Peter Deutsch



はじめに



私たちの多くはフラクタルについて聞いたことがありますが、多くの人はこれらの驚くべき数学的対象と自然の物理的構造との密接な関係についてかなり明確な考えさえ持っていると思います。 しかし、この記事では、この問題の研究と哲学的側面に触れたいと思います。 単純な数式を使用して複雑な平面に複雑なパターンを生成するだけの可能性は非常に魅力的であり、これが実際に記事の執筆につながりました。 数行のコードを記述したら、PCのビットグリッドの最下部に移動して、スケーラブルなフラクタルパターンを調べることができます。



フラクタルについて



BBCサイクル(カオスの秘密の生活)のプログラムの1つでは、このビデオの著者ではなく、アランチューリングとカオス理論のエドワードローレンツの父によって興味深い考えが位置付けられました。 結局のところ、多数の接続と要素(均一なものも含む)を持つ複雑なシステムには、予測可能性のしきい値があります。 これはどういう意味ですか? 最も単純な構造と決定論的ロジックの組み合わせにより、出力で非常に複雑な動作が生じる可能性があります。 これはほとんどの場合です。単純な再帰関係Z [i + 1] = Z [i] ^(n)+ C、i = 1、2、... infを取ります 。Cは複素数、 Z [0] = 0 、いくつかの量は有限であり、いくつかは無限に達することがわかります(選択したCに依存)。 以下はコードで、より明確になります。 非常に興味深いのは、発散境界上のポイントの動作です。 それらは複雑で、時には自己反復パターンを形成します。このパターンは、スケーリングの度合いが大きくなると変化し、無限の動的パターンを生成します。 これらの図を観察したり、多項式の次数を変更したり、再帰的な式に新しい関数を入れたりするのは興味深いことです。非常に興味深い写真を得ることができます。



コード記述



スクリプトfractal.mを作成することから始めましょう。画像サイズを500x500ピクセルに設定してみましょう。領域[-2、1]は興味深いものです。 実軸に沿って、[-1.5、1.5]; 虚軸に沿って、その中でフラクタルを観察します。 系列の合計がこの正方形の境界を超える場合、系列は発散すると見なします。

image_size = 500; bound_re = [-2, 1]; bound_im = [-1.5, 1.5];
      
      







次に、 draw_fractal関数を使用してフラクタルを描画します。後で検討します。 境界ボックスと入力の画像のサイズを取ります。 この関数は、拡大された領域で再計算されたピクセルサイズを返します。 pb_re pb_im-虚軸と実軸に沿ったピクセルの数学的サイズ。 次に、 getrectcurrent_point 、ズーム長方形の左上の点を使用して近似する領域を選択し、マウスで指定された境界ボックスの幅と高さを取得します。 bound_rebound_imは、問題の領域の新しい境界です(最初のものと同様)。 その後、すべてが繰り返されます。



 while(1) [pb_re pb_im] = draw_fractal(bound_re, bound_im, image_size); rect = getrect; current_point = complex(bound_re(1) + rect(1) * pb_re - 0.5 * pb_re , ... bound_im(1) + rect(2) * pb_im - 0.5 * pb_im); current_width = rect(3) * pb_re; current_height = rect(4) * pb_im; bound_re = [real(current_point), real(current_point) + current_width]; bound_im = [imag(current_point), imag(current_point) + current_height]; end
      
      







draw_fractal.m関数は、ピクセルpixel_bounds_reおよびpixel_bounds_imに対応する数学的なサイズを計算します。次に、画像マトリックスに沿って、関数[color] = is_a_m_point(current_point)を使用して、ピクセルボックスの中心にあるポイントの数学的なセットを各ポイントについて検討します。それが無限大かどうか。



 function [pixel_bounds_re, pixel_bounds_im]=draw_fractal( bound_re, bound_im, image_size) pixel_bounds_re = (bound_re(2) - bound_re(1) ) / image_size; pixel_bounds_im = (bound_im(2) - bound_im(1) ) / image_size; frac = zeros([image_size, image_size]); parfor re = 1 : image_size for im = 1 : image_size current_point = complex(bound_re(1) + re * pixel_bounds_re - 0.5 * pixel_bounds_re , bound_im(1) + ... im * pixel_bounds_im - 0.5 * pixel_bounds_im); [color] = is_a_m_point(current_point); frac(im,re) = color; end end frac = mat2gray(frac); imshow(frac); end
      
      







さらに、ポイントがより速く無限に逃げるほど明るくなり、これはis_a_m_point.m関数から見ることができます再帰式Z [i + 1] = Z [i] ^(n)+ Cから定数Cを受け取ります関数は色の色を返すことです-系列がより速く発散するほど、色がより明るくなります。ポイントが境界[-2 1](実軸)[-1.5 1.5](虚軸)から逃れる場合、系列は発散すると考えられます。 Z [0] = 0であると考えており、シリーズでは50個の数字を要約しています(原則として、シリーズが発散するかどうかを理解するにはこれで十分です)。



 function [ color] = is_a_m_point( constant ) color = 0; z = 0; %  Z[0] for i = 1 : 50 z = z^(2) / (1 + z + z^(4)) + constant; %    if real(z) < -2 || real(z) > 1 || imag(z) > 1.5 || imag(z) < -1.5 color = 255 - 5.5 * (i - 1); return; end end end
      
      







以上です。 いくつかのスクリプトを書いた後、リラックスして、結果として何が起こったのかを探ってみることができます。 かわいそうなモンデルブロ集合はすでに輝いているので、例えば、関数z = z ^(2)/(1 + z + z ^(4))+定数など、もっと面白いものを探ってみましょう



可視化



示された依存関係により、複素平面上に次の図が生成されます。

画像

この写真の左中央部は、近づいていくと、自己相似図の無限の更新パターンに陥るという点で興味深いものです。 多様性は有限プリミティブのグループによって生成できるという事実への素晴らしいeg意。

画像

提示されたMatlabスクリプトを使用すると、たとえば、再帰式Z [i] = Z [i-1] ^(n)+ C、n = 1、2 ... 200の多項式nの次数を変更するなど、平面上のフラクタルパターンの変化のダイナミクスを簡単に取得できます。

http://video.yandex.ru/users/alexhoppus/view/2/



おわりに



この記事では、Matlab環境で、スケーリング機能を備えた任意の再帰的依存関係からフラクタルパターンを作成するスクリプトの最も単純な実施形態を提示しようとしました。 それぞれの依存性が、独自の「パターン形成の法則」と独自の対称性を備えた複雑な平面上の独自の世界を独自の方法で生み出すことは容易にわかります。 このすべてから、多くの直感的な結論を出すことができます。その一部は、この記事の本文ですでに引用しています。 一連の講義で、フランクリンメレルウルフ(数学、ヨガの哲学)は、人間の思考の二重性と現実のデスクランブルへの人間の欲求の問題を提起し、「世界は何かで構成されているのは本当ですか?」 それで構成されているのでしょうか、それとも膨大な種類の現実を生成する単一の再帰式によって導かれているのでしょうか?



All Articles