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}
17 @category{Share packages}
18 @category{Package lapack}
22 @node Functions and Variables for lapack, , Introduction to lapack, lapack
23 @section Functions and Variables for lapack
25 @deffn {関数} dgeev (@var{A})
26 @deffnx {関数} dgeev (@var{A}, @var{right_p}, @var{left_p})
28 行列@var{A}の固有値と、オプションで固有ベクトルを計算します。
29 @var{A}の要素はすべて整数か浮動小数点数でなければいけません。
30 @var{A}は平方(行と列が同じ数)でなければいけません。
31 @var{A}は対称であってもなくてもいいです。
33 @code{dgeev(@var{A})}は@var{A}の固有値だけを計算します。
34 @code{dgeev(@var{A}, @var{right_p}, @var{left_p})}は
36 @math{@var{right_p} = @code{true}}の時、右固有ベクトル、
37 @math{@var{left_p} = @code{true}}の時、左固有ベクトルを計算します。
41 二番目の項目は@code{false}か右固有ベクトルの行列です。
42 三番目の項目は@code{false}か左固有ベクトルの行列です。
44 右固有ベクトル@math{v(j)} (右固有ベクトル行列の@math{j}番目の列)は
46 @math{A . v(j) = lambda(j) . v(j)}
48 を満たします。ここで@math{lambda(j)}は対応する固有値です。
50 左固有ベクトル@math{v(j)} (左固有ベクトル行列の@math{j}番目の列)は
52 @math{u(j)**H . A = lambda(j) . u(j)**H}
54 を満たします。ここで@math{u(j)**H}は@math{u(j)}の共役転置を意味します。
55 Maxima関数@code{ctranspose}が共役転置を計算します。
59 最大成分の虚部が0になるように規格化されます。
66 @c M : matrix ([9.5, 1.75], [3.25, 10.45]);
68 @c [L, v, u] : dgeev (M, true, true);
69 @c D : apply (diag_matrix, L);
71 @c transpose (u) . M - D . transpose (u);
74 (%i1) load ("lapack")$
75 (%i2) fpprintprec : 6;
77 (%i3) M : matrix ([9.5, 1.75], [3.25, 10.45]);
82 (%o4) [[7.54331, 12.4067], false, false]
83 (%i5) [L, v, u] : dgeev (M, true, true);
84 [ - .666642 - .515792 ]
85 (%o5) [[7.54331, 12.4067], [ ],
87 [ - .856714 - .745378 ]
90 (%i6) D : apply (diag_matrix, L);
98 (%i8) transpose (u) . M - D . transpose (u);
105 @category{Package lapack}
110 @deffn {関数} dgeqrf (@var{A})
114 @var{A}のすべての要素は整数か浮動小数点数でなければいけません。
115 @var{A}は行と列の数は同じかもしれませんし違うかもしれません。
118 一番目の項目は行列 @var{Q}で、それは@var{A}と同じ行数を持つ平方正規直交行列です。
119 二番目の項目は行列 @var{R}で、それは@var{A}tお同じサイズで、
120 対角以下のすべての要素がが零に等しいものです。
121 積 @code{@var{Q} . @var{R}}は(浮動小数点の丸め誤差を除いて)@var{A}に等しい。
127 @c M : matrix ([1, -3.2, 8], [-11, 2.7, 5.9]);
128 @c [q, r] : dgeqrf (M);
133 (%i1) load ("lapack") $
134 (%i2) fpprintprec : 6 $
135 (%i3) M : matrix ([1, -3.2, 8], [-11, 2.7, 5.9]) $
136 (%i4) [q, r] : dgeqrf (M);
137 [ - .0905357 .995893 ]
140 [ - 11.0454 2.97863 5.15148 ]
142 [ 0 - 2.94241 8.50131 ]
144 [ - 7.77156E-16 1.77636E-15 - 8.88178E-16 ]
146 [ 0.0 - 1.33227E-15 8.88178E-16 ]
147 (%i6) mat_norm (%, 1);
152 @category{Package lapack}
157 @deffn {関数} dgesv (@var{A}, @var{b})
159 線形方程式 @math{@var{A} @var{x} = @var{b}}の
162 @var{b}は@var{A}と同じ数の行と任意の長さの列を持つ行列です。
163 戻り値 @var{x}は @var{b}と同じサイズです。
166 @code{float}を介して実の浮動小数点数に評価されなければいけません;
167 従って、要素は任意の数値型か、数値定数のシンボルか、
169 @var{x}の要素はいつも浮動小数点数です。
170 すべての算術は浮動小数演算として実行されます。
179 線形方程式 @math{@var{A} @var{x} = @var{b}}の解を計算します。
182 @c A : matrix ([1, -2.5], [0.375, 5]);
183 @c b : matrix ([1.75], [-0.625]);
185 @c dlange (inf_norm, b - A . x);
188 (%i1) A : matrix ([1, -2.5], [0.375, 5]);
192 (%i2) b : matrix ([1.75], [-0.625]);
196 (%i3) x : dgesv (A, b);
197 [ 1.210526315789474 ]
199 [ - 0.215789473684211 ]
200 (%i4) dlange (inf_norm, b - A.x);
204 @var{b}は@var{A}と同じ数の行と任意の長さの列を持つ行列です。
205 @var{x}は @var{b}と同じサイズです。
208 @c A : matrix ([1, -0.15], [1.82, 2]);
209 @c b : matrix ([3.7, 1, 8], [-2.3, 5, -3.9]);
211 @c dlange (inf_norm, b - A . x);
214 (%i1) A : matrix ([1, -0.15], [1.82, 2]);
218 (%i2) b : matrix ([3.7, 1, 8], [-2.3, 5, -3.9]);
222 (%i3) x : dgesv (A, b);
223 [ 3.103827540695117 1.20985481742191 6.781786185657722 ]
225 [ - 3.974483062032557 1.399032116146062 - 8.121425428948527 ]
226 (%i4) dlange (inf_norm, b - A . x);
227 (%o4) 1.1102230246251565E-15
231 実の浮動小数点数に評価されなければいけません;
234 @c A : matrix ([5, -%pi], [1b0, 11/17]);
235 @c b : matrix ([%e], [sin(1)]);
237 @c dlange (inf_norm, b - A . x);
240 (%i1) A : matrix ([5, -%pi], [1b0, 11/17]);
246 (%i2) b : matrix ([%e], [sin(1)]);
250 (%i3) x : dgesv (A, b);
251 [ 0.690375643155986 ]
253 [ 0.233510982552952 ]
254 (%i4) dlange (inf_norm, b - A . x);
255 (%o4) 2.220446049250313E-16
259 @category{Package lapack}
260 @category{Linear equations}
265 @deffn {関数} dgesvd (@var{A})
266 @deffnx {関数} dgesvd (@var{A}, @var{left_p}, @var{right_p})
268 特異値から成る行列 @var{A}の特異値分解(SVD)を計算します。
269 オプションで左および右特異ベクトルを取ります。
271 @var{A}の要素はすべて整数か浮動小数点数でなければいけません。
272 @var{A}は(行と列が同じ数の)平方かもしれませんし、そうでないかもしれません。
274 @math{m}を @var{A}の行数、@math{n}を列数とします。
276 @c this code breaks texi2pdf: @math{@var{A} = @var{U} . @var{Sigma} . @var{V^T}}
277 @math{@var{A} = @var{U} . @var{Sigma} . @var{V}^T}
278 のような3つの行列 @var{U}, @var{Sigma}, @var{V^T}から構成されます。
279 ここで、 @var{U}は @math{m}掛け@math{m}のユニタリ行列、
280 @var{Sigma}は @math{m}掛け@math{n}の対角行列、
281 @var{V^T}は @math{n}掛け@math{n}のユニタリ行列です。
284 @math{Sigma}の対角要素、すなわち、 @math{@var{Sigma}[i, i] = @var{sigma}[i]}と
286 要素 @math{sigma[i]}は @var{A}のいわゆる特異値です;
287 これらは実数で、非負で、降順で返されます。
288 @var{U}と @var{V}の最初の @math{min(m, n)}列は
290 @code{dgesvd}は、@var{V}自身ではなく@var{V}の転置を返すことに注意してください。
292 @code{dgesvd(@var{A})}は @var{A}の特異値だけを計算します。
293 @code{dgesvd(@var{A}, @var{left_p}, @var{right_p})}は
295 @math{@var{left_p} = @code{true}}の時、左特異ベクトル、
296 @math{@var{right_p} = @code{true}}の時、右特異ベクトルを計算します。
300 二つ目の項目は @code{false}か、左特異ベクトルの行列です。
301 三つ目の項目は @code{false}か、右特異ベクトルの行列です。
308 @c M: matrix([1, 2, 3], [3.5, 0.5, 8], [-1, 2, -3], [4, 9, 7]);
310 @c [sigma, U, VT] : dgesvd (M, true, true);
314 @c genmatrix(lambda ([i, j], if i=j then sigma[i] else 0),
316 @c U . Sigma . VT - M;
317 @c transpose (U) . U;
318 @c VT . transpose (VT);
321 (%i1) load ("lapack")$
322 (%i2) fpprintprec : 6;
324 (%i3) M: matrix([1, 2, 3], [3.5, 0.5, 8], [-1, 2, -3], [4, 9, 7]);
333 (%o4) [[14.4744, 6.38637, .452547], false, false]
334 (%i5) [sigma, U, VT] : dgesvd (M, true, true);
335 (%o5) [[14.4744, 6.38637, .452547],
336 [ - .256731 .00816168 .959029 - .119523 ]
338 [ - .526456 .672116 - .206236 - .478091 ]
340 [ .107997 - .532278 - .0708315 - 0.83666 ]
342 [ - .803287 - .514659 - .180867 .239046 ]
343 [ - .374486 - .538209 - .755044 ]
345 [ .130623 - .836799 0.5317 ]]
347 [ - .917986 .100488 .383672 ]
348 (%i6) m : length (U);
350 (%i7) n : length (VT);
353 genmatrix(lambda ([i, j], if i=j then sigma[i] else 0),
362 (%i9) U . Sigma . VT - M;
363 [ 1.11022E-15 0.0 1.77636E-15 ]
365 [ 1.33227E-15 1.66533E-15 0.0 ]
367 [ - 4.44089E-16 - 8.88178E-16 4.44089E-16 ]
369 [ 8.88178E-16 1.77636E-15 8.88178E-16 ]
370 (%i10) transpose (U) . U;
371 [ 1.0 5.55112E-17 2.498E-16 2.77556E-17 ]
373 [ 5.55112E-17 1.0 5.55112E-17 4.16334E-17 ]
375 [ 2.498E-16 5.55112E-17 1.0 - 2.08167E-16 ]
377 [ 2.77556E-17 4.16334E-17 - 2.08167E-16 1.0 ]
378 (%i11) VT . transpose (VT);
379 [ 1.0 0.0 - 5.55112E-17 ]
381 (%o11) [ 0.0 1.0 5.55112E-17 ]
383 [ - 5.55112E-17 5.55112E-17 1.0 ]
387 @category{Package lapack}
392 @deffn {関数} dlange (@var{norm}, @var{A})
393 @deffnx {関数} zlange (@var{norm}, @var{A})
395 行列 @var{A}のノルムもしくはノルムのような関数を計算します。
399 @math{max(abs(A(i, j)))}を計算します。
400 ここで @math{i}と @math{j}はそれぞれ行と列を行き渡ります。
401 この関数は適切な行列ノルムではないことに注意してください。
403 @var{A}の @math{L[1]}ノルム、
404 すなわち、それぞれの列の要素の絶対値の和の最大値
407 @var{A}の @math{L[inf]}ノルム、
408 すなわち、それぞれの行の要素の絶対値の和の最大値
411 @var{A}のFrobeniusノルム、すなわち、
417 @category{Package lapack}
422 @deffn {関数} dgemm (@var{A}, @var{B})
423 @deffnx {関数} dgemm (@var{A}, @var{B}, @var{options})
424 2つの行列の積を計算します。オプションで積を三つ目の行列に足し算します。
427 @code{dgemm(@var{A}, @var{B})}は
428 2つの実行列 @var{A}と @var{B}の積を計算します。
432 @math{@var{alpha} * @var{A} * @var{B} + @var{beta} * @var{C}}
434 ここで @var{A}, @var{B}, @var{C}は
436 @var{alpha}と @var{beta}は実数です。
437 オプションで、 @var{A}と/もしくは @var{B}は
438 積を計算する前に転置を取ることができます。
439 追加のパラメータはオプションのキーワード引数で指定できます:
442 それらはすべて、形式 @code{key=val}を取ります。
448 デフォルトは @code{false}であり、行列を足さないことを意味します。
450 @var{A}と @var{B}の積がこの値に掛けられます。
454 この値は、足される前に@var{C}に掛けられます。
455 デフォルト値は0で、これは, たとえ@var{C}が与えられても
456 @var{C}が足されないことを意味します。
457 故に、必ず@var{beta}に零でない値を指定してください。
460 @var{A}の代わりに@var{A}の転置が積に使われます。
461 デフォルトは @code{false}です。
464 @var{B}の代わりに@var{B}の転置が積に使われます。
465 デフォルトは @code{false}です。
470 @c A : matrix([1,2,3],[4,5,6],[7,8,9]);
471 @c B : matrix([-1,-2,-3],[-4,-5,-6],[-7,-8,-9]);
472 @c C : matrix([3,2,1],[6,5,4],[9,8,7]);
475 @c dgemm(A,B,transpose_a=true);
477 @c dgemm(A,B,c=C,beta=1);
479 @c dgemm(A,B,c=C,beta=1, alpha=-1);
482 (%i1) load ("lapack")$
483 (%i2) A : matrix([1,2,3],[4,5,6],[7,8,9]);
489 (%i3) B : matrix([-1,-2,-3],[-4,-5,-6],[-7,-8,-9]);
492 (%o3) [ - 4 - 5 - 6 ]
495 (%i4) C : matrix([3,2,1],[6,5,4],[9,8,7]);
502 [ - 30.0 - 36.0 - 42.0 ]
504 (%o5) [ - 66.0 - 81.0 - 96.0 ]
506 [ - 102.0 - 126.0 - 150.0 ]
510 (%o6) [ - 66 - 81 - 96 ]
512 [ - 102 - 126 - 150 ]
513 (%i7) dgemm(A,B,transpose_a=true);
514 [ - 66.0 - 78.0 - 90.0 ]
516 (%o7) [ - 78.0 - 93.0 - 108.0 ]
518 [ - 90.0 - 108.0 - 126.0 ]
519 (%i8) transpose(A) . B;
522 (%o8) [ - 78 - 93 - 108 ]
525 (%i9) dgemm(A,B,c=C,beta=1);
526 [ - 27.0 - 34.0 - 41.0 ]
528 (%o9) [ - 60.0 - 76.0 - 92.0 ]
530 [ - 93.0 - 118.0 - 143.0 ]
534 (%o10) [ - 60 - 76 - 92 ]
537 (%i11) dgemm(A,B,c=C,beta=1, alpha=-1);
540 (%o11) [ 72.0 86.0 100.0 ]
542 [ 111.0 134.0 157.0 ]
552 @category{Package lapack}