2 * Introduction to lapack::
3 * Functions and Variables for lapack::
6 @node Introduction to lapack, Functions and Variables for lapack, lapack, lapack
7 @section Introduction to lapack
10 SLATECプロジェクトから得られるようなFortranライブラリLAPACKの
11 (プログラム @code{f2c}を介した) Common Lisp翻訳です。
13 (訳者注意書き: lapackを使用するには、load("lapack"); load("eigensys");を実行してください。load("lapack")には、初回だけコンパイルで時間がかかるかもしれません。)
16 @category{Numerical methods} @category{Share packages} @category{Package lapack}
20 @node Functions and Variables for lapack, , Introduction to lapack, lapack
21 @section Functions and Variables for lapack
23 @deffn {関数} dgeev (@var{A})
24 @deffnx {関数} dgeev (@var{A}, @var{right_p}, @var{left_p})
26 行列@var{A}の固有値と、オプションで固有ベクトルを計算します。
27 @var{A}の要素はすべて整数か浮動小数点数でなければいけません。
28 @var{A}は平方(行と列が同じ数)でなければいけません。
29 @var{A}は対称であってもなくてもいいです。
31 @code{dgeev(@var{A})}は@var{A}の固有値だけを計算します。
32 @code{dgeev(@var{A}, @var{right_p}, @var{left_p})}は
34 @math{@var{right_p} = @code{true}}の時、右固有ベクトル、
35 @math{@var{left_p} = @code{true}}の時、左固有ベクトルを計算します。
39 二番目の項目は@code{false}か右固有ベクトルの行列です。
40 三番目の項目は@code{false}か左固有ベクトルの行列です。
42 右固有ベクトル@math{v(j)} (右固有ベクトル行列の@math{j}番目の列)は
44 @math{A . v(j) = lambda(j) . v(j)}
46 を満たします。ここで@math{lambda(j)}は対応する固有値です。
48 左固有ベクトル@math{v(j)} (左固有ベクトル行列の@math{j}番目の列)は
50 @math{u(j)**H . A = lambda(j) . u(j)**H}
52 を満たします。ここで@math{u(j)**H}は@math{u(j)}の共役転置を意味します。
53 Maxima関数@code{ctranspose}が共役転置を計算します。
57 最大成分の虚部が0になるように規格化されます。
64 @c M : matrix ([9.5, 1.75], [3.25, 10.45]);
66 @c [L, v, u] : dgeev (M, true, true);
67 @c D : apply (diag_matrix, L);
69 @c transpose (u) . M - D . transpose (u);
73 (%i2) fpprintprec : 6;
75 (%i3) M : matrix ([9.5, 1.75], [3.25, 10.45]);
80 (%o4) [[7.54331, 12.4067], false, false]
81 (%i5) [L, v, u] : dgeev (M, true, true);
82 [ - .666642 - .515792 ]
83 (%o5) [[7.54331, 12.4067], [ ],
85 [ - .856714 - .745378 ]
88 (%i6) D : apply (diag_matrix, L);
96 (%i8) transpose (u) . M - D . transpose (u);
103 @category{Package lapack}
108 @deffn {関数} dgeqrf (@var{A})
112 @var{A}のすべての要素は整数か浮動小数点数でなければいけません。
113 @var{A}は行と列の数は同じかもしれませんし違うかもしれません。
116 一番目の項目は行列 @var{Q}で、それは@var{A}と同じ行数を持つ平方正規直交行列です。
117 二番目の項目は行列 @var{R}で、それは@var{A}tお同じサイズで、
118 対角以下のすべての要素がが零に等しいものです。
119 積 @code{@var{Q} . @var{R}}は(浮動小数点の丸め誤差を除いて)@var{A}に等しい。
125 @c M : matrix ([1, -3.2, 8], [-11, 2.7, 5.9]);
126 @c [q, r] : dgeqrf (M);
131 (%i1) load (lapack) $
132 (%i2) fpprintprec : 6 $
133 (%i3) M : matrix ([1, -3.2, 8], [-11, 2.7, 5.9]) $
134 (%i4) [q, r] : dgeqrf (M);
135 [ - .0905357 .995893 ]
138 [ - 11.0454 2.97863 5.15148 ]
140 [ 0 - 2.94241 8.50131 ]
142 [ - 7.77156E-16 1.77636E-15 - 8.88178E-16 ]
144 [ 0.0 - 1.33227E-15 8.88178E-16 ]
145 (%i6) mat_norm (%, 1);
150 @category{Package lapack}
155 @deffn {関数} dgesv (@var{A}, @var{b})
157 線形方程式 @math{@var{A} @var{x} = @var{b}}の
160 @var{b}は@var{A}と同じ数の行と任意の長さの列を持つ行列です。
161 戻り値 @var{x}は @var{b}と同じサイズです。
164 @code{float}を介して実の浮動小数点数に評価されなければいけません;
165 従って、要素は任意の数値型か、数値定数のシンボルか、
167 @var{x}の要素はいつも浮動小数点数です。
168 すべての算術は浮動小数演算として実行されます。
177 線形方程式 @math{@var{A} @var{x} = @var{b}}の解を計算します。
180 @c A : matrix ([1, -2.5], [0.375, 5]);
181 @c b : matrix ([1.75], [-0.625]);
183 @c dlange (inf_norm, b - A . x);
186 (%i1) A : matrix ([1, -2.5], [0.375, 5]);
190 (%i2) b : matrix ([1.75], [-0.625]);
194 (%i3) x : dgesv (A, b);
195 [ 1.210526315789474 ]
197 [ - 0.215789473684211 ]
198 (%i4) dlange (inf_norm, b - A.x);
202 @var{b}は@var{A}と同じ数の行と任意の長さの列を持つ行列です。
203 @var{x}は @var{b}と同じサイズです。
206 @c A : matrix ([1, -0.15], [1.82, 2]);
207 @c b : matrix ([3.7, 1, 8], [-2.3, 5, -3.9]);
209 @c dlange (inf_norm, b - A . x);
212 (%i1) A : matrix ([1, -0.15], [1.82, 2]);
216 (%i2) b : matrix ([3.7, 1, 8], [-2.3, 5, -3.9]);
220 (%i3) x : dgesv (A, b);
221 [ 3.103827540695117 1.20985481742191 6.781786185657722 ]
223 [ - 3.974483062032557 1.399032116146062 - 8.121425428948527 ]
224 (%i4) dlange (inf_norm, b - A . x);
225 (%o4) 1.1102230246251565E-15
229 実の浮動小数点数に評価されなければいけません;
232 @c A : matrix ([5, -%pi], [1b0, 11/17]);
233 @c b : matrix ([%e], [sin(1)]);
235 @c dlange (inf_norm, b - A . x);
238 (%i1) A : matrix ([5, -%pi], [1b0, 11/17]);
244 (%i2) b : matrix ([%e], [sin(1)]);
248 (%i3) x : dgesv (A, b);
249 [ 0.690375643155986 ]
251 [ 0.233510982552952 ]
252 (%i4) dlange (inf_norm, b - A . x);
253 (%o4) 2.220446049250313E-16
257 @category{Package lapack} @category{Linear equations}
262 @deffn {関数} dgesvd (@var{A})
263 @deffnx {関数} dgesvd (@var{A}, @var{left_p}, @var{right_p})
265 特異値から成る行列 @var{A}の特異値分解(SVD)を計算します。
266 オプションで左および右特異ベクトルを取ります。
268 @var{A}の要素はすべて整数か浮動小数点数でなければいけません。
269 @var{A}は(行と列が同じ数の)平方かもしれませんし、そうでないかもしれません。
271 @math{m}を @var{A}の行数、@math{n}を列数とします。
273 @c this code breaks texi2pdf: @math{@var{A} = @var{U} . @var{Sigma} . @var{V^T}}
274 @math{@var{A} = @var{U} . @var{Sigma} . @var{V}^T}
275 のような3つの行列 @var{U}, @var{Sigma}, @var{V^T}から構成されます。
276 ここで、 @var{U}は @math{m}掛け@math{m}のユニタリ行列、
277 @var{Sigma}は @math{m}掛け@math{n}の対角行列、
278 @var{V^T}は @math{n}掛け@math{n}のユニタリ行列です。
281 @math{Sigma}の対角要素、すなわち、 @math{@var{Sigma}[i, i] = @var{sigma}[i]}と
283 要素 @math{sigma[i]}は @var{A}のいわゆる特異値です;
284 これらは実数で、非負で、降順で返されます。
285 @var{U}と @var{V}の最初の @math{min(m, n)}列は
287 @code{dgesvd}は、@var{V}自身ではなく@var{V}の転置を返すことに注意してください。
289 @code{dgesvd(@var{A})}は @var{A}の特異値だけを計算します。
290 @code{dgesvd(@var{A}, @var{left_p}, @var{right_p})}は
292 @math{@var{left_p} = @code{true}}の時、左特異ベクトル、
293 @math{@var{right_p} = @code{true}}の時、右特異ベクトルを計算します。
297 二つ目の項目は @code{false}か、左特異ベクトルの行列です。
298 三つ目の項目は @code{false}か、右特異ベクトルの行列です。
305 @c M: matrix([1, 2, 3], [3.5, 0.5, 8], [-1, 2, -3], [4, 9, 7]);
307 @c [sigma, U, VT] : dgesvd (M, true, true);
311 @c genmatrix(lambda ([i, j], if i=j then sigma[i] else 0),
313 @c U . Sigma . VT - M;
314 @c transpose (U) . U;
315 @c VT . transpose (VT);
319 (%i2) fpprintprec : 6;
321 (%i3) M: matrix([1, 2, 3], [3.5, 0.5, 8], [-1, 2, -3], [4, 9, 7]);
330 (%o4) [[14.4744, 6.38637, .452547], false, false]
331 (%i5) [sigma, U, VT] : dgesvd (M, true, true);
332 (%o5) [[14.4744, 6.38637, .452547],
333 [ - .256731 .00816168 .959029 - .119523 ]
335 [ - .526456 .672116 - .206236 - .478091 ]
337 [ .107997 - .532278 - .0708315 - 0.83666 ]
339 [ - .803287 - .514659 - .180867 .239046 ]
340 [ - .374486 - .538209 - .755044 ]
342 [ .130623 - .836799 0.5317 ]]
344 [ - .917986 .100488 .383672 ]
345 (%i6) m : length (U);
347 (%i7) n : length (VT);
350 genmatrix(lambda ([i, j], if i=j then sigma[i] else 0),
359 (%i9) U . Sigma . VT - M;
360 [ 1.11022E-15 0.0 1.77636E-15 ]
362 [ 1.33227E-15 1.66533E-15 0.0 ]
364 [ - 4.44089E-16 - 8.88178E-16 4.44089E-16 ]
366 [ 8.88178E-16 1.77636E-15 8.88178E-16 ]
367 (%i10) transpose (U) . U;
368 [ 1.0 5.55112E-17 2.498E-16 2.77556E-17 ]
370 [ 5.55112E-17 1.0 5.55112E-17 4.16334E-17 ]
372 [ 2.498E-16 5.55112E-17 1.0 - 2.08167E-16 ]
374 [ 2.77556E-17 4.16334E-17 - 2.08167E-16 1.0 ]
375 (%i11) VT . transpose (VT);
376 [ 1.0 0.0 - 5.55112E-17 ]
378 (%o11) [ 0.0 1.0 5.55112E-17 ]
380 [ - 5.55112E-17 5.55112E-17 1.0 ]
384 @category{Package lapack}
389 @deffn {関数} dlange (@var{norm}, @var{A})
390 @deffnx {関数} zlange (@var{norm}, @var{A})
392 行列 @var{A}のノルムもしくはノルムのような関数を計算します。
396 @math{max(abs(A(i, j)))}を計算します。
397 ここで @math{i}と @math{j}はそれぞれ行と列を行き渡ります。
398 この関数は適切な行列ノルムではないことに注意してください。
400 @var{A}の @math{L[1]}ノルム、
401 すなわち、それぞれの列の要素の絶対値の和の最大値
404 @var{A}の @math{L[inf]}ノルム、
405 すなわち、それぞれの行の要素の絶対値の和の最大値
408 @var{A}のFrobeniusノルム、すなわち、
414 @category{Package lapack}
419 @deffn {関数} dgemm (@var{A}, @var{B})
420 @deffnx {関数} dgemm (@var{A}, @var{B}, @var{options})
421 2つの行列の積を計算します。オプションで積を三つ目の行列に足し算します。
424 @code{dgemm(@var{A}, @var{B})}は
425 2つの実行列 @var{A}と @var{B}の積を計算します。
429 @math{@var{alpha} * @var{A} * @var{B} + @var{beta} * @var{C}}
431 ここで @var{A}, @var{B}, @var{C}は
433 @var{alpha}と @var{beta}は実数です。
434 オプションで、 @var{A}と/もしくは @var{B}は
435 積を計算する前に転置を取ることができます。
436 追加のパラメータはオプションのキーワード引数で指定できます:
439 それらはすべて、形式 @code{key=val}を取ります。
445 デフォルトは @code{false}であり、行列を足さないことを意味します。
447 @var{A}と @var{B}の積がこの値に掛けられます。
451 この値は、足される前に@var{C}に掛けられます。
452 デフォルト値は0で、これは, たとえ@var{C}が与えられても
453 @var{C}が足されないことを意味します。
454 故に、必ず@var{beta}に零でない値を指定してください。
457 @var{A}の代わりに@var{A}の転置が積に使われます。
458 デフォルトは @code{false}です。
461 @var{B}の代わりに@var{B}の転置が積に使われます。
462 デフォルトは @code{false}です。
467 @c A : matrix([1,2,3],[4,5,6],[7,8,9]);
468 @c B : matrix([-1,-2,-3],[-4,-5,-6],[-7,-8,-9]);
469 @c C : matrix([3,2,1],[6,5,4],[9,8,7]);
472 @c dgemm(A,B,transpose_a=true);
474 @c dgemm(A,B,c=C,beta=1);
476 @c dgemm(A,B,c=C,beta=1, alpha=-1);
480 (%i2) A : matrix([1,2,3],[4,5,6],[7,8,9]);
486 (%i3) B : matrix([-1,-2,-3],[-4,-5,-6],[-7,-8,-9]);
489 (%o3) [ - 4 - 5 - 6 ]
492 (%i4) C : matrix([3,2,1],[6,5,4],[9,8,7]);
499 [ - 30.0 - 36.0 - 42.0 ]
501 (%o5) [ - 66.0 - 81.0 - 96.0 ]
503 [ - 102.0 - 126.0 - 150.0 ]
507 (%o6) [ - 66 - 81 - 96 ]
509 [ - 102 - 126 - 150 ]
510 (%i7) dgemm(A,B,transpose_a=true);
511 [ - 66.0 - 78.0 - 90.0 ]
513 (%o7) [ - 78.0 - 93.0 - 108.0 ]
515 [ - 90.0 - 108.0 - 126.0 ]
516 (%i8) transpose(A) . B;
519 (%o8) [ - 78 - 93 - 108 ]
522 (%i9) dgemm(A,B,c=C,beta=1);
523 [ - 27.0 - 34.0 - 41.0 ]
525 (%o9) [ - 60.0 - 76.0 - 92.0 ]
527 [ - 93.0 - 118.0 - 143.0 ]
531 (%o10) [ - 60 - 76 - 92 ]
534 (%i11) dgemm(A,B,c=C,beta=1, alpha=-1);
537 (%o11) [ 72.0 86.0 100.0 ]
539 [ 111.0 134.0 157.0 ]
549 @category{Package lapack}