[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

# 50. dynamics

[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

## 50.1 Introduction to dynamics

追加パッケージ `dynamics`には、 離散力学系とフラクタルの様々なグラフィックス表現を生成するためのいくつかの関数と、 微分方程式系を数値的に解くための 4次 Runge-Kutta法の実装が含まれています。

このパッケージの関数を使うには、最初に `load("dynamics")`でパッケージをロードしなければいけません。

Maxima 5.12で導入された変更

Maxima 5.12以来現在まで dynamicsパッケージは グラフを処理するのに関数 `plot2d`を使います。 (`julia`や `mandelbrot`を除いて) グラフィックスを生成するコマンドは `plot2d`のいかなるオプションも受け付けます。 オプションには、プロットスタイルや色を使ったり、 一方の、または両方の軸を対数スケールで表したり、 様々なグラフィカルインターフェイス全体に渡って変更を加えるものを含みます。 古いオプション domain, pointsize, xcenter, xradius, ycenter, yradius, xaxislabel, yaxislabelは この新しいバージョンでは受け付けられません。

現在，すべてのプログラムは、以前のバージョンのように xと yだけでなく、 任意の変数名を受け付けます。 ２つの要求パラメータが2つのプログラムで変えられました: `evolution2d`は、現在、２つの独立変数を陽に指定するリストを要求し、 `orbits`の水平範囲はもはやステップサイズを要求しません; 範囲は、変数名と最小値、最大値だけを指定しなければいけません; ステップ数は、現在、オプション nticksで変えることができます。

·

Categories: Dynamical systems ·Share packages ·Package dynamics

[ < ] | [ > ] |  | [ << ] | [上] | [ >> ] |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

## 50.2 Functions and Variables for dynamics

関数: chaosgame (`[[`x1, y1`]`...`[`xm, ym`]]`, `[`x0, y0`]`, b, n, ..., options, ...);

  いわゆるカオスゲームを実装します: 初期点 (x0, y0)がプロットされ、 m個の点 `[`x1, y1`]`...`[`xm, ym`]`の１つがランダムに選択されます。 プロットされる次の点はプロットされた以前の点からランダムに選ばれた点までの線分上で、 ランダム点からその線分の長さに bを掛けた距離にあります。 手続きは n回繰り返されます。

  ·

  Categories: Package dynamics ·Plotting

関数: evolution (F, y0, n, ..., options, ...);

  ２次元グラフに、点の水平座標が整数 0, 1, 2, ..., n、 垂直座標が再帰関係

              y(n+1) = F(y(n))

  で定義された数列の対応する値 y(n)である n+1個の点を描きます。 ここで、初期値 y(0)は y0に等しいです。 Fは１変数にだけ依存する式でなければいけません。 (例の中では yに依存していますが、他のいかなる変数を使うことができます), y0は実数でなければいけなく、 nは正の整数でなければいけません。

  ·

  Categories: Package dynamics ·Plotting

関数: evolution2d (`[`F, G`]`, `[`u, v`]`, `[`u0, y0`]`, n, ..., options, ...);

  再帰関係を伴う二次元離散力学系によって定義された点列の中の最初の n+1点を二次元プロットで表示します。 初期値 u0と v0を持つ

              u(n+1) = F(u(n), v(n))    v(n+1) = G(u(n), v(n))

  Fと Gは 2変数 uと vのみに依存する式 2つでなければいけません。 変数はリストの中に明示的に指名されなければいけません。

  ·

  Categories: Package dynamics ·Plotting

関数: ifs (`[`r1, ..., rm`]`, `[`A1, ..., Am`]`, `[[`x1, y1`]`, ..., `[`xm, ym`]]`, `[`x0, y0`]`, n, ..., options, ...);

  反復関数系法を実装します。 この方法は関数 `chaosgame`で記述した方法に似ていますが、 現在点からランダムに選ばれた点にセグメントを縮める代わりに、 そのセグメントの2成分はランダムに選ばれた点に対応する 2行 2列行列 Aiを乗算されます。

  m個のアトラクティブな点の１つのランダムな選択を重み r1,...,rmで定義された非均一な確率分布で作ることができます。 それらの重みは累積形で与えられます; 例えばもし確率0.2, 0.5, 0.3を持つ3点があるなら、 重み r1, r2と r3は 2, 7, 10とできます。

  ·

  Categories: Package dynamics ·Plotting

関数: julia (x, y, ...options...)

  複素数 (x + i y)に関する Julia集合の表現のグラフィックスファイルを生成します。 パラメータ xと yは実数でなければいけません。 ファイルは、 XPMグラフィックスフォーマットでカレントディレクトリかユーザーディレクトリに生成されます。 プログラムは走らせるのに数秒かかるかもしれません。 終了後、生成したファイル名と共にメッセージが印字されます。

  Julia集合に属さない点には異なる色が割り当てられます。 繰り返し回数に従って、その点から始まり、半径2の収束円から動く数列を取ります。 繰り返しの最大回数はオプション levelsで設定されます; その回数の繰り返しの後、もし数列がまだ収束円内なら、 点はオプション colorで定義された色で塗られます。

  Julia集合に属さない点に使われる色すべては、同じ saturationと valueを持ちますが、 hueと (hue + huerange)の間に一様に分布する、違った色相角を持ちます。

  optionsはオプションの列です。 受け付けられるオプションのリストは以下の節で与えられます。

  ·

  Categories: Package dynamics ·Plotting

関数: mandelbrot (options)

  Mandelbrot集合の表現のグラフィックスファイルを生成します。 ファイルは、 XPMグラフィックスフォーマットでカレントディレクトリかユーザーディレクトリに生成されます。 プログラムは走らせるのに数秒かかるかもしれません。 終了後、生成したファイル名と共にメッセージが印字されます。

  Mandelbrot集合に属さない点には、異なる色が割り当てられます。 繰り返し回数に従って、その点から始まり、半径 2の収束円から動く数列を取ります。 繰り返しの最大回数はオプション levelsで設定されます; その回数の繰り返しの後、もし数列がまだ収束円内なら、点はオプション colorで定義された色で塗られます。

  Mandelbrot集合に属さない点に使われる色すべては、同じ saturationと valueを持ちますが、hueと (hue + huerange)の間に一様に分布する、違った色相角を持ちます。

  optionsはオプションの列です。 受け付けられるオプションのリストは以下の節で与えられます。

  ·

  Categories: Package dynamics ·Plotting

関数: orbits (F, y0, n1, n2, [x, x0, xf, xstep], ...options...);

  パラメータ xを持つ一次元離散力学系の族に関する軌道図を描画します; この種の図は一次元離散系の分岐の研究に使われます。

  関数 F(y)は、 関数 `evolution`の場合と同様に値 y0で始まる数列を定義しますが、 この場合、その関数は x0から xfまでの区間内の値を取り、 xstepの増分を持つパラメータ xにも依存します。 パラメータ xに使われるそれぞれの値は水平軸に示されます。 垂直軸は、数列に n1回の時間発展させた後得られる数列 y(n1+1),..., y(n1+n2+1)の n2個の値を示します。

  ·

  Categories: Package dynamics ·Plotting

関数: rk (ODE, var, initial, domain)
関数: rk ([ODE1,...,ODEm], [v1,...,vm], [init1,...,initm], domain)

  4次の Runge-Kutta法を使って、 最初の形式は一階常微分方程式一つを数値的に解き、二番目の形式はそれら m個の方程式系を解きます。 varは従属変数を表します。 ODEは独立変数と従属変数にだけ依存する式でなければいけません。 そして、独立変数に関する従属変数の導関数を定義します。

  独立変数は `domain`で指定されます。 それは 4つの要素のリストでなければいけません。 例えば:

      [t, 0, 10, 0.1]

  リストの最初の要素は独立変数を特定し、二番目と三番目の要素はその変数の初期値と最終値であり、 最後の要素はその区間内で使用されるべき増加分を設定します。

  もし mこの方程式が解かれようとしているなら、 m個の従属変数 v1, v2, ..., vmが存在しなければいけません。 それらの変数の初期値は init1, init2, ..., initmとなります。 以前の場合と同様、 `domain`で定義されたただ 1つの独立変数が残っています。 ODE1, ..., ODEmは独立変数に関する従属変数それぞれの導関数を定義する式です。 それらの式に現れるかもしれない変数は独立変数と任意の従属変数だけです。 従属変数と厳密に同じ順序でリストの中に導関数 ODE1, ..., ODEmを与えることが重要です; 例えば、リストの三番目の要素は三番目の従属変数の導関数と解釈されます。

  プログラムは 方程式を独立変数の初期値から最終値まで一定の増加分を使って積分しようとします。 もしあるステップで従属変数の1つが大きすぎる絶対値を取ったら、積分はその点で中断されます。 結果は、なされた繰り返しの回数と同じ数の要素を持つリストです。 結果リストの中のそれぞれの要素は、それ自身 m+1個の要素を持つもう一つのリストです: 独立変数の値にその点に対応する従属変数の値が続きます。

  ·

  Categories: Package dynamics ·Differential equations ·Numerical methods

関数: staircase (F, y0, n, ...options...);

  再帰関係によって定義された数列に関する階段図形を描画します。

              y(n+1) = F(y(n))

  入力パラメータの解釈と許される値は 関数 `evolution`に関するものと同じです。 階段図形は線 G(y) `=` yと共に関数 F(y)のプロットから構成されます。 垂直区間は、その線上の点 (y0, y0)から関数 Fと交差する点まで描画されます。 水平区間はその点から線上の点 (y1, y1)に届くまで描画されます。 手続きは点 (yn, yn)に届くまで n回繰り返されます。

  ·

  Categories: Package dynamics ·Plotting

オプション

それぞれのオプションは複数の項目のリストです。 最初の項目はオプション名で、残りはオプションの引数からなります。

関数 `evolution`, `evolution2d`, `staircase`, `orbits`, `ifs`, `chaosgame`が受け付けるオプションは `plot2d`に関するオプションと同じです。 `orbits`は、それらのオプションに加えて、 垂直方向に表される異なる点の最大数を設定する特別なオプション pixelsを受け付けます。

以下のオプションを関数 `julia`と `mandelbrot`は受け付けます:

- sizeは 1つか 2つの引数を取ります。 もし 1つだけ引数が与えられたら、 生成されるグラフィックスファイルの幅と高さはピクセル単位でその値に等しくなります。 もし引数 2つが与えられたら、それらは幅と高さを定義します。 デフォルト値は、幅と高さ両方に関して 400ピクセルです。 もし 2つの値が等しくないなら、集合は歪んで現れます。
- levelsは繰り返しの最大数を定義します。 これは集合に属さない点に使われる色の数にも等しいです。 デフォルト値は 12です; 値が大きくなると、処理時間が長くなります。
- huerangeは 集合に属さない点の色相に使われる色相角の範囲を定義します。 デフォルト値は 360です。これは色が色相のすべての範囲に広がることを意味します。 360より大きな値は、色相範囲の繰り返しを意味し、 負の値は、繰り返し回数が増えるにつれ、色相角を減らすように使うことができます。
- hueは集合に属さない点に使われる最初の色の色相を度単位で設定します。 デフォルト値は 300度です。これはマゼンダに対応します; 他の標準的な色の値は、赤には 0、オレンジには 45、黄には 60、緑には 120、シアンには 180、青には 240です。 オプション huerangeも参照してください。
- saturationは集合に属さない点に使われる飽和値を設定します。 0と 1の間でなければいけません。 デフォルト値は 0.46です。
- valueは 集合に属さない点に使われる色の値を設定します。 0と 1の間でなければいけません; 値が高くなると、色が明るくなります。 デフォルト値は 0.96です。
- colorには、集合の点を表すのに使われる色の色相、飽和、値を定義する 3つのパラメータが続きます。 デフォルト値は３つのパラメータすべてが 0であり、黒に対応します。 許される値の範囲の説明に関してオプション hue, saturation, valueを参照してください。
- centerには、2つの実パラメータが続きます。 これは表示される領域の中心点の複素平面上の座標を与えます。 デフォルト値は両座標に関して 0(原点)です。
- radiusは表示される正方形領域内の最大円の半径を設定します。 デフォルト値は 2です。
- filenameは 結果のグラフが保存されるファイル名を与えます。 拡張子 .xpmがその名前に加えられます。 もしファイルが既に存在しているなら、 関数が生成したファイルで置き換えられます。 デフォルト値は Julia集合には julia、 Mandelbrot集合には mandelbrotです。

例

以下の数列のグファフィックス表現と階段図形: 2, cos(2), cos(cos(2)),...

    (%i1) load("dynamics")$

    (%i2) evolution(cos(y), 2, 11);

    (%i3) staircase(cos(y), 1, 11, [y, 0, 1.2]);

もしシステムが遅いなら、以下の例のように繰り返し回数を減らさなければいけないでしょう。 そして、もしモニタ上のドットが小さすぎるなら、 `[`style,`[`points,0.8`]]`のように、 違ったスタイルを試したくなるかもしれません。

パラメータ aを持つ二次写像の軌跡図。

            x(n+1) = a + x(n)^2

    (%i4) orbits(x^2+a, 0, 50, 200, [a, -2, 0.25], [style, dots]);

x `=` -1.25近くのより低い分岐の回りの領域を拡大するには、以下を使ってください:

    (%i5) orbits(x^2+a, 0, 100, 400, [a,-1,-1.53], [x,-1.6,-0.8],
                 [nticks, 400], [style,dots]);

フラクタルに導かれる二次元系の発展:

    (%i6) f: 0.6*x*(1+2*x)+0.8*y*(x-1)-y^2-0.9$

    (%i7) g: 0.1*x*(1-6*x+4*y)+0.1*y*(1+9*y)-0.4$

    (%i8) evolution2d([f,g], [x,y], [-0.5,0], 50000, [style,dots]);

そしてそのフラクタルの小さな領域の拡大:

    (%i9) evolution2d([f,g], [x,y], [-0.5,0], 300000, [x,-0.8,-0.6],
                      [y,-0.4,-0.2], [style, dots]);

カオスゲームで得られる Sierpinski三角形のプロット:

    (%i9) chaosgame([[0, 0], [1, 0], [0.5, sqrt(3)/2]], [0.1, 0.1], 1/2,
                     30000, [style, dots]);

反復函数系で得られる Barnsleyのシダ:

    (%i10) a1: matrix([0.85,0.04],[-0.04,0.85])$

    (%i11) a2: matrix([0.2,-0.26],[0.23,0.22])$

    (%i12) a3: matrix([-0.15,0.28],[0.26,0.24])$

    (%i13) a4: matrix([0,0],[0,0.16])$

    (%i14) p1: [0,1.6]$

    (%i15) p2: [0,1.6]$

    (%i16) p3: [0,0.44]$

    (%i17) p4: [0,0]$

    (%i18) w: [85,92,99,100]$

    (%i19) ifs(w, [a1,a2,a3,a4], [p1,p2,p3,p4], [5,0], 50000, [style,dots]);

Mandelbrot集合の 12色のグラフィックス表現を納めた dynamics9.xpmという名前のファイルを生成するには以下を使ってください:

    mandelbrot([filename,"dynamics9"])$

そして数 (-0.55 + i 0.6)に関する Julia集合は以下で得られます:

    julia(-0.55, 0.6, [levels, 36], [center, 0, 0.6], [radius, 0.3],
          [hue, 240], [huerange, -180], [filename, "dynamics10"])$

グラフはファイル dynamics10.xpmに保存されます。 x方向に -0.3から 0.3まで、 y方向に 0.3から 0.9までの領域を表示します。 青から始まり黄で終わる 36色が使われます。

微分方程式

              dx/dt = t - x^2

を、初期値 x(t=0) = 1で、0から 8までの tの区間で 0.1の増分で数値的に解くには、以下を使ってください:

    (%i20) results: rk(t-x^2,x,1,[t,0,8,0.1])$

結果はリスト `results`に保存されます。

系

            dx/dt = 4-x^2-4*y^2     dy/dt = y^2-x^2+1

を、 t=0の xと yの初期値がそれぞれ -1.25, 0.75で、 0から 4までの区間で、数値的に解くには:

    (%i21) sol: rk([4-x^2-4*y^2,y^2-x^2+1],[x,y],[-1.25,0.75],[t,0,4,0.02])$

[ << ] | [ >> ] |  |  |  |  |  | [冒頭] | [目次] | [見出し] | [ ? ]

この文書は市川 雄二によって2012年1月月5日にtexi2html 1.82を用いて生成されました。