Mercurial > octave
annotate scripts/sparse/pcg.m @ 26376:00f796120a6d stable
maint: Update copyright dates in all source files.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 02 Jan 2019 16:32:43 -0500 |
parents | ddf8a03beffb |
children | 4e632e942e84 |
rev | line source |
---|---|
26376
00f796120a6d
maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents:
25755
diff
changeset
|
1 ## Copyright (C) 2004-2019 Piotr Krzyzanowski |
00f796120a6d
maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents:
25755
diff
changeset
|
2 ## Copyright (C) 2016-2019 Cristiano Dorigo |
5837 | 3 ## |
4 ## This file is part of Octave. | |
5 ## | |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
6 ## Octave is free software: you can redistribute it and/or modify it |
5837 | 7 ## under the terms of the GNU General Public License as published by |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
8 ## the Free Software Foundation, either version 3 of the License, or |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
9 ## (at your option) any later version. |
5837 | 10 ## |
11 ## Octave is distributed in the hope that it will be useful, but | |
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
14 ## GNU General Public License for more details. |
5837 | 15 ## |
16 ## You should have received a copy of the GNU General Public License | |
7016 | 17 ## along with Octave; see the file COPYING. If not, see |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
18 ## <https://www.gnu.org/licenses/>. |
5837 | 19 |
20 ## -*- texinfo -*- | |
24985
d85b2485af9e
doc: grammarcheck m-files ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24863
diff
changeset
|
21 ## @deftypefn {} {@var{x} =} pcg (@var{A}, @var{b}, @var{tol}, @var{maxit}, @var{m1}, @var{m2}, @var{x0}, @dots{}) |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
22 ## @deftypefnx {} {@var{x} =} pcg (@var{A}, @var{b}, @var{tol}, @var{maxit}, @var{M}, [], @var{x0}, @dots{}) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
23 ## @deftypefnx {} {[@var{x}, @var{flag}, @var{relres}, @var{iter}, @var{resvec}, @var{eigest}] =} pcg (@var{A}, @var{b}, @dots{}) |
5837 | 24 ## |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
25 ## Solve the linear system of equations @w{@code{@var{A} * @var{x} = @var{b}}} |
20164
df437a52bcaf
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19833
diff
changeset
|
26 ## by means of the Preconditioned Conjugate Gradient iterative method. |
df437a52bcaf
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19833
diff
changeset
|
27 ## |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
28 ## The input arguments are: |
5837 | 29 ## |
30 ## @itemize | |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
31 ## @item @var{A} is the matrix of the linear system and it must be square. |
25151
40466945a451
pcg.m: Tweaks to documentation for clarity.
Rik <rik@octave.org>
parents:
25148
diff
changeset
|
32 ## @var{A} can be passed as a matrix, function handle, or inline function |
40466945a451
pcg.m: Tweaks to documentation for clarity.
Rik <rik@octave.org>
parents:
25148
diff
changeset
|
33 ## @code{Afun} such that @code{Afun(x) = A * x}. Additional parameters to |
40466945a451
pcg.m: Tweaks to documentation for clarity.
Rik <rik@octave.org>
parents:
25148
diff
changeset
|
34 ## @code{Afun} may be passed after @var{x0}. |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
35 ## |
25148 | 36 ## @var{A} has to be Hermitian and Positive Definite (@nospell{HPD})@. If |
25151
40466945a451
pcg.m: Tweaks to documentation for clarity.
Rik <rik@octave.org>
parents:
25148
diff
changeset
|
37 ## @code{pcg} detects @var{A} not to be positive definite, a warning is printed |
40466945a451
pcg.m: Tweaks to documentation for clarity.
Rik <rik@octave.org>
parents:
25148
diff
changeset
|
38 ## and the @var{flag} output is set. |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
39 ## |
5837 | 40 ## @item |
17681
f6fded839513
pcg.m: Change success criterion to match reference text (bug #40057)
Rik <rik@octave.org>
parents:
17336
diff
changeset
|
41 ## @var{b} is the right-hand side vector. |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
42 ## |
5837 | 43 ## @item |
44 ## @var{tol} is the required relative tolerance for the residual error, | |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
45 ## @w{@code{@var{b} - @var{A} * @var{x}}}. The iteration stops if |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
46 ## @w{@code{norm (@var{b} - @var{A} * @var{x})} @leq{} |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
47 ## @w{@code{@var{tol} * norm (@var{b})}}}. |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
48 ## If @var{tol} is omitted or empty, then a tolerance of 1e-6 is used. |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
49 ## |
5837 | 50 ## @item |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
51 ## @var{maxit} is the maximum allowed number of iterations; if @var{maxit} |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
52 ## is omitted or empty then a value of 20 is used. |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
53 ## |
5837 | 54 ## @item |
25003
2365c2661b3c
doc: Spellcheck documentation ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24992
diff
changeset
|
55 ## @var{m} is a @nospell{HPD} preconditioning matrix. For any decomposition |
24992
3d5a39077708
avoid some warnings from old versions of makeinfo (bug #53479)
Guillaume Flandin
parents:
24985
diff
changeset
|
56 ## @code{@var{m} = @var{p1} * @var{p2}} such that |
25151
40466945a451
pcg.m: Tweaks to documentation for clarity.
Rik <rik@octave.org>
parents:
25148
diff
changeset
|
57 ## @w{@code{inv (@var{p1}) * @var{A} * inv (@var{p2})}} is @nospell{HPD}, the |
24985
d85b2485af9e
doc: grammarcheck m-files ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24863
diff
changeset
|
58 ## conjugate gradient method is formally applied to the linear system |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
59 ## @w{@code{inv (@var{p1}) * @var{A} * inv (@var{p2}) * @var{y} = inv |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
60 ## (@var{p1}) * @var{b}}}, |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
61 ## with @code{@var{x} = inv (@var{p2}) * @var{y}} (split preconditioning). |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
62 ## In practice, at each iteration of the conjugate gradient method a |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
63 ## linear system with matrix @var{m} is solved with @code{mldivide}. |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
64 ## If a particular factorization |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
65 ## @code{@var{m} = @var{m1} * @var{m2}} is available (for instance, an |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
66 ## incomplete Cholesky factorization of @var{a}), the two matrices |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
67 ## @var{m1} and @var{m2} can be passed and the relative linear systems |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
68 ## are solved with the @code{mldivide} operator. |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
69 ## Note that a proper choice of the preconditioner may dramatically improve |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
70 ## the overall performance of the method. Instead of matrices @var{m1} and |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
71 ## @var{m2}, the user may pass two functions which return the results of |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
72 ## applying the inverse of @var{m1} and @var{m2} to a vector. |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
73 ## If @var{m1} is omitted or empty @code{[]}, then no preconditioning |
24985
d85b2485af9e
doc: grammarcheck m-files ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24863
diff
changeset
|
74 ## is applied. If no factorization of @var{m} is available, @var{m2} |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
75 ## can be omitted or left [], and the input variable @var{m1} can be |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
76 ## used to pass the preconditioner @var{m}. |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
77 ## |
5837 | 78 ## @item |
17681
f6fded839513
pcg.m: Change success criterion to match reference text (bug #40057)
Rik <rik@octave.org>
parents:
17336
diff
changeset
|
79 ## @var{x0} is the initial guess. If @var{x0} is omitted or empty then the |
5837 | 80 ## function sets @var{x0} to a zero vector by default. |
81 ## @end itemize | |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
82 ## |
17681
f6fded839513
pcg.m: Change success criterion to match reference text (bug #40057)
Rik <rik@octave.org>
parents:
17336
diff
changeset
|
83 ## The arguments which follow @var{x0} are treated as parameters, and passed in |
25151
40466945a451
pcg.m: Tweaks to documentation for clarity.
Rik <rik@octave.org>
parents:
25148
diff
changeset
|
84 ## an appropriate manner to any of the functions (@var{A} or @var{m1} or |
40466945a451
pcg.m: Tweaks to documentation for clarity.
Rik <rik@octave.org>
parents:
25148
diff
changeset
|
85 ## @var{m2}) that have been given to @code{pcg}. |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
86 ## See the examples below for further details. |
24849
96c74e33d17a
pcg.m: Overhaul function and BIST tests (bug #53258).
Rik <rik@octave.org>
parents:
24534
diff
changeset
|
87 ## |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
88 ## The output arguments are: |
5837 | 89 ## |
90 ## @itemize | |
91 ## @item | |
92 ## @var{x} is the computed approximation to the solution of | |
24985
d85b2485af9e
doc: grammarcheck m-files ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24863
diff
changeset
|
93 ## @w{@code{@var{A} * @var{x} = @var{b}}}. If the algorithm did not converge, |
25151
40466945a451
pcg.m: Tweaks to documentation for clarity.
Rik <rik@octave.org>
parents:
25148
diff
changeset
|
94 ## then @var{x} is the iteration which has the minimum residual. |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
95 ## |
5837 | 96 ## @item |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
97 ## @var{flag} reports on the convergence: |
24985
d85b2485af9e
doc: grammarcheck m-files ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24863
diff
changeset
|
98 ## |
24849
96c74e33d17a
pcg.m: Overhaul function and BIST tests (bug #53258).
Rik <rik@octave.org>
parents:
24534
diff
changeset
|
99 ## @itemize |
25151
40466945a451
pcg.m: Tweaks to documentation for clarity.
Rik <rik@octave.org>
parents:
25148
diff
changeset
|
100 ## @item 0: The algorithm converged to within the prescribed tolerance. |
24985
d85b2485af9e
doc: grammarcheck m-files ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24863
diff
changeset
|
101 ## |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
102 ## @item 1: The algorithm did not converge and it reached the maximum |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
103 ## number of iterations. |
24985
d85b2485af9e
doc: grammarcheck m-files ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24863
diff
changeset
|
104 ## |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
105 ## @item 2: The preconditioner matrix is singular. |
24985
d85b2485af9e
doc: grammarcheck m-files ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24863
diff
changeset
|
106 ## |
d85b2485af9e
doc: grammarcheck m-files ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24863
diff
changeset
|
107 ## @item 3: The algorithm stagnated, i.e., the absolute value of the |
25151
40466945a451
pcg.m: Tweaks to documentation for clarity.
Rik <rik@octave.org>
parents:
25148
diff
changeset
|
108 ## difference between the current iteration @var{x} and the previous is less |
40466945a451
pcg.m: Tweaks to documentation for clarity.
Rik <rik@octave.org>
parents:
25148
diff
changeset
|
109 ## than @code{@var{eps} * norm (@var{x},2)}. |
24985
d85b2485af9e
doc: grammarcheck m-files ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24863
diff
changeset
|
110 ## |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
111 ## @item 4: The algorithm detects that the input (preconditioned) matrix is not |
25003
2365c2661b3c
doc: Spellcheck documentation ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24992
diff
changeset
|
112 ## @nospell{HPD}. |
24849
96c74e33d17a
pcg.m: Overhaul function and BIST tests (bug #53258).
Rik <rik@octave.org>
parents:
24534
diff
changeset
|
113 ## @end itemize |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
114 ## |
5837 | 115 ## @item |
116 ## @var{relres} is the ratio of the final residual to its initial value, | |
117 ## measured in the Euclidean norm. | |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
118 ## |
5837 | 119 ## @item |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
120 ## @var{iter} indicates the iteration of @var{x} which it was |
24985
d85b2485af9e
doc: grammarcheck m-files ahead of 4.4 release.
Rik <rik@octave.org>
parents:
24863
diff
changeset
|
121 ## computed. Since the output @var{x} corresponds to the minimal |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
122 ## residual solution, the total number of iterations that |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
123 ## the method performed is given by @code{length(resvec) - 1}. |
5837 | 124 ## |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
125 ## @item |
5837 | 126 ## @var{resvec} describes the convergence history of the method. |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
127 ## @code{@var{resvec} (@var{i}, 1)} is the Euclidean norm of the residual, and |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
128 ## @code{@var{resvec} (@var{i}, 2)} is the preconditioned residual |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
129 ## norm, after the |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
130 ## (@var{i}-1)-th iteration, @code{@var{i} = 1, 2, @dots{}, @var{iter}+1}. |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
131 ## The preconditioned residual norm is defined as |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
132 ## @code{@var{r}' * (@var{m} \ @var{r})} where |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
133 ## @code{@var{r} = @var{b} - @var{A} * @var{x}}, see also the |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
134 ## description of @var{m}. If @var{eigest} is not required, only |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
135 ## @code{@var{resvec} (:, 1)} is returned. |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
136 ## |
5837 | 137 ## @item |
17681
f6fded839513
pcg.m: Change success criterion to match reference text (bug #40057)
Rik <rik@octave.org>
parents:
17336
diff
changeset
|
138 ## @var{eigest} returns the estimate for the smallest @code{@var{eigest}(1)} |
f6fded839513
pcg.m: Change success criterion to match reference text (bug #40057)
Rik <rik@octave.org>
parents:
17336
diff
changeset
|
139 ## and largest @code{@var{eigest}(2)} eigenvalues of the preconditioned matrix |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
140 ## @w{@code{@var{P} = @var{m} \ @var{A}}}. In particular, if no |
17681
f6fded839513
pcg.m: Change success criterion to match reference text (bug #40057)
Rik <rik@octave.org>
parents:
17336
diff
changeset
|
141 ## preconditioning is used, the estimates for the extreme eigenvalues of |
f6fded839513
pcg.m: Change success criterion to match reference text (bug #40057)
Rik <rik@octave.org>
parents:
17336
diff
changeset
|
142 ## @var{A} are returned. @code{@var{eigest}(1)} is an overestimate and |
f6fded839513
pcg.m: Change success criterion to match reference text (bug #40057)
Rik <rik@octave.org>
parents:
17336
diff
changeset
|
143 ## @code{@var{eigest}(2)} is an underestimate, so that |
f6fded839513
pcg.m: Change success criterion to match reference text (bug #40057)
Rik <rik@octave.org>
parents:
17336
diff
changeset
|
144 ## @code{@var{eigest}(2) / @var{eigest}(1)} is a lower bound for |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
145 ## @code{cond (@var{P}, 2)}, which nevertheless in the limit should |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
146 ## theoretically be equal to the actual value of the condition number. |
5837 | 147 ## @end itemize |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
148 ## |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
149 ## |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
150 ## Let us consider a trivial problem with a tridiagonal matrix |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
151 ## |
5837 | 152 ## @example |
153 ## @group | |
14327
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
154 ## n = 10; |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
155 ## A = toeplitz (sparse ([1, 1], [1, 2], [2, 1], 1, n)); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
156 ## b = A * ones (n, 1); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
157 ## M1 = ichol (A); # in this tridiagonal case it corresponds to chol (A)' |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
158 ## M2 = M1'; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
159 ## M = M1 * M2; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
160 ## Afun = @@(x) A * x; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
161 ## Mfun = @@(x) M \ x; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
162 ## M1fun = @@(x) M1 \ x; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
163 ## M2fun = @@(x) M2 \ x; |
5837 | 164 ## @end group |
165 ## @end example | |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
166 ## |
5837 | 167 ## @sc{Example 1:} Simplest use of @code{pcg} |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
168 ## |
5837 | 169 ## @example |
17681
f6fded839513
pcg.m: Change success criterion to match reference text (bug #40057)
Rik <rik@octave.org>
parents:
17336
diff
changeset
|
170 ## x = pcg (A, b) |
5837 | 171 ## @end example |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
172 ## |
5837 | 173 ## @sc{Example 2:} @code{pcg} with a function which computes |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
174 ## @code{@var{A} * @var{x}} |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
175 ## |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
176 ## @example |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
177 ## x = pcg (Afun, b) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
178 ## @end example |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
179 ## |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
180 ## @sc{Example 3:} @code{pcg} with a preconditioner matrix @var{M} |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
181 ## |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
182 ## @example |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
183 ## x = pcg (A, b, 1e-06, 100, M) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
184 ## @end example |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
185 ## |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
186 ## @sc{Example 4:} @code{pcg} with a function as preconditioner |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
187 ## |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
188 ## @example |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
189 ## x = pcg (Afun, b, 1e-6, 100, Mfun) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
190 ## @end example |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
191 ## |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
192 ## @sc{Example 5:} @code{pcg} with preconditioner matrices @var{M1} |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
193 ## and @var{M2} |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
194 ## |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
195 ## @example |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
196 ## x = pcg (A, b, 1e-6, 100, M1, M2) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
197 ## @end example |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
198 ## |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
199 ## @sc{Example 6:} @code{pcg} with functions as preconditioners |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
200 ## |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
201 ## @example |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
202 ## x = pcg (Afun, b, 1e-6, 100, M1fun, M2fun) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
203 ## @end example |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
204 ## |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
205 ## @sc{Example 7:} @code{pcg} with as input a function requiring an argument |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
206 ## |
5837 | 207 ## @example |
208 ## @group | |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
209 ## function y = Ap (A, x, p) # compute A^p * x |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
210 ## y = x; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
211 ## for i = 1:p |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
212 ## y = A * y; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
213 ## endfor |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
214 ## endfunction |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
215 ## Apfun = @@(x, p) Ap (A, x, p); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
216 ## x = pcg (Apfun, b, [], [], [], [], [], 2); |
5837 | 217 ## @end group |
218 ## @end example | |
6747 | 219 ## |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
220 ## @sc{Example 8:} explicit example to show that @code{pcg} uses a |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
221 ## split preconditioner |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
222 ## |
5837 | 223 ## @example |
224 ## @group | |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
225 ## M1 = ichol (A + 0.1 * eye (n)); # factorization of A perturbed |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
226 ## M2 = M1'; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
227 ## M = M1 * M2; |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
228 ## |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
229 ## ## reference solution computed by pcg after two iterations |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
230 ## [x_ref, fl] = pcg (A, b, [], 2, M) |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
231 ## |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
232 ## ## split preconditioning |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
233 ## [y, fl] = pcg ((M1 \ A) / M2, M1 \ b, [], 2) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
234 ## x = M2 \ y # compare x and x_ref |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
235 ## |
5837 | 236 ## @end group |
237 ## @end example | |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
238 ## |
10791
3140cb7a05a1
Add spellchecker scripts for Octave and run spellcheck of documentation
Rik <octave@nomad.inbox5.com>
parents:
10549
diff
changeset
|
239 ## References: |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
240 ## |
10793
be55736a0783
Grammarcheck the documentation from m-files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
241 ## @enumerate |
be55736a0783
Grammarcheck the documentation from m-files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
242 ## @item |
be55736a0783
Grammarcheck the documentation from m-files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
243 ## C.T. Kelley, @cite{Iterative Methods for Linear and Nonlinear Equations}, |
be55736a0783
Grammarcheck the documentation from m-files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
244 ## SIAM, 1995. (the base PCG algorithm) |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
245 ## |
10793
be55736a0783
Grammarcheck the documentation from m-files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
246 ## @item |
19596
0e1f5a750d00
maint: Periodic merge of gui-release to default.
John W. Eaton <jwe@octave.org>
diff
changeset
|
247 ## @nospell{Y. Saad}, @cite{Iterative Methods for Sparse Linear Systems}, |
16826
a4969508008e
doc: Periodic spellcheck of the documentation.
Rik <rik@octave.org>
parents:
14872
diff
changeset
|
248 ## @nospell{PWS} 1996. (condition number estimate from PCG) |
a4969508008e
doc: Periodic spellcheck of the documentation.
Rik <rik@octave.org>
parents:
14872
diff
changeset
|
249 ## Revised version of this book is available online at |
25143
13fd0610480f
doc: Use https whenever possible in @url entries.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
250 ## @url{https://www-users.cs.umn.edu/~saad/books.html} |
10793
be55736a0783
Grammarcheck the documentation from m-files.
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
251 ## @end enumerate |
5837 | 252 ## |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
253 ## @seealso{sparse, pcr, gmres, bicg, bicgstab, cgs} |
5837 | 254 ## @end deftypefn |
255 | |
5838 | 256 ## Author: Piotr Krzyzanowski <piotr.krzyzanowski@mimuw.edu.pl> |
6747 | 257 ## Modified by: Vittoria Rezzonico <vittoria.rezzonico@epfl.ch> |
14327
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
258 ## - Add the ability to provide the pre-conditioner as two separate matrices |
5837 | 259 |
260 | |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
261 function [x_min, flag, relres, iter_min, resvec, eigest] =... |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
262 pcg (A, b, tol = [], maxit = [], M1 = [], M2 = [], x0 = [], varargin) |
5837 | 263 |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
264 ## Insert the default input (if necessary) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
265 [tol, maxit, x0] = __default__input__ ({1e-6, min(rows (b), 20),... |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
266 zeros(size (b))}, tol, maxit, x0); |
6747 | 267 |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
268 if (tol >= 1) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
269 warning ("Input tol is bigger than 1. \n Try to use a smaller tolerance."); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
270 elseif (tol <= eps / 2) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
271 warning ("Input tol may not be achievable by pcg. \n Try to use a bigger tolerance"); |
8507 | 272 endif |
5837 | 273 |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
274 ## Check if the input data A,b,m1,m2 are consistent (i.e. if they are |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
275 ## matrix or function handle) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
276 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
277 [Afun, M1fun, M2fun] = __alltohandles__ (A, b, M1, M2, "pcg"); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
278 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
279 maxit += 2; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
280 n_arg_out = nargout; |
5837 | 281 |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
282 ## Set Initial data |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
283 b_norm = norm (b); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
284 if (b_norm == 0) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
285 if (n_arg_out < 2) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
286 printf("The right hand side vector is all zero so pcg \n"); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
287 printf ("returned an all zero solution without iterating.\n"); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
288 endif |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
289 x_min = b; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
290 flag = 0; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
291 relres = 0; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
292 resvec = 0; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
293 iter_min = 0; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
294 eigest = [NaN, NaN]; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
295 return |
5837 | 296 endif |
297 | |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
298 x = x_pr = x_min = x0; |
5837 | 299 |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
300 ## x_pr (x previous) needs to check the stagnation |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
301 ## x_min needs to save the iterated with minimum residual |
5837 | 302 |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
303 r = b - feval (Afun, x, varargin{:}); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
304 iter = 2; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
305 iter_min = 0; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
306 flag = 1; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
307 resvec = zeros (maxit + 1, 2); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
308 resvec(1, 1) = norm (r); |
5838 | 309 p = zeros (size (b)); |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
310 alpha = old_tau = 1; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
311 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
312 if (n_arg_out > 5) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
313 T = zeros (maxit, maxit); |
8506 | 314 else |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
315 T = []; |
5837 | 316 endif |
317 | |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
318 while (resvec(iter-1,1) > tol * b_norm && iter < maxit) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
319 if (iter == 2) # Check whether M1 or M2 are singular |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
320 try |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
321 warning ("error","Octave:singular-matrix","local") |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
322 z = feval (M1fun, r, varargin{:}); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
323 z = feval (M2fun, z, varargin{:}); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
324 catch |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
325 flag = 2; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
326 break; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
327 end_try_catch |
6747 | 328 else |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
329 z = feval (M1fun, r, varargin{:}); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
330 z = feval (M2fun, z, varargin{:}); |
6747 | 331 endif |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
332 |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11563
diff
changeset
|
333 tau = z' * r; |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
334 resvec(iter - 1, 2) = sqrt (tau); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
335 beta = tau / old_tau; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
336 old_tau = tau; |
6747 | 337 p = z + beta * p; |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
338 w = feval (Afun, p, varargin{:}); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
339 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
340 ## Needed only for eigest. |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
341 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
342 old_alpha = alpha; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
343 den = p' * w; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
344 alpha = tau / den; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
345 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
346 ## Check if alpha is negative and/or if it has a consistent |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
347 ## imaginary part: if yes then A probably is not positive definite |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
348 if ((abs (imag (tau)) >= abs (real (tau)) * tol) || ... |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
349 real (tau) <= 0 || ... |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
350 (abs (imag (den)) >= abs (real (den)) * tol) || ... |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
351 (real (den) <= 0)) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
352 flag = 4; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
353 break; |
5837 | 354 endif |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
355 |
6747 | 356 x += alpha * p; |
357 r -= alpha * w; | |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
358 resvec(iter, 1) = norm (r); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
359 ## Chek if the iterated has minimum residual |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
360 if (resvec (iter,1) <= resvec (iter_min + 1,1)) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
361 x_min = x; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
362 iter_min = iter - 1; |
5837 | 363 endif |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
364 if (n_arg_out > 5 && iter > 2) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
365 T(iter-1:iter, iter-1:iter) = T(iter-1:iter, iter-1:iter) + ... |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
366 [1, sqrt(beta); sqrt(beta), beta] ./ ... |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
367 old_alpha; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
368 endif |
20735
418ae0cb752f
Replace ++,-- with in-place operators for performance.
Rik <rik@octave.org>
parents:
20727
diff
changeset
|
369 iter += 1; |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
370 if (norm (x - x_pr) <= eps * norm (x)) # Check the stagnation |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
371 flag = 3; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
372 break; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
373 endif |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
374 x_pr = x; |
5837 | 375 endwhile |
376 | |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
377 if (n_arg_out > 5) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
378 ## Apply the preconditioner once more and finish with the precond |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
379 ## residual. |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
380 z = feval (M1fun, r, varargin{:}); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
381 z = feval (M2fun, z, varargin{:}); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
382 endif |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
383 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
384 ## (Eventually) computes the eigenvalue of inv(m2)*inv(m1)*A |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
385 if (n_arg_out > 5) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
386 if (flag != 4) |
5837 | 387 if (iter > 3) |
10549 | 388 T = T(2:iter-2,2:iter-2); |
389 l = eig (T); | |
390 eigest = [min(l), max(l)]; | |
5837 | 391 else |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
392 eigest = [NaN, NaN]; |
24849
96c74e33d17a
pcg.m: Overhaul function and BIST tests (bug #53258).
Rik <rik@octave.org>
parents:
24534
diff
changeset
|
393 warning ("pcg: eigenvalue estimate failed: iteration converged too fast"); |
5837 | 394 endif |
395 else | |
5838 | 396 eigest = [NaN, NaN]; |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
397 warning ('pcg: eigenvalue estimate failed: matrix not positive definite?') |
5837 | 398 endif |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
399 resvec(iter - 1, 2) = sqrt (r' * z); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
400 resvec = resvec (1:(iter-1), :); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
401 else |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
402 eigest = [NaN, NaN]; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
403 resvec = resvec(1:(iter-1),1); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
404 endif |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
405 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
406 ## Set the last variables |
6747 | 407 |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
408 if (flag == 2) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
409 relres = 1; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
410 elseif (resvec (1, 1) == 0) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
411 relres = 0; |
5837 | 412 else |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
413 relres = resvec(iter_min+1, 1) ./ resvec(1, 1); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
414 endif |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
415 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
416 iter -= 2; # compatibility |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
417 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
418 ## Set the flag in the proper way if flag not 3, 4 or 2 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
419 if (flag == 2) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
420 flag = 2; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
421 elseif (flag == 1) && (relres <= tol) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
422 flag = 0; |
5837 | 423 endif |
424 | |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
425 if (n_arg_out < 2) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
426 switch (flag) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
427 case {0} |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
428 printf ("pcg converged at iteration %d ", iter_min); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
429 printf ("with relative residual %d\n", relres); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
430 case {1} |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
431 printf ("pcg stopped at iteration %d ", iter+1); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
432 printf ("without converging to the desired tolerance %d ", tol); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
433 printf ("because the maximum number of iteration was reached, \n"); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
434 printf ("The iterated returned (number %d) ",iter_min); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
435 printf ("has relative residual %d \n", relres); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
436 case {2} |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
437 printf ("pcg stopped at iteration %d ", iter+1) |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
438 printf ("without converging to the desired tolerance %d ", tol); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
439 printf ("because the preconditioned matrix is singular.\n"); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
440 printf ("The iterated returned (number %d) ", iter_min); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
441 printf ("has relative residual %d \n", relres); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
442 case {3} |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
443 printf ("pcg stopped at iteration %d ", iter+1); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
444 printf ("without converging to the desired tolerance %d ", tol); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
445 printf ("because of stagnation. \n"); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
446 printf ("The iterated returned (number %d) ", iter_min); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
447 printf ("has relative residual %d.\n", relres); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
448 case {4} |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
449 printf ("pcg stopped at iteration %d ", iter + 1); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
450 printf ("without converging to the desired tolerance %d ",tol); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
451 printf ("because the (preconditioned) matrix is not positive definite. \n"); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
452 printf ("The iterate returned (number %d) ", iter_min); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
453 printf ("has relative residual %d \n", relres); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
454 endswitch |
5837 | 455 endif |
456 endfunction | |
457 | |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
458 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
459 %!demo # simplest use |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
460 %! n = 10; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
461 %! A = toeplitz (sparse ([1, 1], [1, 2], [2, 1], 1, n)); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
462 %! b = A * ones (n, 1); |
25148 | 463 %! M1 = ichol (A); # for this tridiagonal case it corresponds to chol (A)' |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
464 %! M2 = M1'; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
465 %! M = M1 * M2; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
466 %! x = pcg (A, b); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
467 %! Afun = @(x) A * x; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
468 %! x = pcg (Afun, b); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
469 %! x = pcg (A, b, 1e-6, 100, M); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
470 %! x = pcg (A, b, 1e-6, 100, M1, M2); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
471 %! Mfun = @(x) M \ x; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
472 %! x = pcg (Afun, b, 1e-6, 100, Mfun); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
473 %! M1fun = @(x) M1 \ x; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
474 %! M2fun = @(x) M2 \ x; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
475 %! x = pcg (Afun, b, 1e-6, 100, M1fun, M2fun); |
25148 | 476 %! function y = Ap (A, x, p) # compute A^p * x |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
477 %! y = x; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
478 %! for i = 1:p |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
479 %! y = A * y; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
480 %! endfor |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
481 %! endfunction |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
482 %! Afun = @(x, p) Ap (A, x, p); |
25148 | 483 %! ## solution of A^2 * x = b |
484 %! x = pcg (Afun, b, [], [], [], [], [], 2); | |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
485 |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
486 %!demo |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
487 %! n = 10; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
488 %! A = toeplitz (sparse ([1, 1], [1, 2], [2, 1], 1, n)); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
489 %! b = A * ones (n, 1); |
25148 | 490 %! M1 = ichol (A + 0.1 * eye (n)); # Perturb the factorization of A |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
491 %! M2 = M1'; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
492 %! M = M1 * M2; |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
493 %! |
25148 | 494 %! ## Reference solution computed by pcg after two iterations |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
495 %! [x_ref, fl] = pcg (A, b, [], 2, M); |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
496 %! x_ref |
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
497 %! |
25148 | 498 %! ## Split preconditioning |
24860
6266e321ef22
Merge code from SoCiS 2016 "Improve iterative methods" project (http://socis16octave-improveiterativemethods.blogspot.com)
Cristiano Dorigo <cristiano.dorigo@hotmail.it>
parents:
24849
diff
changeset
|
499 %! [y, fl] = pcg ((M1 \ A) / M2, M1 \ b, [], 2); |
25148 | 500 %! x = M2 \ y # compare x and x_ref |
501 %!test | |
502 %! ## Check that all type of inputs work | |
503 %! A = toeplitz (sparse ([2, 1 ,0, 0, 0])); | |
504 %! b = A * ones (5, 1); | |
505 %! M1 = diag (sqrt (diag (A))); | |
506 %! M2 = M1; # M1 * M2 is the Jacobi preconditioner | |
507 %! Afun = @(z) A*z; | |
508 %! M1_fun = @(z) M1 \ z; | |
509 %! M2_fun = @(z) M2 \ z; | |
510 %! [x, flag, ~, iter] = pcg (A,b); | |
511 %! assert (flag, 0); | |
512 %! [x, flag, ~ , iter] = pcg (A, b, [], [], M1 * M2); | |
513 %! assert (flag, 0); | |
514 %! [x, flag, ~ , iter] = pcg (A, b, [], [], M1, M2); | |
515 %! assert (flag, 0); | |
516 %! [x, flag] = pcg (A, b, [], [], M1_fun, M2_fun); | |
517 %! assert (flag, 0); | |
518 %! [x, flag] = pcg (A, b,[],[], M1_fun, M2); | |
519 %! assert (flag, 0); | |
520 %! [x, flag] = pcg (A, b,[],[], M1, M2_fun); | |
521 %! assert (flag, 0); | |
522 %! [x, flag] = pcg (Afun, b); | |
523 %! assert (flag, 0); | |
524 %! [x, flag] = pcg (Afun, b,[],[], M1 * M2); | |
525 %! assert (flag, 0); | |
526 %! [x, flag] = pcg (Afun, b,[],[], M1, M2); | |
527 %! assert (flag, 0); | |
528 %! [x, flag] = pcg (Afun, b,[],[], M1_fun, M2); | |
529 %! assert (flag, 0); | |
530 %! [x, flag] = pcg (Afun, b,[],[], M1, M2_fun); | |
531 %! assert (flag, 0); | |
532 %! [x, flag] = pcg (Afun, b,[],[], M1_fun, M2_fun); | |
533 %! assert (flag, 0); | |
534 | |
535 %!test | |
536 %! ## solve a small diagonal system | |
537 %! N = 10; | |
538 %! A = diag ([1:N]); b = rand (N, 1); | |
539 %! [x, flag] = pcg (A, b, [], N+1); | |
540 %! assert (flag, 0); | |
541 %! assert (norm (b - A*x) / norm (b), 0, 1e-6); | |
542 | |
543 %!test | |
544 %! ## A is not positive definite | |
545 %! ## The indefiniteness of A is detected. | |
546 %! N = 10; | |
547 %! A = -diag ([1:N]); b = sum (A, 2); | |
548 %! [x, flag] = pcg (A, b, [], N + 1); | |
549 %! assert (flag, 4); | |
550 | |
551 %!test | |
552 %! ## solve tridiagonal system, do not converge in default 20 iterations | |
553 %! N = 100; | |
25755
ddf8a03beffb
Calculate Laplacian matrix in BIST tests without for loop.
Rik <rik@octave.org>
parents:
25436
diff
changeset
|
554 %! ## Form 1-D Laplacian matrix |
ddf8a03beffb
Calculate Laplacian matrix in BIST tests without for loop.
Rik <rik@octave.org>
parents:
25436
diff
changeset
|
555 %! A = 2 * eye (N,N); |
ddf8a03beffb
Calculate Laplacian matrix in BIST tests without for loop.
Rik <rik@octave.org>
parents:
25436
diff
changeset
|
556 %! A(2:(N+1):end) = -1; |
ddf8a03beffb
Calculate Laplacian matrix in BIST tests without for loop.
Rik <rik@octave.org>
parents:
25436
diff
changeset
|
557 %! A((N+1):(N+1):end) = -1; |
25148 | 558 %! b = ones (N, 1); |
559 %! [x, flag, relres, iter, resvec, eigest] = pcg (A, b, 1e-12); | |
560 %! assert (flag); | |
561 %! assert (relres >= 1.0); | |
562 | |
563 %!warning <iteration converged too fast> | |
564 %! ## solve tridiagonal system with "perfect" preconditioner which converges | |
565 %! ## in one iteration, so the eigest does not work and issues a warning. | |
566 %! N = 100; | |
25755
ddf8a03beffb
Calculate Laplacian matrix in BIST tests without for loop.
Rik <rik@octave.org>
parents:
25436
diff
changeset
|
567 %! ## Form 1-D Laplacian matrix |
ddf8a03beffb
Calculate Laplacian matrix in BIST tests without for loop.
Rik <rik@octave.org>
parents:
25436
diff
changeset
|
568 %! A = 2 * eye (N,N); |
ddf8a03beffb
Calculate Laplacian matrix in BIST tests without for loop.
Rik <rik@octave.org>
parents:
25436
diff
changeset
|
569 %! A(2:(N+1):end) = -1; |
ddf8a03beffb
Calculate Laplacian matrix in BIST tests without for loop.
Rik <rik@octave.org>
parents:
25436
diff
changeset
|
570 %! A((N+1):(N+1):end) = -1; |
25148 | 571 %! b = ones (N, 1); |
572 %! [x, flag, relres, iter, resvec, eigest] = pcg (A, b, [], [], A, [], b); | |
573 %! assert (flag, 0); | |
574 %! assert (norm (b - A*x) / norm (b), 0, 1e-6); | |
25436
996d78102a71
maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents:
25151
diff
changeset
|
575 %! |
25148 | 576 %! assert (isnan (eigest), isnan ([NaN, NaN])); |
577 | |
578 %!test | |
579 %! ## pcg detect a non-Hermitian matrix, with a considerable imaginary part. | |
580 %! ## In this example, Matlab does not recognize the wrong type of matrix and | |
581 %! ## makes iterations until it reaches maxit. | |
582 %! N = 10; | |
583 %! A = diag (1:N) + 1e-4*i; | |
584 %! b = ones (N, 1); | |
585 %! [x, flag] = pcg (A, b, []); | |
586 %! assert (flag, 4); | |
587 | |
588 %!test | |
589 %! ## The imaginary part is not influent (it is too small), so pcg doesn't stop | |
590 %! N = 10; | |
591 %! A = diag (1:N) + 1e-10*i; | |
592 %! b = ones (N, 1); | |
593 %! [x, flag] = pcg (A, b, [], N+1); | |
594 %! assert (flag, 0); | |
595 %! assert (norm (b - A*x) / norm (b), 0, 1e-6); | |
596 | |
597 %!test | |
598 %! ## pcg solves linear system with A Hermitian positive definite | |
599 %! N = 20; | |
600 %! A = sparse (toeplitz ([4, 1, zeros(1, 18)])) + ... | |
601 %! i * sparse (toeplitz ([0, 1, zeros(1, 18)], [0, -1, zeros(1,18)])); | |
602 %! b = A * ones (N, 1); | |
603 %! Hermitian_A = ishermitian (A); | |
604 %! [x, flag] = pcg (A, b, [], 2*N); | |
605 %! assert (Hermitian_A, true); | |
606 %! assert (flag, 0); | |
607 %! assert (x, ones (N, 1), -1e-4); | |
608 | |
609 %!testif HAVE_CHOLMOD | |
610 %! ## pcg solves preconditioned linear system with A HPD | |
611 %! N = 20; | |
612 %! A = sparse (toeplitz ([4, 1, zeros(1, 18)])) + ... | |
613 %! i * sparse (toeplitz ([0, 1, zeros(1, 18)], [0, -1, zeros(1,18)])); | |
614 %! b = A * ones (N, 1); | |
615 %! M2 = chol (A + 0.1 * eye (N)); # Factor of a perturbed matrix | |
616 %! M = M2' * M2; | |
617 %! Hermitian_A = ishermitian (A); | |
618 %! Hermitian_M = ishermitian (M); | |
619 %! [x, flag] = pcg (A, b, [], 2*N, M); | |
620 %! assert (Hermitian_A, true); | |
621 %! assert (Hermitian_M, true); | |
622 %! assert (flag, 0); | |
623 %! assert (x, ones (N, 1), -1e-4); | |
624 | |
625 %!test | |
626 %! ## pcg recognizes that the preconditioner matrix is singular | |
627 %! N = 3; | |
628 %! A = toeplitz ([2, 1, 0]); | |
629 %! M = [1 0 0; 0 1 0; 0 0 0]; # the last row is zero | |
630 %! [x, flag] = pcg (A, ones (3, 1), [], [], M); | |
631 %! assert (flag, 2); | |
632 | |
633 %!test | |
634 %! A = rand (4); | |
635 %! A = A' * A; | |
636 %! [x, flag] = pcg (A, zeros (4, 1), [], [], [], [], ones (4, 1)); | |
637 %! assert (x, zeros (4, 1)); | |
638 | |
639 ## Test return types | |
640 %!test | |
641 %! A = single (1); | |
642 %! b = 1; | |
643 %! [x, flag] = pcg (A, b); | |
644 %! assert (class (x), "single"); | |
645 | |
646 %!test | |
647 %! A = 1; | |
648 %! b = single (1); | |
649 %! [x, flag] = pcg (A, b); | |
650 %! assert (class (x), "single"); | |
651 | |
652 %!test | |
653 %! A = single (1); | |
654 %! b = single (1); | |
655 %! [x, flag] = pcg (A, b); | |
656 %! assert (class (x), "single"); | |
657 | |
658 %!test | |
659 %!function y = Afun (x) | |
660 %! A = toeplitz ([2, 1, 0, 0]); | |
661 %! y = A * x; | |
662 %!endfunction | |
663 %! [x, flag] = pcg ("Afun", [3; 4; 4; 3]); | |
664 %! assert (x, ones (4, 1), 1e-6); | |
665 | |
666 %!test | |
667 %! ## unpreconditioned residual | |
668 %! A = toeplitz (sparse ([4, 1, 0, 0, 0])); | |
669 %! b = sum (A, 2); | |
670 %! M = toeplitz (sparse ([2, 1, 0, 0, 0])); | |
671 %! [x, flag, relres] = pcg (A, b, [], 2, M); | |
672 %! assert (norm (b - A * x) / norm (b), relres, 8 * eps); | |
673 |