[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

# 22. Numerical

[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

## 22.1 Introduction to fast Fourier transform

`fft`パッケージは高速Fourier変換の（数式計算ではなく）数値計算に関する関数を含みます。

Categories: Fourier transform · Numerical methods · Share packages · Package fft

[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

## 22.2 Functions and Variables for fast Fourier transform

関数: polartorect (r, t)

  形式 `r %e^(%i t)`の複素値を形式 `a + b %i`に変換します。 ここで、rは大きさで tは位相です。 rと tは、同じサイズの１次元配列です。 配列のサイズは2のべき乗である必要はありません。

  関数から戻ると、入力配列の元の値は実部 `a`と虚部 `b`に置き換えられます。 出力は以下のように計算されます。

      a = r cos(t)
      b = r sin(t)

  `polartorect`は `recttopolar`の逆関数です。

  `load(fft)`はこの関数をロードします。 `fft`も参照してください。

  Categories: Package fft · Complex variables

関数: recttopolar (a, b)

  形式 `a + b %i`の複素値を形式 `r %e^(%i t)`に変換します。 ここで、aは実部で bは虚部です。 aと bは同じサイズの１次元配列です。 配列のサイズは2のべき乗である必要はありません。

  関数から戻ると、入力配列の元の値は大きさ `r`と偏角 `t`に置き換えられます。 出力は以下のように計算されます。

      r = sqrt(a^2 + b^2)
      t = atan2(b, a)

  計算された偏角は `-%pi`から `%pi`の範囲の中にあります。

  `recttopolar`は `polartorect`の逆関数です。

  `load(fft)`はこの関数をロードします。 `fft`も参照してください。

  Categories: Package fft · Complex variables

関数: inverse_fft (y)

  複素逆高速Fourier変換を計算します。 yは変換されるデータを含むリストもしくは配列です。 要素の数は2のべき乗でなければいけません。 要素は、数リテラル（整数、有理数、浮動小数点、多倍長浮動小数点）、シンボル定数、 もしくは、 `a`と `b`が数リテラルもしくはシンボル定数である式 `a + b*%i`でなければいけません。

  `inverse_fft`は yと同じタイプの新しいオブジェクトを返します。 yは変更されません。 結果はいつも浮動小数点か `a`と `b`が浮動小数点であるところの式 `a + b*%i`として計算されます。 もし多倍長浮動小数点精度が必要なら、 `inverse_fft`の完全互換品として代わりに関数 `bf_inverse_fft`を使うことができます。 これは遅くなりますが、多倍長浮動小数点をサポートします。

  逆離散Fourier変換は以下のように定義されます。 `x`を逆変換の出力とします。 `j`が0から `n - 1`まで変わる中、

      x[j] = sum(y[k] exp(-2 %i %pi j k / n), k, 0, n - 1)

  様々な符号、正規化変換があり得るので、 変換のこの定義は他の数学ソフトウエアが使うものと違うかもしれません。

  `load(fft)`はこの関数をロードします。

  `fft` (正変換), `recttopolar`, `polartorect`も参照してください。

  例:

  実数データ。

      (%i1) load ("fft") $
      (%i2) fpprintprec : 4 $
      (%i3) L : [1, 2, 3, 4, -1, -2, -3, -4] $
      (%i4) L1 : inverse_fft (L);
      (%o4) [0.0, 14.49 %i - .8284, 0.0, 2.485 %i + 4.828, 0.0,
                             4.828 - 2.485 %i, 0.0, - 14.49 %i - .8284]
      (%i5) L2 : fft (L1);
      (%o5) [1.0, 2.0 - 2.168L-19 %i, 3.0 - 7.525L-20 %i,
      4.0 - 4.256L-19 %i, - 1.0, 2.168L-19 %i - 2.0,
      7.525L-20 %i - 3.0, 4.256L-19 %i - 4.0]
      (%i6) lmax (abs (L2 - L));
      (%o6)                       3.545L-16

  複素数データ。

      (%i1) load ("fft") $
      (%i2) fpprintprec : 4 $
      (%i3) L : [1, 1 + %i, 1 - %i, -1, -1, 1 - %i, 1 + %i, 1] $
      (%i4) L1 : inverse_fft (L);
      (%o4) [4.0, 2.711L-19 %i + 4.0, 2.0 %i - 2.0,
      - 2.828 %i - 2.828, 0.0, 5.421L-20 %i + 4.0, - 2.0 %i - 2.0,
      2.828 %i + 2.828]
      (%i5) L2 : fft (L1);
      (%o5) [4.066E-20 %i + 1.0, 1.0 %i + 1.0, 1.0 - 1.0 %i,
      1.55L-19 %i - 1.0, - 4.066E-20 %i - 1.0, 1.0 - 1.0 %i,
      1.0 %i + 1.0, 1.0 - 7.368L-20 %i]
      (%i6) lmax (abs (L2 - L));
      (%o6)                       6.841L-17

  Categories: Package fft

関数: fft (x)

  複素高速 Fourier変換を計算します。 xは変換されるデータを含むリストもしくは配列です。 要素の数は2のべき乗でなければいけません。 要素は、数リテラル（整数、有理数、浮動小数点、多倍長浮動小数点）、シンボル定数、 もしくは `a`と `b`が数リテラルもしくはシンボル定数である式 `a + b*%i`でなければいけません。

  `fft`は xと同じタイプの新しいオブジェクトを返します。 xは変更されません。 結果はいつも浮動小数点か、 `a`と `b`が浮動小数点であるところの式 `a + b*%i`として計算されます。 もし多倍長浮動小数点精度が必要なら、 `fft`の完全互換品として代わりに関数 `bf_fft`を使うことができます。 これは遅くなりますが、多倍長浮動小数点をサポートします。 また、もし入力が(虚数部を持たない)実数値だけで構成されているとわかっている場合、 `real_fft`を使うことができます。これは潜在的には速くなります。

  離散Fourier変換は以下のように定義されます。 `y`を変換の出力とします。 `k`が0から `n - 1`まで変わる中、

      y[k] = (1/n) sum(x[j] exp(+2 %i %pi j k / n), j, 0, n - 1)

  様々な符号、正規化変換があり得るので、 変換のこの定義は他の数学ソフトウエアが使うものと違うかもしれません。

  データ xが実数の時、 実係数 `a`と `b`は以下のように計算することができます。

      x[j] = sum(a[k]*cos(2*%pi*j*k/n)+b[k]*sin(2*%pi*j*k/n), k, 0, n/2)

  ここで、

      a[0] = realpart (y[0])
      b[0] = 0

  そして `k`が1からn/2 - 1まで変わる中、

      a[k] = realpart (y[k] + y[n - k])
      b[k] = imagpart (y[n - k] - y[k])

  そして、

      a[n/2] = realpart (y[n/2])
      b[n/2] = 0

  `load(fft)`はこの関数をロードします。

  `inverse_fft` (逆変換), `recttopolar`, `polartorect`も参照してください。 実数値入力のFFTに関しては `real_fft`を、 多倍長浮動小数点の演算に関しては `bf_real_fft`を参照してください。

  例:

  実数データ。

      (%i1) load ("fft") $
      (%i2) fpprintprec : 4 $
      (%i3) L : [1, 2, 3, 4, -1, -2, -3, -4] $
      (%i4) L1 : fft (L);
      (%o4) [0.0, - 1.811 %i - .1036, 0.0, .6036 - .3107 %i, 0.0,
                               .3107 %i + .6036, 0.0, 1.811 %i - .1036]
      (%i5) L2 : inverse_fft (L1);
      (%o5) [1.0, 2.168L-19 %i + 2.0, 7.525L-20 %i + 3.0,
      4.256L-19 %i + 4.0, - 1.0, - 2.168L-19 %i - 2.0,
      - 7.525L-20 %i - 3.0, - 4.256L-19 %i - 4.0]
      (%i6) lmax (abs (L2 - L));
      (%o6)                       3.545L-16

  複素数データ。

      (%i1) load ("fft") $
      (%i2) fpprintprec : 4 $
      (%i3) L : [1, 1 + %i, 1 - %i, -1, -1, 1 - %i, 1 + %i, 1] $
      (%i4) L1 : fft (L);
      (%o4) [0.5, .3536 %i + .3536, - 0.25 %i - 0.25,
      0.5 - 6.776L-21 %i, 0.0, - .3536 %i - .3536, 0.25 %i - 0.25,
      0.5 - 3.388L-20 %i]
      (%i5) L2 : inverse_fft (L1);
      (%o5) [1.0 - 4.066E-20 %i, 1.0 %i + 1.0, 1.0 - 1.0 %i,
      - 1.008L-19 %i - 1.0, 4.066E-20 %i - 1.0, 1.0 - 1.0 %i,
      1.0 %i + 1.0, 1.947L-20 %i + 1.0]
      (%i6) lmax (abs (L2 - L));
      (%o6)                       6.83L-17

  サインとコサイン係数の計算。

      (%i1) load ("fft") $
      (%i2) fpprintprec : 4 $
      (%i3) L : [1, 2, 3, 4, 5, 6, 7, 8] $
      (%i4) n : length (L) $
      (%i5) x : make_array (any, n) $
      (%i6) fillarray (x, L) $
      (%i7) y : fft (x) $
      (%i8) a : make_array (any, n/2 + 1) $
      (%i9) b : make_array (any, n/2 + 1) $
      (%i10) a[0] : realpart (y[0]) $
      (%i11) b[0] : 0 $
      (%i12) for k : 1 thru n/2 - 1 do
         (a[k] : realpart (y[k] + y[n - k]),
          b[k] : imagpart (y[n - k] - y[k]));
      (%o12)                        done
      (%i13) a[n/2] : y[n/2] $
      (%i14) b[n/2] : 0 $
      (%i15) listarray (a);
      (%o15)          [4.5, - 1.0, - 1.0, - 1.0, - 0.5]
      (%i16) listarray (b);
      (%o16)           [0, - 2.414, - 1.0, - .4142, 0]
      (%i17) f(j) := sum (a[k]*cos(2*%pi*j*k/n) + b[k]*sin(2*%pi*j*k/n),
                          k, 0, n/2) $
      (%i18) makelist (float (f (j)), j, 0, n - 1);
      (%o18)      [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]

  Categories: Package fft

関数: real_fft (x)

  実数値列 xの高速 Fourier変換を計算します。 これは、先頭の `N/2+1`個の結果だけを返すことを除いて、 `fft(x)`を実行することと等価です。 ここで `N`は xの長さです。 `N`は2のべきでなければいけません。

  xが実数値だけを含むことをチェックしません。

  実数列の Fourier変換の対称性は複雑さを減らします。 特に `real_fft`の出力の最初と最後は純粋に実数です。 より大きな数列では `real_fft`は `fft`より速く計算できるかもしれません。

  出力長が短いので、通常の `inverse_fft`を直接使えません。 逆をへいさんするには `inverse_real_fft`を使ってください。

  Package fft

関数: inverse_real_fft (y)

  yのFourier逆変換を計算します。 yの長さは `N/2+1`でなければいけません。 ここで `N`は2のべきです。 入力 x(原文まま)は `real_fft`の出力と一致すると期待されます。

  入力が正しい形式か(最初と最後の要素が純粋に実数であること)を確認するようなチェックはしません。

  Categories: Package fft

関数: bf_inverse_fft (y)

  複素高速 Fourier逆変換を計算します。 これは `inverse_fft`の多倍長浮動小数点版で、 入力を多倍長浮動小数点に変換して、多倍長浮動小数点の結果を返します。

  Package fft

関数: bf_fft (y)

  複素高速 Fourier順変換を計算します。 これは `fft`の多倍長浮動小数点版で、 入力を多倍長浮動小数点に変換して、多倍長浮動小数点の結果を返します。

  Package fft

関数: bf_real_fft (x)

  多倍長浮動小数点の結果を返す実数値入力の高速 Fourier順変換を計算します。 これは `real_fft`の多倍長浮動小数点版です。

  Categories: Package fft

関数: bf_inverse_real_fft (y)

  実数値の多倍長浮動小数点の出力で高速Fourier逆変換を計算します。 これは `inverse_real_fft`の多倍長浮動小数点版です。

  Categories: Package fft

[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

## 22.3 Functions for numerical solution of equations

関数: horner
`horner` (expr, x)
`horner` (expr)

  Horner規則に従って、もし指定されないなら xを主変数として使い、 exprの再配列された表現を返します。 `x`は exprの標準有理式形の主変数が使われる場合には省略できます。

  もし `expr`が数値的に評価されるものなら、 `horner`は時々、安定性が改善されます。 また、もし Maximaが Fortranで走らせるプログラムを生成するのに使われるなら、 役に立ちます。 `stringout`も参照してください。

      (%i1) expr: 1e-155*x^2 - 5.5*x + 5.2e155;
                                 2
      (%o1)             1.e-155 x  - 5.5 x + 5.2e+155
      (%i2) expr2: horner (%, x), keepfloat: true;
      (%o2)         1.0 ((1.e-155 x - 5.5) x + 5.2e+155)
      (%i3) ev (expr, x=1e155);
      Maxima encountered a Lisp error:

       arithmetic error FLOATING-POINT-OVERFLOW signalled

      Automatically continuing.
      To enable the Lisp debugger set *debugger-hook* to nil.
      (%i4) ev (expr2, x=1e155);
      (%o4)                 7.00000000000001e+154

  Categories: Numerical methods

関数: find_root (expr, x, a, b, [abserr, relerr])
関数: find_root (f, a, b, [abserr, relerr])
関数: bf_find_root (expr, x, a, b, [abserr, relerr])
関数: bf_find_root (f, a, b, [abserr, relerr])
オプション変数: find_root_error
オプション変数: find_root_abs
オプション変数: find_root_rel

  式 exprもしくは関数 fの根を閉区間 [a, b]上で見つけます。 式 exprは等式でも問題ありません。 その場合、 `find_root`は `lhs(expr) - rhs(expr)`の根を探します。

  Maximaが exprもしくは fを [a, b]上で評価できて exprもしくは fは連続という仮定の下、 `find_root`が根を見つけるか、あるいはもし複数の根があるなら根の１つを見つけることが保証されます。

  `find_root`は始め、２分木探索を適用します。 もし対象の関数が十分滑らかなら `find_root`は代わりに線形内挿を適用します。

  `f_find_root`は `find_root`の多倍長浮動小数点版です。 関数は多倍長浮動小数点数値を使って計算され、多倍長浮動小数点の結果が返されます。 他の点では `bf_find_root`は `find_root`と同一であり、以下の記述は `bf_find_root`に同様に適用されます。

  `find_root`の精度は `abserr`と `relerr`に支配されます。 それらは `fine_root`へのオプションのキーワード引数です。 これらのキーワード引数は形式 `key=val`を取ります。 キーワード引数は

  `abserr`

    根での関数値の望まれる絶対エラー。デフォルトは `find_root_abs`です。

  `relerr`

    根の望まれる相対エラー。デフォルトは `find_root_rel`です。

  懸案の関数が `abserr`以下の何かに評価されるか、 近似値 x_0, x_1の差が `relerr * max(abs(x_0), abs(x_1))`以下になるなら `find_root`は停止します。

  `find_root_abs`と `find_root_rel`のデフォルト値はともに零です。

  `find_root`は探索区間の端で対象の関数が異なる符号を持つことを期待します。 関数の両方の終端での評価値が同じ符号を持つ時、 `find_root`の振る舞いは `find_root_error`に支配されます。 `find_root_error`が `true`の時、 `find_root`はエラーメッセージを出力します。 そうでないなら `find_root`は `find_root_error`の値を返します。 `find_root_error`のデフォルト値は `true`です。

  もし fが探索アルゴリズムの中のどのステップでも数以外の何かに評価されるなら、 `find_root`は部分的に評価された `find_root`式を返します。

  aと bの順序は無視されます; 根が探索される区間は [min(a, b), max(a, b)]です。

  例:

      (%i1) f(x) := sin(x) - x/2;
                                              x
      (%o1)                  f(x) := sin(x) - -
                                              2
      (%i2) find_root (sin(x) - x/2, x, 0.1, %pi);
      (%o2)                   1.895494267033981
      (%i3) find_root (sin(x) = x/2, x, 0.1, %pi);
      (%o3)                   1.895494267033981
      (%i4) find_root (f(x), x, 0.1, %pi);
      (%o4)                   1.895494267033981
      (%i5) find_root (f, 0.1, %pi);
      (%o5)                   1.895494267033981
      (%i6) find_root (exp(x) = y, x, 0, 100);
                                  x
      (%o6)           find_root(%e  = y, x, 0.0, 100.0)
      (%i7) find_root (exp(x) = y, x, 0, 100), y = 10;
      (%o7)                   2.302585092994046
      (%i8) log (10.0);
      (%o8)                   2.302585092994046
      (%i9) fpprec:32;
      (%o9)                           32
      (%i10) bf_find_root (exp(x) = y, x, 0, 100), y = 10;
      (%o10)                  2.3025850929940456840179914546844b0
      (%i11) log(10b0);
      (%o11)                  2.3025850929940456840179914546844b0

  Categories: Algebraic equations · Numerical methods

関数: newton (expr, x, x_0, eps)

  exprを xの１変数関数と考えて、 Newton法による `expr = 0`の近似解を返します。 探索は `x = x_0`で始まり、 (xの現在値で評価された exprを使った) `abs(expr) < eps`が成り立つまで続きます。

  終了テスト `abs(expr) < eps`が `true`か `false`に評価される限り、 `newton`は未定義変数が exprの中に現れることを許します。

  このように exprは数に評価される必要はありません。

  `load(newton1)`はこの関数をロードします。

  `realroots`, `allroots`, `find_root`, `mnewton`も参照してください。

  例:

      (%i1) load ("newton1");
      (%o1)  /maxima/share/numeric/newton1.mac
      (%i2) newton (cos (u), u, 1, 1/100);
      (%o2)                   1.570675277161251
      (%i3) ev (cos (u), u = %);
      (%o3)                 1.2104963335033529e-4
      (%i4) assume (a > 0);
      (%o4)                        [a > 0]
      (%i5) newton (x^2 - a^2, x, a/2, a^2/100);
      (%o5)                  1.00030487804878 a
      (%i6) ev (x^2 - a^2, x = %);
                                                 2
      (%o6)                6.098490481853958e-4 a

  Categories: Algebraic equations · Numerical methods

[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

## 22.4 Introduction to numerical solution of differential equations

このセクションで関数が解く常微分方程式(ODE)は以下の形でなければいけません。

           dy
           -- = F(x,y)
           dx

つまり一階ODEです。 n階の高階微分方程式は n個の一階微分方程式系で書かなくてはいけません。 例えば、二階ODEは以下の2つの方程式系で書かれなくてはいけません。

           dx               dy
           -- = G(x,y,t)    -- = F(x,y,t)
           dt               dt

関数の一番目の引数はODEの右辺の式のリストです。 それらの式が導関数を表す変数は二番目のリストに与えます。 上の例の場合、それらの変数はxと yです。 上の例では tに該当する独立変数は別のオプションの中に与えます。 もし与えられた式がその独立変数に依存しないなら系は自律的と呼ばれます。

Categories: Differential equations · Numerical methods · Plotting

[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

## 22.5 Functions for numerical solution of differential equations

関数: plotdf
`plotdf` (dydx, options…)
`plotdf` (dvdu, [u,v], options…)
`plotdf` ([dxdt,cdydt], options…)
`plotdf` ([dudt,cdvdt], [u,cv], options…)

  関数`plotdf`は、 一階常微分方程式(ODE)や2つの自律 一階 ODE系の方向場(勾配場とも呼ばれる)のプロットを生成します。

  たとえコンソールのMaximaセッションから走らせても、plotdfは Xmaximaを必要とします。 XmaximaのTkスクリプトがプロットを生成するためです。 Xmaximaがインストールされていないなら、plotdfは動きません。

  dydx, dxdt, dydtは xと yに依存する式です。 dvdu, dudt, dvdtは uと vに依存する式です。 それら 2つの変数に加えて、 `parameters`オプションで与えられる数値を持つか (オプション構文法は以下に与えられます)、 slidersオプションで指定される許される値の範囲のパラメータ一式にも、 式は依存するかもしれません。

  コマンド内やメニューで選択して、いくつかの他のオプションを与えることができます。 プロット上でクリックしたり、オプション `trajectory_at`を使って積分曲線を得ることができます。 `direction`オプションを使って積分の方向を制御できます。 オプションは、 forward, backward, bothのいずれかの値を取り得ます。 積分ステップの数は`nsteps`で与えます。 それぞれの積分ステップで時間増分は、プロットウィンドウのサイズより十分小さい置き換えを生成するように自動的に調整されます。 使われる数値法は可変時間ステップの4次の適応 Runge-Kutta法です。

  プロットウィンドウメニュー:

  プロットウィンドウのメニューバーは以下の7つのアイコンを持ちます:

  X。プロットウィンドウを閉じるのに使えます。

  レンチとドライバ。使用中のODEと様々な設定を表示する欄を持つ設定メニューを開きます。 欄 Trajectory atに座標の組を入力して `enter`キーを押すと、既に表示されたものに加えて新しい積分曲線を表示します。

  円に続く2つの矢印。設定メニューで定義された新しい設定で方向場を再プロットし、以前にプロットされた最後の積分曲線だけを再プロットします。

  矢印付きハードディスクドライブ。アイコンをクリックした時現れるボックス欄で指定したファイルにプロットのコピーをポストスクリプト形式で保存するのに使います。

  プラス記号付き拡大鏡。プロットをズームします。

  マイナス記号付き拡大鏡。プロットをズームアウトします。 マウスの右ボタンを押したままマウスを動かすことでプロットを置き換えることができます。

  プロットアイコン。最後にプロットされた積分曲線の2つの変数の時間プロットを含む別のウィンドウを開きます。

  プロットオプション:

  オプションを `plotdf`自身に与えることもできます。 それぞれは複数の要素のリストです。 それぞれのオプションの最初の要素はオプション名で、残りはオプションに割り当てられる値です。

  `plotdf`が認識するオプションは以下の通りです:

  - nstepsは、積分曲線を計算するのに、独立変数に対して使われる長さ `tstep`のステップ回数を定義します。 デフォルト値は 100です。
  - directionは積分曲線を計算する際に従う独立変数の方向を定義します。 可能な値は、 `forward`―これは増分 `tstep`で独立変数を `nsteps`回増やします― `backward`―これは独立変数を減らします― または `both`―これは `nsteps`回前進、 `nsteps`回後進で拡げた積分曲線に導きます― キーワード `right`と `left`を、 `forward`と `backward`の別称として使うことができます。 デフォルト値は `both`です。
  - tinitialは積分曲線を計算するために使われる変数 tの初期値です。 微分方程式が自律なので、その設定は tの関数として曲線のプロットでだけ現れます。 デフォルト値は 0です。
  - versus_tは独立変数 tの 2つの関数 x, yとしての積分曲線のプロットを使って二番目のプロットウィンドウを生成するために 使われます。 もし `versus_t`が 0と異なる任意の値を与えられたら、 二番目のプロットウィンドウが表示されます。 二番目のプロットウィンドウはメインプロットウィンドウのメニューに似た別のメニューを含みます。 デフォルト値は 0です。
  - trajectory_atは積分曲線の開始点のための座標 xinitialと yinitialを定義します。 オプションはデフォルトで空です。
  - parametersは 微分方程式の定義の中で使われるパラメータとその数値のリストを定義します。 パラメータの名前と値は、コンマで分離された組 `name=value`の列を持つ文字列で与えなければいけません。
  - slidersはスライダーボタンを使って対話的に変更されるパラメータと それらのパラメータの変動範囲のリストです。 パラメータの名前と範囲は、コンマで分離された要素 `name=min:max`の列を持つ文字列で与えなければいけません。
  - xfunは方向場の上にセミコロンで分離された表示される xの関数の列を持つ文字列を定義します。 これらの関数は Maximaではなく Tclでパースされます。
  - xには2つの数が続かなければいけません。 2つの数は水平軸上で表示される最小値と最大値を設定します。 もし水平軸上の変数が xでないなら、 このオプションは水平軸上の変数名を持たなければいけません。 デフォルトの水平範囲は -10から 10です。
  - yには 2つの数が続かなければいけません。 2つの数は垂直軸上で表示される最小値と最大値を設定します。 もし垂直軸上の変数が yでないなら、 このオプションは垂直軸上の変数名を持たなければいけません。 デフォルトの垂直範囲は -10から 10です。
  - xaxislabelは水平軸を特定するのに使われます。 デフォルト値は一番目の状態変数名です。
  - yaxislabelを垂直軸を特定するのに使われます。 デフォルト値は二番目の状態変数名です。
  - number_of_arrowsは平方数に設定しなければいけません。 これは描画される矢印のおおよその密度を定義します。 デフォルト値は225です。

  例:

  - 微分方程式 y' = exp(-x) + yの方向場と (2, -0.1)を通過する解を表示するために:

        (%i1) plotdf(exp(-x)+y,[trajectory_at,2,-0.1])$

  - 方程式 diff(y,x) = x - y^2の方向場と初期条件 y(-1) = 3の解を得るために以下のコマンドを使うことができます:

        (%i1) plotdf(x-y^2,[xfun,"sqrt(x);-sqrt(x)"],
                 [trajectory_at,-1,3], [direction,forward],
                 [y,-5,5], [x,-4,16])$

    グラフは関数 y = sqrt(x)も表示します。

  - 以下の例は、2つの方程式 dz/dt = vと dv/dt = -k*z/mで定義される調和振動子の方向場と、 (z,v) = (6,0)を通る積分曲線を、 (kは 2に固定で) mの値を対話的に変えられるスライダーと一緒に、 表示します。

        (%i1) plotdf([v,-k*z/m], [z,v], [parameters,"m=2,k=2"],
                   [sliders,"m=1:5"], [trajectory_at,6,0])$

  - Duffing方程式 m*x"+c*x'+k*x+b*x^3 = 0の方向場をプロットするために変数 y=x'を導入し、以下のように使います:

        (%i1) plotdf([y,-(k*x + c*y + b*x^3)/m],
                     [parameters,"k=-1,m=1.0,c=0,b=1"],
                     [sliders,"k=-2:2,m=-1:1"],[tstep,0.1])$

  - 質量 mの値を変更するのに使うことができるスライダーと一緒に 与えられた初期条件の解と減衰振り子の方向場と 時間の関数として2つの状態変数のプロットを一緒に:

        (%i1) plotdf([w,-g*sin(a)/l - b*w/m/l], [a,w],
                [parameters,"g=9.8,l=0.5,m=0.3,b=0.05"],
                [trajectory_at,1.05,-9],[tstep,0.01],
                [a,-10,2], [w,-14,14], [direction,forward],
                [nsteps,300], [sliders,"m=0.1:1"], [versus_t,1])$

  Categories: Differential equations · Plotting · Numerical methods

関数: ploteq (exp, ...options...)

  expの等電位曲線をプロットします。 expは二変数に依存する式です。 曲線は直交切線を定義する微分方程式を与えられた式の勾配から得られる自律系の解に積分することで得られます。 プロットは勾配系の積分曲線(オプションfieldlines)を見せることもできます。

  このプログラムも、たとえコンソールのMaximaセッションから走らせても、 Xmaximaを必要とします。 XmaximaのTkスクリプトがプロットを生成するためです。 デフォルトでは、ユーザーがある点をクリックする(か設定メニューかtrajectory_atオプションで座標を与える)まで、プロット領域は空です。

  plotdfがほとんどのオプションはploteqでも使うことができ、 プロットインターフェースはplotdfで記述したものと同じです。

  例:

      (%i1) V: 900/((x+1)^2+y^2)^(1/2)-900/((x-1)^2+y^2)^(1/2)$
      (%i2) ploteq(V,[x,-2,2],[y,-2,2],[fieldlines,"blue"])$

  ある点をクリックすると、その点(赤)と直交切線(青)を通る等電位曲線をプロットします。

  Categories: Differential equations · Plotting · Numerical methods

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

  以下の微分方程式を数値的に解く。

                dx/dt = t - x^2

  初期値は x(t=0) = 1で、tの区間は0から8まで、tの増分は0.1。 コマンドは:

      (%i1) results: rk(t-x^2,x,1,[t,0,8,0.1])$
      (%i2) plot2d ([discrete, results])$

  結果はリスト `results`に保存され、プロットは、水平軸に t、垂直軸に xで得られた解を表示します。

  以下の系を数値的に解く。

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

  tは0から4の間、t=0でxが-1.25、yが0.75という条件:

      (%i1) sol: rk([4-x^2-4*y^2,y^2-x^2+1],[x,y],[-1.25,0.75],[t,0,4,0.02])$
      (%i2) plot2d ([discrete,makelist([p[1],p[3]],p,sol)], [xlabel,"t"],[ylabel,"y"])$

  プロットは tの関数として変数 yを表示します。

  Categories: Differential equations · Numerical methods

[ << ] | [ >> ] |  |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

This document was generated by 市川雄二 on October, 4 2018 using texi2html 1.76.