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