In MARK+3 (src/db.lisp), quiet warning from SBCL about "Derived type conflicting...
[maxima.git] / doc / info / ja / lapack.texi
blob2a9566ae9c1ac1ffc00dbfcc258e14d2861b0761
1 @menu
2 * Introduction to lapack::
3 * Functions and Variables for lapack::
4 @end menu
6 @node Introduction to lapack, Functions and Variables for lapack, lapack, lapack
7 @section Introduction to lapack
9 @code{lapack}は
10 SLATECプロジェクトから得られるようなFortranライブラリLAPACKの
11 (プログラム @code{f2c}を介した) Common Lisp翻訳です。
13 (訳者注意書き: lapackを使用するには、load("lapack"); load("eigensys");を実行してください。load("lapack")には、初回だけコンパイルで時間がかかるかもしれません。)
15 @opencatbox
16 @category{Numerical methods}
17 @category{Share packages}
18 @category{Package lapack}
19 @closecatbox
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})}は
35 @var{A}の固有値と、
36 @math{@var{right_p} = @code{true}}の時、右固有ベクトル、
37 @math{@var{left_p} = @code{true}}の時、左固有ベクトルを計算します。
39 3項目のリストが返されます。
40 最初の項目は固有値のリストです。
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}が共役転置を計算します。
57 計算された固有ベクトルは、
58 Euclideanノルムが1に等しく、
59 最大成分の虚部が0になるように規格化されます。
61 例:
63 @c ===beg===
64 @c load ("lapack")$
65 @c fpprintprec : 6;
66 @c M : matrix ([9.5, 1.75], [3.25, 10.45]);
67 @c dgeev (M);
68 @c [L, v, u] : dgeev (M, true, true);
69 @c D : apply (diag_matrix, L);
70 @c M . v - v . D;
71 @c transpose (u) . M - D . transpose (u);
72 @c ===end===
73 @example
74 (%i1) load ("lapack")$
75 (%i2) fpprintprec : 6;
76 (%o2)                           6
77 (%i3) M : matrix ([9.5, 1.75], [3.25, 10.45]);
78                          [ 9.5   1.75  ]
79 (%o3)                    [             ]
80                          [ 3.25  10.45 ]
81 (%i4) dgeev (M);
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], [                      ], 
86                            [  .745378   - .856714 ]
87                                         [ - .856714  - .745378 ]
88                                         [                      ]]
89                                         [  .515792   - .666642 ]
90 (%i6) D : apply (diag_matrix, L);
91                       [ 7.54331     0    ]
92 (%o6)                 [                  ]
93                       [    0     12.4067 ]
94 (%i7) M . v - v . D;
95                 [      0.0       - 8.88178E-16 ]
96 (%o7)           [                              ]
97                 [ - 8.88178E-16       0.0      ]
98 (%i8) transpose (u) . M - D . transpose (u);
99                      [ 0.0  - 4.44089E-16 ]
100 (%o8)                [                    ]
101                      [ 0.0       0.0      ]
102 @end example
104 @opencatbox
105 @category{Package lapack}
106 @closecatbox
108 @end deffn
110 @deffn {関数} dgeqrf (@var{A})
112 行列 @var{A}のQR分解します。
113 All elements of 
114 @var{A}のすべての要素は整数か浮動小数点数でなければいけません。
115 @var{A}は行と列の数は同じかもしれませんし違うかもしれません。
117 2つの項目のリストを返します。
118 一番目の項目は行列 @var{Q}で、それは@var{A}と同じ行数を持つ平方正規直交行列です。
119 二番目の項目は行列 @var{R}で、それは@var{A}tお同じサイズで、
120 対角以下のすべての要素がが零に等しいものです。
121 積 @code{@var{Q} . @var{R}}は(浮動小数点の丸め誤差を除いて)@var{A}に等しい。
122 ここで "."は非可換乗算演算子です。
124 @c ===beg===
125 @c load ("lapack")$
126 @c fpprintprec : 6;
127 @c M : matrix ([1, -3.2, 8], [-11, 2.7, 5.9]);
128 @c [q, r] : dgeqrf (M);
129 @c q . r - M;
130 @c mat_norm (%);
131 @c ===end===
132 @example
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  ]
138 (%o4) [[                      ], 
139        [  .995893    .0905357 ]
140                                [ - 11.0454   2.97863   5.15148 ]
141                                [                               ]]
142                                [     0      - 2.94241  8.50131 ]
143 (%i5) q . r - M;
144          [ - 7.77156E-16   1.77636E-15   - 8.88178E-16 ]
145 (%o5)    [                                             ]
146          [      0.0       - 1.33227E-15   8.88178E-16  ]
147 (%i6) mat_norm (%, 1);
148 (%o6)                      3.10862E-15
149 @end example
151 @opencatbox
152 @category{Package lapack}
153 @closecatbox
155 @end deffn
157 @deffn {関数} dgesv (@var{A}, @var{b})
159 線形方程式 @math{@var{A} @var{x} = @var{b}}の
160 解 @var{x}を計算します。
161 ここで、 @var{A}は平方行列、
162 @var{b}は@var{A}と同じ数の行と任意の長さの列を持つ行列です。
163 戻り値 @var{x}は @var{b}と同じサイズです。
165 @var{A}と @var{b}の要素は
166 @code{float}を介して実の浮動小数点数に評価されなければいけません;
167 従って、要素は任意の数値型か、数値定数のシンボルか、
168 浮動小数点に評価される式であり得ます。
169 @var{x}の要素はいつも浮動小数点数です。
170 すべての算術は浮動小数演算として実行されます。
172 @code{dgesv}は
173 @var{A}のLU分解を介して
174 解を計算します。
176 例:
178 @code{dgesv}は
179 線形方程式 @math{@var{A} @var{x} = @var{b}}の解を計算します。
181 @c ===beg===
182 @c A : matrix ([1, -2.5], [0.375, 5]);
183 @c b : matrix ([1.75], [-0.625]);
184 @c x : dgesv (A, b);
185 @c dlange (inf_norm, b - A . x);
186 @c ===end===
187 @example
188 (%i1) A : matrix ([1, -2.5], [0.375, 5]);
189                                [   1    - 2.5 ]
190 (%o1)                          [              ]
191                                [ 0.375    5   ]
192 (%i2) b : matrix ([1.75], [-0.625]);
193                                   [  1.75   ]
194 (%o2)                             [         ]
195                                   [ - 0.625 ]
196 (%i3) x : dgesv (A, b);
197                             [  1.210526315789474  ]
198 (%o3)                       [                     ]
199                             [ - 0.215789473684211 ]
200 (%i4) dlange (inf_norm, b - A.x);
201 (%o4)                                 0.0
202 @end example
204 @var{b}は@var{A}と同じ数の行と任意の長さの列を持つ行列です。
205 @var{x}は @var{b}と同じサイズです。
207 @c ===beg===
208 @c A : matrix ([1, -0.15], [1.82, 2]);
209 @c b : matrix ([3.7, 1, 8], [-2.3, 5, -3.9]);
210 @c x : dgesv (A, b);
211 @c dlange (inf_norm, b - A . x);
212 @c ===end===
213 @example
214 (%i1) A : matrix ([1, -0.15], [1.82, 2]);
215                                [  1    - 0.15 ]
216 (%o1)                          [              ]
217                                [ 1.82    2    ]
218 (%i2) b : matrix ([3.7, 1, 8], [-2.3, 5, -3.9]);
219                               [  3.7   1    8   ]
220 (%o2)                         [                 ]
221                               [ - 2.3  5  - 3.9 ]
222 (%i3) x : dgesv (A, b);
223       [  3.103827540695117   1.20985481742191    6.781786185657722  ]
224 (%o3) [                                                             ]
225       [ - 3.974483062032557  1.399032116146062  - 8.121425428948527 ]
226 (%i4) dlange (inf_norm, b - A . x);
227 (%o4)                       1.1102230246251565E-15
228 @end example
230 @var{A}と @var{b}の要素は
231 実の浮動小数点数に評価されなければいけません;
233 @c ===beg===
234 @c A : matrix ([5, -%pi], [1b0, 11/17]);
235 @c b : matrix ([%e], [sin(1)]);
236 @c x : dgesv (A, b);
237 @c dlange (inf_norm, b - A . x);
238 @c ===end===
239 @example
240 (%i1) A : matrix ([5, -%pi], [1b0, 11/17]);
241                                [   5    - %pi ]
242                                [              ]
243 (%o1)                          [         11   ]
244                                [ 1.0b0   --   ]
245                                [         17   ]
246 (%i2) b : matrix ([%e], [sin(1)]);
247                                   [   %e   ]
248 (%o2)                             [        ]
249                                   [ sin(1) ]
250 (%i3) x : dgesv (A, b);
251                              [ 0.690375643155986 ]
252 (%o3)                        [                   ]
253                              [ 0.233510982552952 ]
254 (%i4) dlange (inf_norm, b - A . x);
255 (%o4)                        2.220446049250313E-16
256 @end example
258 @opencatbox
259 @category{Package lapack}
260 @category{Linear equations}
261 @closecatbox
263 @end deffn
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}を列数とします。
275 @var{A}の特異値分解は
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}のユニタリ行列です。
283 @math{sigma[i]}を
284 @math{Sigma}の対角要素、すなわち、 @math{@var{Sigma}[i, i] = @var{sigma}[i]}と
285 します。
286 要素 @math{sigma[i]}は @var{A}のいわゆる特異値です;
287 これらは実数で、非負で、降順で返されます。
288 @var{U}と @var{V}の最初の @math{min(m, n)}列は
289 @var{A}の左と右特異ベクトルです。
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})}は
294 @var{A}の特異値と、
295 @math{@var{left_p} = @code{true}}の時、左特異ベクトル、
296 @math{@var{right_p} = @code{true}}の時、右特異ベクトルを計算します。
298 3つの項目のリストが返されます。
299 一つ目の項目は特異値のリストです。
300 二つ目の項目は @code{false}か、左特異ベクトルの行列です。
301 三つ目の項目は @code{false}か、右特異ベクトルの行列です。
303 例:
305 @c ===beg===
306 @c load ("lapack")$
307 @c fpprintprec : 6;
308 @c M: matrix([1, 2, 3], [3.5, 0.5, 8], [-1, 2, -3], [4, 9, 7]);
309 @c dgesvd (M);
310 @c [sigma, U, VT] : dgesvd (M, true, true);
311 @c m : length (U);
312 @c n : length (VT);
313 @c Sigma:
314 @c   genmatrix(lambda ([i, j], if i=j then sigma[i] else 0),
315 @c             m, n);
316 @c U . Sigma . VT - M;
317 @c transpose (U) . U;
318 @c VT . transpose (VT);
319 @c ===end===
320 @example
321 (%i1) load ("lapack")$
322 (%i2) fpprintprec : 6;
323 (%o2)                           6
324 (%i3) M: matrix([1, 2, 3], [3.5, 0.5, 8], [-1, 2, -3], [4, 9, 7]);
325                         [  1    2    3  ]
326                         [               ]
327                         [ 3.5  0.5   8  ]
328 (%o3)                   [               ]
329                         [ - 1   2   - 3 ]
330                         [               ]
331                         [  4    9    7  ]
332 (%i4) dgesvd (M);
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 ]
337 [                                             ]
338 [ - .526456   .672116   - .206236   - .478091 ]
339 [                                             ], 
340 [  .107997   - .532278  - .0708315  - 0.83666 ]
341 [                                             ]
342 [ - .803287  - .514659  - .180867    .239046  ]
343 [ - .374486  - .538209  - .755044 ]
344 [                                 ]
345 [  .130623   - .836799   0.5317   ]]
346 [                                 ]
347 [ - .917986   .100488    .383672  ]
348 (%i6) m : length (U);
349 (%o6)                           4
350 (%i7) n : length (VT);
351 (%o7)                           3
352 (%i8) Sigma:
353         genmatrix(lambda ([i, j], if i=j then sigma[i] else 0),
354                   m, n);
355                   [ 14.4744     0        0    ]
356                   [                           ]
357                   [    0     6.38637     0    ]
358 (%o8)             [                           ]
359                   [    0        0     .452547 ]
360                   [                           ]
361                   [    0        0        0    ]
362 (%i9) U . Sigma . VT - M;
363           [  1.11022E-15        0.0       1.77636E-15 ]
364           [                                           ]
365           [  1.33227E-15    1.66533E-15       0.0     ]
366 (%o9)     [                                           ]
367           [ - 4.44089E-16  - 8.88178E-16  4.44089E-16 ]
368           [                                           ]
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  ]
372        [                                                        ]
373        [ 5.55112E-17      1.0       5.55112E-17    4.16334E-17  ]
374 (%o10) [                                                        ]
375        [  2.498E-16   5.55112E-17       1.0       - 2.08167E-16 ]
376        [                                                        ]
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 ]
380           [                                           ]
381 (%o11)    [      0.0           1.0       5.55112E-17  ]
382           [                                           ]
383           [ - 5.55112E-17  5.55112E-17       1.0      ]
384 @end example
386 @opencatbox
387 @category{Package lapack}
388 @closecatbox
390 @end deffn
392 @deffn {関数} dlange (@var{norm}, @var{A})
393 @deffnx {関数} zlange (@var{norm}, @var{A})
395 行列 @var{A}のノルムもしくはノルムのような関数を計算します。
397 @table @code
398 @item max
399 @math{max(abs(A(i, j)))}を計算します。
400 ここで @math{i}と @math{j}はそれぞれ行と列を行き渡ります。
401 この関数は適切な行列ノルムではないことに注意してください。
402 @item one_norm
403 @var{A}の @math{L[1]}ノルム、
404 すなわち、それぞれの列の要素の絶対値の和の最大値
405 を計算します。
406 @item inf_norm
407 @var{A}の @math{L[inf]}ノルム、
408 すなわち、それぞれの行の要素の絶対値の和の最大値
409 を計算します。
410 @item frobenius
411 @var{A}のFrobeniusノルム、すなわち、
412 行列要素の平方の和の平方根
413 を計算します。
414 @end table
416 @opencatbox
417 @category{Package lapack}
418 @closecatbox
420 @end deffn
422 @deffn {関数} dgemm (@var{A}, @var{B})
423 @deffnx {関数} dgemm (@var{A}, @var{B}, @var{options})
424 2つの行列の積を計算します。オプションで積を三つ目の行列に足し算します。
426 最も簡単な形式では、
427 @code{dgemm(@var{A}, @var{B})}は
428 2つの実行列 @var{A}と @var{B}の積を計算します。
430 二番目の形式では、
431 @code{dgemm}は
432 @math{@var{alpha} * @var{A} * @var{B} + @var{beta} * @var{C}}
433 を計算します。
434 ここで @var{A}, @var{B}, @var{C}は
435 適当なサイズの実行列であり、
436 @var{alpha}と @var{beta}は実数です。
437 オプションで、 @var{A}と/もしくは @var{B}は
438 積を計算する前に転置を取ることができます。
439 追加のパラメータはオプションのキーワード引数で指定できます:
440 キーワード引数はオプションで、
441 どんな順番でも指定できます。
442 それらはすべて、形式 @code{key=val}を取ります。
443 キーワード引数は以下の通りです:
445 @table @code
446 @item C
447 足すべき行列 @var{C}。
448 デフォルトは @code{false}であり、行列を足さないことを意味します。
449 @item alpha
450 @var{A}と @var{B}の積がこの値に掛けられます。
451 デフォルトは1です。
452 @item beta
453 もし行列 @var{C}が与えられたら、
454 この値は、足される前に@var{C}に掛けられます。
455 デフォルト値は0で、これは, たとえ@var{C}が与えられても
456 @var{C}が足されないことを意味します。
457 故に、必ず@var{beta}に零でない値を指定してください。
458 @item transpose_a
459 もし @code{true}なら、
460 @var{A}の代わりに@var{A}の転置が積に使われます。
461 デフォルトは @code{false}です。
462 @item transpose_b
463 もし @code{true}なら
464 @var{B}の代わりに@var{B}の転置が積に使われます。
465 デフォルトは @code{false}です。
466 @end table
468 @c ===beg===
469 @c load ("lapack")$
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]);
473 @c dgemm(A,B);
474 @c A . B;
475 @c dgemm(A,B,transpose_a=true);
476 @c transpose(A) . B;
477 @c dgemm(A,B,c=C,beta=1);
478 @c A . B + C;
479 @c dgemm(A,B,c=C,beta=1, alpha=-1);
480 @c -A . B + C
481 @example
482 (%i1) load ("lapack")$
483 (%i2) A : matrix([1,2,3],[4,5,6],[7,8,9]);
484                                   [ 1  2  3 ]
485                                   [         ]
486 (%o2)                             [ 4  5  6 ]
487                                   [         ]
488                                   [ 7  8  9 ]
489 (%i3) B : matrix([-1,-2,-3],[-4,-5,-6],[-7,-8,-9]);
490                                [ - 1  - 2  - 3 ]
491                                [               ]
492 (%o3)                          [ - 4  - 5  - 6 ]
493                                [               ]
494                                [ - 7  - 8  - 9 ]
495 (%i4) C : matrix([3,2,1],[6,5,4],[9,8,7]);
496                                   [ 3  2  1 ]
497                                   [         ]
498 (%o4)                             [ 6  5  4 ]
499                                   [         ]
500                                   [ 9  8  7 ]
501 (%i5) dgemm(A,B);
502                          [ - 30.0   - 36.0   - 42.0  ]
503                          [                           ]
504 (%o5)                    [ - 66.0   - 81.0   - 96.0  ]
505                          [                           ]
506                          [ - 102.0  - 126.0  - 150.0 ]
507 (%i6) A . B;
508                             [ - 30   - 36   - 42  ]
509                             [                     ]
510 (%o6)                       [ - 66   - 81   - 96  ]
511                             [                     ]
512                             [ - 102  - 126  - 150 ]
513 (%i7) dgemm(A,B,transpose_a=true);
514                          [ - 66.0  - 78.0   - 90.0  ]
515                          [                          ]
516 (%o7)                    [ - 78.0  - 93.0   - 108.0 ]
517                          [                          ]
518                          [ - 90.0  - 108.0  - 126.0 ]
519 (%i8) transpose(A) . B;
520                            [ - 66  - 78   - 90  ]
521                            [                    ]
522 (%o8)                      [ - 78  - 93   - 108 ]
523                            [                    ]
524                            [ - 90  - 108  - 126 ]
525 (%i9) dgemm(A,B,c=C,beta=1);
526                          [ - 27.0  - 34.0   - 41.0  ]
527                          [                          ]
528 (%o9)                    [ - 60.0  - 76.0   - 92.0  ]
529                          [                          ]
530                          [ - 93.0  - 118.0  - 143.0 ]
531 (%i10) A . B + C;
532                             [ - 27  - 34   - 41  ]
533                             [                    ]
534 (%o10)                      [ - 60  - 76   - 92  ]
535                             [                    ]
536                             [ - 93  - 118  - 143 ]
537 (%i11) dgemm(A,B,c=C,beta=1, alpha=-1);
538                             [ 33.0   38.0   43.0  ]
539                             [                     ]
540 (%o11)                      [ 72.0   86.0   100.0 ]
541                             [                     ]
542                             [ 111.0  134.0  157.0 ]
543 (%i12) -A . B + C;
544                                [ 33   38   43  ]
545                                [               ]
546 (%o12)                         [ 72   86   100 ]
547                                [               ]
548                                [ 111  134  157 ]
550 @end example
551 @opencatbox
552 @category{Package lapack}
553 @closecatbox
555 @end deffn