dynamics (Maxima 5.50.0 Manual)

## 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で変えることができます。

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回繰り返されます。

  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は正の整数でなければいけません。

  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つでなければいけません。 変数はリストの中に明示的に指名されなければいけません。

  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とできます。

  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はオプションの列です。 受け付けられるオプションのリストは以下の節で与えられます。

  Package dynamics · Plotting ·

関数: mandelbrot (options) ¶

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

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

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

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

  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個の値を示します。

  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個の要素を持つもう一つのリストです: 独立変数の値にその点に対応する従属変数の値が続きます。

  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回繰り返されます。

  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]);

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

    julia (-0.55, 0.6, [iterations, 36], [x, -0.3, 0.2],
          [y, 0.3, 0.9], [grid, 400, 400], [color_bar_tics, 0, 6, 36])$

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])$