Next: , Previous:   [Contents][Index]

22 Numerical


22.1 Introduction to fast Fourier transform

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


22.2 Functions and Variables for fast Fourier transform

関数: polartorect (r, t)

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

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

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

polartorectは、recttopolarの逆関数です。

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

関数: recttopolar (a, b)

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

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

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

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

recttopolarpolartorectの逆関数です。

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

関数: inverse_fft (y)

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

inverse_fftは、yと同じタイプの新しいオブジェクトを返します。 yは変更されません。 結果はいつも浮動小数点、もしくはabが浮動小数点であるところの式 a + b*%iとして計算されます。

逆離散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
関数: fft (x)

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

fftは、xと同じタイプの新しいオブジェクトを返します。 xは変更されません。 結果はいつも浮動小数点、もしくはabが浮動小数点であるところの式 a + b*%iとして計算されます。

離散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が実数の時、 実係数abは以下のように計算することができます。

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も参照してください。

例:

実数データ。

(%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]
オプション変数: fortindent

デフォルト値: 0

fortindentは、fortranコマンドが表示する式の 式の左マージンインデントを制御します。 0は、標準のプリントアウト(すなわち6スペース)を与え、 正の値は、式を更に右に印字するようにします。

関数: fortran (expr)

Fortran文としてexprを印字します。 出力行は、スペースでインデントされます。 もし行が長過ぎるなら、 fortranは継続行を印字します。 fortranは、指数演算子^**として印字し、 複素数a + b %iを形式(a,b)で印字します。

exprは等式も取り、もしそうなら、fortranは、 等式の右辺を左辺に割り当てる割り当て文を印字します。 特に、もしexprの右辺が行列名なら、 fortranは、行列の要素それぞれに対する割り当て文を印字します。

もしexprfortranが認識する何かでないなら、 エラーなしに、式がgrindフォーマットで印字されます。 fortranは、リスト、配列、関数について知りません。

fortindentは、fortranコマンドが表示する式の 式の左マージンインデントを制御します。 0は、標準のプリントアウト(すなわち6スペース)を与え、 正の値は、式を更に右に印字するようにします。

fortspacestrueの時、 fortranは、印字行それぞれを80カラムまでスペースで埋めます。

fortranは引数を評価します; 引数のクォートは評価を無効にします。 fortranはいつもdoneを返します。

例:

(%i1) expr: (a + b)^12$
(%i2) fortran (expr);
      (b+a)**12                                                                 
