形式r %e^(%i t)の複素値を形式a + b %iに変換します。
ここで、rは大きさで、tは位相です。
rとtは、同じサイズの1次元配列です。
配列のサイズは2のべき乗である必要はありません。
関数が戻ると、入力配列の元の値は、実部aと虚部bに置き換えられます。
出力は、以下のように計算されます。
a = r cos(t) b = r sin(t)
polartorectは、recttopolarの逆関数です。
load("fft")はこの関数をロードします。
fftも参照してください。
形式a + b %iの複素値を形式r %e^(%i t)に変換します。
ここで、aは実部で、bは虚部です。
aとbは同じサイズの1次元配列です。
配列のサイズは2のべき乗である必要はありません。
関数が戻ると、入力配列の元の値は、大きさrと偏角tに置き換えられます。
出力は、以下のように計算されます。
r = sqrt(a^2 + b^2) t = atan2(b, a)
計算された偏角は、-%piから%piの範囲の中にあります。
recttopolarはpolartorectの逆関数です。
load("fft")はこの関数をロードします。
fftも参照してください。
複素逆高速Fourier変換を計算します。
yは、変換されるデータを含むリストもしくは配列です。
要素の数は2のべき乗でなければいけません。
要素は、数リテラル(整数、有理数、浮動小数点、多倍長浮動小数点)、シンボル定数、
もしくは、aとbが数リテラルもしくはシンボル定数である式a + b*%i
でなければいけません。
inverse_fftは、yと同じタイプの新しいオブジェクトを返します。
yは変更されません。
結果はいつも浮動小数点、もしくはaとbが浮動小数点であるところの式
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
複素高速Fourier変換を計算します。
xは、変換されるデータを含むリストもしくは配列です。
要素の数は2のべき乗でなければいけません。
要素は、数リテラル(整数、有理数、浮動小数点、多倍長浮動小数点)、シンボル定数、
もしくは、aとbが数リテラルもしくはシンボル定数である式a + b*%i
でなければいけません。
fftは、xと同じタイプの新しいオブジェクトを返します。
xは変更されません。
結果はいつも浮動小数点、もしくはaとbが浮動小数点であるところの式
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が実数の時、
実係数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も参照してください。
例:
実数データ。
(%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]
デフォルト値: 0
fortindentは、fortranコマンドが表示する式の
式の左マージンインデントを制御します。
0は、標準のプリントアウト(すなわち6スペース)を与え、
正の値は、式を更に右に印字するようにします。
Fortran文としてexprを印字します。
出力行は、スペースでインデントされます。
もし行が長過ぎるなら、
fortranは継続行を印字します。
fortranは、指数演算子^を**として印字し、
複素数a + b %iを形式(a,b)で印字します。
exprは等式も取り、もしそうなら、fortranは、
等式の右辺を左辺に割り当てる割り当て文を印字します。
特に、もしexprの右辺が行列名なら、
fortranは、行列の要素それぞれに対する割り当て文を印字します。
もしexprがfortranが認識する何かでないなら、
エラーなしに、式がgrindフォーマットで印字されます。
fortranは、リスト、配列、関数について知りません。
fortindentは、fortranコマンドが表示する式の
式の左マージンインデントを制御します。
0は、標準のプリントアウト(すなわち6スペース)を与え、
正の値は、式を更に右に印字するようにします。
fortspacesがtrueの時、
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
デフォルト値: false
fortspacesがtrueの時、
fortranは、印字行それぞれを80カラムまでスペースで埋めます。
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
式exprもしくは関数fの根を、閉区間\([\mathit{a}, \mathit{b}]\)上で見つけます。
式exprは等式でも問題ありません。
その場合、find_rootはlhs(expr) - rhs(expr)の根を探します。
Maximaはexprもしくはfを\([\mathit{a}, \mathit{b}]\)上で評価可能であり、
exprもしくはfは連続と仮定して、find_rootは根もしくは、
もし複数の根があるなら、根の1つを見つけることを保証します。
find_rootは初め、2分木探索を適用します。
もし対象の関数が十分滑らかなら,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(\mathit{a}, \mathit{b}), max(\mathit{a}, \mathit{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
exprをxの1変数関数と考えて、
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) /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
fourieパッケージは、Fourier級数のシンボル計算のための関数を含みます。
fourieパッケージの中には
Fourier積分係数を計算する関数や、式の操作のためのいくつかの関数があります。
もしequal (x, y)なら、trueを返し、
そうでないなら、falseを返します。
(この場合、equal (x, y)がするようなエラーメッセージを与えません。)
remfun (f, expr)は、
exprの中のf (arg)すべてをargで置き換えます。
remfun (f, expr, x)は、
exprの中のf (arg)を
argが変数xを含むときだけ
argで置き換えます。
funp (f, expr)は、
もしexprが関数fを含むなら
trueを返します。
funp (f, expr, x)は、
もしexprが関数fを含み、変数
xがfのインスタンスの1つの引数のどこかにあるなら、
trueを返します。
absint (f, x, halfplane)は、
与えられた半平面(pos, neg, またはboth)での
fのxに関する不定積分を返します。
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)は、
fの
xに関する
aからbまでの定積分
を返します。
fは、絶対値を含むことができます。
区間[-p, p]上で定義されたf(x)のFourier係数のリストを返します。
もしsinnpiflagがtrueなら、sin (n %pi)を0に整理します。
もしcosnpiflagがtrueなら、cos (n %pi)を(-1)^nに整理します。
デフォルト値: true
foursimpを参照してください。
デフォルト値: true
foursimpを参照してください。
Fourier係数lのリストから
limit項までのFourier級数を構成し、返します。
(limitはinfもあり得ます。)
xとpは、fourierにおけるものと同じ意味を持ちます。
[0, p]上で定義された
f(x)のFourierコサイン係数を返します。
[0, p]上で定義された
f(x)のFourierサイン係数を返します。
fourexpand (foursimp (fourier (f, x, p)), x, p, 'inf)を返します。
[minf, inf]上で定義された
f(x)のFourier積分係数のリストを構成し、返します。
[0, inf]上のf(x)のFourierコサイン積分係数を返します。
[0, inf]上のf(x)のFourierサイン積分係数を返します。