(%o2)                         done
(%i3) fortran ('x=expr);
      x = (b+a)**12                                                             
(%o3)                         done
(%i4) fortran ('x=expand (expr));
      x = b**12+12*a*b**11+66*a**2*b**10+220*a**3*b**9+495*a**4*b**8+792
     1   *a**5*b**7+924*a**6*b**6+792*a**7*b**5+495*a**8*b**4+220*a**9*b
     2   **3+66*a**10*b**2+12*a**11*b+a**12
(%o4)                         done
(%i5) fortran ('x=7+5*%i);
      x = (7,5)                                                                 
(%o5)                         done
(%i6) fortran ('x=[1,2,3,4]);
      x = [1,2,3,4]                                                             
(%o6)                         done
(%i7) f(x) := x^2$
(%i8) fortran (f);
      f                                                                         
(%o8)                         done
オプション変数: fortspaces

デフォルト値: false

fortspacestrueの時、 fortranは、印字行それぞれを80カラムまでスペースで埋めます。

関数: 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.0E-155 x  - 5.5 x + 5.2E+155
(%i2) expr2: horner (%, x), keepfloat: true;
(%o2)            (1.0E-155 x - 5.5) x + 5.2E+155
(%i3) ev (expr, x=1e155);
Maxima encountered a Lisp error:

 floating point overflow

Automatically continuing.
To reenable the Lisp debugger set *debugger-hook* to nil.
(%i4) ev (expr2, x=1e155);
(%o4)                       7.0E+154
関数: 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_rootlhs(expr) - rhs(expr)の根を探します。

Maximaはexprもしくはf[a, b]上で評価可能であり、 exprもしくはfは連続と仮定して、find_rootは根もしくは、 もし複数の根があるなら、根の1つを見つけることを保証します。

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

f_find_rootfind_rootの多倍長浮動小数点版です。 関数は多倍長浮動小数点数値を使って計算され、多倍長浮動小数点の結果が返されます。 そうでなければ、bf_find_rootfind_rootと同一で、以下の記述はbf_find_rootに同様に適用されます。

find_rootの精度はabserrrelerrに支配されます。 それらは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_absfind_root_relのデフォルト値はともに零です。

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

もしfが探索アルゴリズムの中の任意のステップで、数以外の何かに評価するなら、 find_rootは、部分的に評価されたfind_root式を返します。 abの順序は無視されます; 根が探索される区間は[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
関数: newton (expr, x, x_0, eps)

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

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

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

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

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

例:

(%i1) load ("newton1");
(%o1) /usr/share/maxima/5.10.0cvs/share/numeric/newton1.mac
(%i2) newton (cos (u), u, 1, 1/100);
(%o2)                   1.570675277161251
(%i3) ev (cos (u), u = %);
(%o3)                 1.2104963335033528E-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

22.3 Introduction to Fourier series

fourieパッケージは、Fourier級数のシンボル計算のための関数を含みます。

fourieパッケージの中には Fourier積分係数を計算する関数や、式の操作のためのいくつかの関数があります。


22.4 Functions and Variables for Fourier series

関数: equalp (x, y)

もしequal (x, y)なら、trueを返し、 そうでないなら、falseを返します。 (この場合、equal (x, y)がするようなエラーメッセージを与えません。)

関数: remfun (f, expr)
関数: remfun (f, expr, x)

remfun (f, expr)は、 exprの中のf (arg)すべてをargで置き換えます。

remfun (f, expr, x)は、 exprの中のf (arg)argが変数xを含むときだけ argで置き換えます。

関数: funp (f, expr)
関数: funp (f, expr, x)

funp (f, expr)は、 もしexprが関数fを含むなら trueを返します。

funp (f, expr, x)は、 もしexprが関数fを含み、変数 xfのインスタンスの1つの引数のどこかにあるなら、 trueを返します。

関数: absint (f, x, halfplane)
関数: absint (f, x)
関数: absint (f, x, a, b)

absint (f, x, halfplane)は、 与えられた半平面(pos, neg, またはboth)での fxに関する不定積分を返します。 fは、形式 abs (x), abs (sin (x)), abs (a) * exp (-abs (b) * abs (x)) の式を含むことができます。

absint (f, x)absint (f, x, pos)と同値です。

absint (f, x, a, b)は、 fxに関する aからbまでの定積分 を返します。

fは、絶対値を含むことができます。

関数: fourier (f, x, p)

区間[-p, p]上で定義されたf(x)のFourier係数のリストを返します。

関数: foursimp (l)

もしsinnpiflagtrueなら、sin (n %pi)を0に整理します。 もしcosnpiflagtrueなら、cos (n %pi)(-1)^nに整理します。

オプション変数: sinnpiflag

デフォルト値: true

foursimpを参照してください。

オプション変数: cosnpiflag

デフォルト値: true

foursimpを参照してください。

関数: fourexpand (l, x, p, limit)

Fourier係数lのリストから limit項までのFourier級数を構成し、返します。 (limitinfもあり得ます。) xpは、fourierにおけるものと同じ意味を持ちます。

関数: fourcos (f, x, p)

[0, p]上で定義された f(x)のFourierコサイン係数を返します。

関数: foursin (f, x, p)

[0, p]上で定義された f(x)のFourierサイン係数を返します。

関数: totalfourier (f, x, p)

fourexpand (foursimp (fourier (f, x, p)), x, p, 'inf)を返します。

関数: fourint (f, x)

[minf, inf]上で定義された f(x)のFourier積分係数のリストを構成し、返します。

関数: fourintcos (f, x)

[0, inf]上のf(x)のFourierコサイン積分係数を返します。

関数: fourintsin (f, x)

[0, inf]上のf(x)のFourierサイン積分係数を返します。


Next: , Previous:   [Contents][Index]