主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

symmlq

線形方程式系の求解——対称LQ法

説明

x= symmlq (一个bは,対称LQ法を使用して,線形方程式系A * x =xについて解きます。試行が正常に完了した場合,symmlqは収束を確認するメッセージを表示します。symmlqが最大反復回数に達しても収束しないか,何らかの理由で実行を停止した場合は,相対残差规范(b * x) /规范(b)と停止時の反復回数を含む診断メッセージが表示されます。

x= symmlq (一个b托尔は,このメソッドの許容誤差を指定します。既定の許容誤差は1 e-6です。

x= symmlq (一个b托尔麦克斯特は,使用する最大反復回数を指定します。symmlqは,麦克斯特以内の反復で収束しない場合,診断メッセージを表示します。

x= symmlq (一个b托尔麦克斯特は前処理行列を指定しyについて系 H 1 一个 H T y H 1 b を実質的に解くことによりxを計算します。ここで, y H T x および H 1 / 2 1 2 1 / 2 です。アルゴリズムはHを明示的に形成しません。前処理行列を使用すると、問題の数値的なプロパティと計算の効率を向上させることができます。

x= symmlq (一个b托尔麦克斯特M1平方米M = M1 *平方米となるような前処理行列の因子を指定します。

x= symmlq (一个b托尔麦克斯特M1平方米x0は解のベクトルxの初期推定を指定します。既定値はゼロのベクトルです。

x国旗) = symmlq (___は,アルゴリズムが正常に収束したかどうかを示すフラグを返します。国旗= 0の場合,収束は正常に実行されています。この出力構文は,前記のすべての入力引数の組み合わせで使用できます。国旗出力を指定する場合,symmlqは診断メッセージを表示しません。

x国旗relres) = symmlq (___は,計算された解の残差誤差も返します。国旗0の場合は,relres < =托尔になります。

x国旗relresiter) = symmlq (___は,xが計算されたときの反復回数iterも返します。

x国旗relresiterresvec) = symmlq (___は,各反復で,最初の残差规范(b * x0)を含む残差ノルムのベクトルも返します。

x国旗relresiterresvecresveccg) = symmlq (___は,各反復で共役勾配法の残差ノルムのベクトルも返します。

すべて折りたたむ

既定の設定でsymmlqを使用して正方線形システムを解いてから,解法プロセスで使用される許容誤差と反復回数を調整します。

スパース三重対角行列一个を,係数行列として作成します。 斧头 b の右辺に 一个 の密な行の合計をベクトルとして使用し,解 x が1のベクトルとなると想定されるようにします。

n = 400;= 1 (n, 1);A = spdiags([-2*on 4*on -2*on],-1:1,n,n);b =全(sum (A, 2));

symmlqを使用して 斧头 b を解きます。出力の表示には相対残差誤差 b - 斧头 b の値が含まれます。

x = symmlq (A, b);
Symmlq在迭代20时停止,没有收敛到期望的容忍值1e-06,因为已经达到了最大的迭代次数。返回的iterate(编号20)的相对残差为0.045。

既定ではsymmlqは20回の反復と1 e-6の許容誤差を使用し,アルゴリズムはこの行列について,その20回の反復内で収束できません。残差が1)依照程度であり,これはより多くの反復が必要であることをよく示しています。より大きな許容誤差を使用して,アルゴリズムの収束をより簡単にすることもできます。

1的军医の許容誤差と250回の反復を使用して,再度方程式系を解きます。

x = symmlq (A, b, 1 e - 4250);
Symmlq在第199次迭代时收敛到一个相对残差为1.5e-14的解。

線形システムを解くために前処理行列をsymmlqと使用する効果を調べます。

対称正定値の,バンド係数行列を作成します。

一个= delsq (numgrid (“年代”, 102));

斧头 b に対する真の解がすべて1のベクトルになるように,bを定義します。

b =和(2);

許容誤差と最大反復回数を設定します。

托尔= 1 e-12;麦克斯特= 100;

symmlqを使用して,要求された許容誤差と反復回数で解を求めます。この求解プロセスについての情報を返す6つの出力を指定します。

  • xA * x =の計算された解です。

  • fl0はアルゴリズムが収束したかどうかを示すフラグです。

  • rr0は計算解xの相対残差です。

  • it0xが計算されたときの反復回数です。

  • rv0 b - 斧头 の残差履歴のベクトルです。

  • rvcg0 一个 T 一个 x - 一个 T b の共役勾配残差履歴のベクトルです。

[x, fl0 rr0, it0 rv0, rvcg0] = symmlq (A, b,托尔,麦克斯特);fl0
fl0 = 1
rr0
rr0 = 0.0031
it0
it0 = 100

fl0は,symmlqが要求した反復回数100回以内に要求した許容誤差1 e-12に収束しなかったため,1となります。

収束を助けるため,前処理行列を指定できます。一个は対称であるため,icholを使用して前処理行列 l l T を生成します。“信息与通信技术”オプションを指定してしきい値棄却による不完全コレスキー分解を使用し,1 e-6の対角シフト値を指定して非正のピボットを回避します。symmlqへの入力としてlおよびL 'を指定して,前処理された方程式系を解きます。

设置=结构(“类型”“信息与通信技术”“diagcomp”1 e-6“droptol”1 e-14);L = ichol(设置);(x1, fl1 rr1、it1 rv1, rvcg1] = symmlq (A, b,托尔,麦克斯特,L, L ');fl1
fl1 = 0
rr1
rr1 = 2.5636 e15汽油
it1
it1 = 3

ichol前処理行列を使用すると,問題の数値特性が大きく改善され,symmlqはより迅速に収束することができます。出力rv1 (1)规范(b)、出力rv1(结束)规范(b * x1)になります。

各反復での相対残差をプロットして,symmlqの進行状況を確認できます。各解の共役勾配の残差履歴を,指定された許容誤差の線とともにプロットします。

semilogy(0:长度(rvcg0) 1, rvcg0 /规范(b),“o”)举行semilogy(0:长度(rvcg1) 1, rvcg1 /规范(b),“o”) yline(托尔,“r——”);传奇(“没有预调节器”“ICHOL预处理”“宽容”“位置”“东南”)包含(的迭代次数) ylabel (的相对剩余的

图中包含一个坐标轴。轴包含三个对象的类型线,恒线。这些对象代表No preconditioning, ICHOL preconditioning, Tolerance。

symmlqに解の初期推定を指定する効果を調べます。

三重対角スパース行列を作成します。 x の想定される解が1のベクトルとなるよう, 斧头 b の右辺のベクトルとして各行の合計を使用します。

n = 900;e =的(n - 1);A = spdiags([e 2*e e],-1:1,n,n);b =和(2);

symmlqを使用して 斧头 b を2回解きます。1回は既定の初期推定、もう 1 回は解の適切な初期推定を使用します。両方の解に対して 200 回の反復と既定の許容誤差を使用します。すべての要素が0.99と等価のベクトルとして初期推定を2番目の解に指定します。

麦克斯特= 200;x1 = symmlq (A, b,[],麦克斯特);
Symmlq在第34次迭代时收敛到一个相对残差为9.5e-07的解。
x0 = 0.99 * e;x2 = symmlq(麦克斯特,A, b, [] [], [], x0);
Symmlq在第6次迭代时收敛到一个相对残差为8.7e-07的解。

この場合,初期推定を指定するとsymmlqをより迅速に収束させることができます。

中間結果を返す

对于ループでsymmlqを呼び出して,初期推定を使用して中間結果を取得することもできます。ソルバーを呼び出すたびに,数回の反復が行われ,計算された解が格納されます。その後,その解を次の反復のバッチに対する初期ベクトルとして使用します。

たとえば,次のコードは100回の反復を4回実行し,为ループを通過するたびに,解のベクトルを格納します。

x0 = 0(大小(2),1);托尔= 1 e-8;麦克斯特= 100;k = 1:4 [x,国旗,relres] = symmlq (A, b,托尔,麦克斯特[],[],x0);X = X (:, k);R (k) = relres;x0 = x;结束

X (:, k)は,ループの反復kで計算された解のベクトルであり,R (k)はその解の相対残差です。

symmlqに,係数行列一个の代わりに* xを計算する関数ハンドルを与えて線形システムを解きます。

画廊で生成されたウィルキンソンのテスト行列の1つは21行21列の三重対角行列です。行列をプレビューします。

一个=画廊(“wilk”, 21)
一个=21日×2110 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0121000000 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 ⋮

ウィルキンソン行列の構造は特殊なため,演算* xを関数ハンドルで表すことができます。一个がベクトルを乗算する場合,結果のベクトルのほとんどの要素はゼロとなります。結果の非ゼロ要素は,一个の非ゼロの三重対角要素に対応します。さらに,主対角のみに1と等しくない非ゼロ要素があります。

斧头 は次のようになります。

斧头 10 1 0 0 0 1 9 1 0 0 0 1 8 1 0 0 1 7 1 0 0 1 6 1 0 0 1 5 1 0 0 1 4 1 0 0 1 3. 0 0 0 1 0 0 0 1 10 x 1 x 2 x 3. x 4 x 5 x 21 10 x 1 + x 2 x 1 + 9 x 2 + x 3. x 2 + 8 x 3. + x 4 x 19 + 9 x 20. + x 21 x 20. + 10 x 21

結果のベクトルは3つのベクトルの合計として記述できます。

斧头 0 + 10 x 1 + x 2 x 1 + 9 x 2 + x 3. x 2 + 8 x 3. + x 4 x 19 + 9 x 20. + x 21 x 20. + 10 x 21 + 0 0 x 1 x 20. + 10 x 1 9 x 2 10 x 21 + x 2 x 21 0

MATLAB®で,これらのベクトルを作成および合算することにより* xの値を与える関数を記述します。

函数Y = [0;x (1:20)] +...[(10: 1:0) ';(1:10) ']。* x +...[x (21);0);结束

(この関数は,ローカル関数として例の最後に保存されています)

ここで,symmlq* xを計算する関数ハンドルを与えて,線形システム 斧头 b を解きます。1 e-12の許容誤差と50回の反復を使用します。

1 b = 1(21日);托尔= 1 e-12;麦克斯特= 50;x1 = symmlq (@afun, b,托尔,麦克斯特)
Symmlq在迭代10时收敛到一个相对残差为4.5e-16的解。
x1 =21日×10.0910 0.0899 0.0999 0.1109 0.1241 0.1443 0.1544 0.2383 0.1309 0.5000⋮

afun (x1)が1のベクトルを生成していることを確認します。

afun (x1)
ans =21日×11.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000⋮

ローカル関数

函数Y = [0;x (1:20)] +...[(10: 1:0) ';(1:10) ']。* x +...[x (21);0);结束

入力引数

すべて折りたたむ

係数行列。対称行列または関数ハンドルとして指定します。この行列は線形システムA * x =の係数行列です。一般に,一个は大規模なスパース行列,または大規模なスパース行列と列ベクトルの積を返す関数ハンドルです。issymmetricを使用して一个が対称であることを確認できます。

関数ハンドルとしての一个の指定

オプションで,係数行列を,行列ではなく関数ハンドルとして指定できます。この関数ハンドルは,係数行列全体を作成するのではなく,行列とベクトルの積を返し,計算をより効率的にします。

関数ハンドルを使用するには,関数シグネチャ函数y = fun(x)を使用します。関数のパラメーター化では,必要な場合に関数afunに追加のパラメーターを指定する方法を説明しています。関数呼び出しafun (x)* xの値を返さなければなりません。

データ型:|function_handle
複素数のサポート:あり

線形方程式の右辺。列ベクトルとして指定します。bの長さは大小(1)と等しくなければなりません。

データ型:
複素数のサポート:あり

メソッドの許容誤差。正のスカラーとして指定します。この入力を使用して計算の精度と実行時間とをトレードオフします。成功するには、symmlqは,許容される反復回数内に許容誤差を満たさなければなりません。托尔を小さい値にすると,解がより正確でなければ計算が成功しないことを意味します。

データ型:

最大反復回数。正のスカラー整数として指定します。麦克斯特の値を増やして,symmlqが許容誤差托尔を満たすためにより多くの反復を行えるようにします。一般に,托尔の値が小さいほど,計算を正常に完了するための反復がより多く必要であるということを意味します。

前処理行列。行列または関数ハンドルの個別の引数として指定します。前処理行列またはその行列の因子M = M1 *平方米を指定して線形システムの数値的側面を改善し,symmlqでの迅速な収束を容易にします。不完全行列因数分解関数iluおよびicholを使用して前処理行列を生成できます。また,因数分解の前に平衡を使用して,係数行列の条件数を改善できます。前処理行列の詳細については,線形方程式の反復法を参照してください。

symmlqは指定なし前処理行列を単位行列として扱います。

関数ハンドルとしてのの指定

オプションで,M1または平方米のいずれかを,行列ではなく関数ハンドルとして指定できます。関数ハンドルは,前処理行列全体を作成するのではなく行列ベクトル演算を行い、計算をより効率化します。

関数ハンドルを使用するには,関数シグネチャ函数y = mfun(x)を使用します。関数のパラメーター化では,必要な場合に関数mfunに追加のパラメーターを指定する方法を説明しています。関数呼び出しmfun (x)M \ xまたはM1、M2 \ (x)の値を返さなければなりません。

データ型:|function_handle
複素数のサポート:あり

初期推定。大小(2)に等しい長さの列ベクトルとして指定します。symmlqに,既定値のゼロのベクトルではなく,より妥当な初期推定x0を与えることができれば,計算時間が節約でき,アルゴリズムがより速く収束するようにできます。

データ型:
複素数のサポート:あり

出力引数

すべて折りたたむ

線形システムの解。列ベクトルとして返されます。この出力は線形システムA * x =の近似解を与えます。計算が正常に完了した場合(国旗= 0)、relres托尔以下になります。

計算が正常に完了しない場合(国旗~ = 0)は常に,symmlqによって返される解xは,すべての反復にわたり計算された最小残差ノルムをもちます。

収束フラグ。次の表のいずれかのスカラー値として返されます。収束フラグは、計算が正常に実行されたかどうかを示し、さまざまな失敗の形式を区別します。

フラグの値

収束

0

成功。symmlqは希望する許容誤差托尔に反復回数麦克斯特以内で収束しました。

1

失敗-symmlq麦克斯特回の反復を行いましたが収束しませんでした。

2

失敗——前処理行列またはM = M1 *平方米が悪条件になっています。

3.

失敗——連続する2回の反復が同じであり,symmlqは計算を進めていません。

4

失敗-symmlqアルゴリズムで計算されたスカラー量の1つが,計算を続けるには大きすぎるかまたは小さすぎます。

5

失敗——前処理行列は対称正定値ではありません。

相対残差誤差。スカラーとして返されます。相対残差誤差は、返された答えxがどれだけ正確かを示すものです。symmlqは,求解のプロセスの各反復で相対残差および共役勾配残差を追跡し,“いずれかの“残差が指定された許容誤差托尔を満たしたときにアルゴリズムは収束します。relresの出力には,相対残差または共役勾配残差のいずれかの,収束した残差の値が含まれます。

  • 相対残差誤差は规范(b * x) /规范(b)に等しく,一般には,symmlqが収束するときの許容誤差托尔を満たす残差です。resvecの出力は,すべての反復にわたってこの残差の履歴を追跡します。

  • 共役勾配残差誤差は规范(“* * x -”* b)に等しくなります。この残差はsymmlqが収束する回数が相対残差よりも少なくなる原因となります。resveccgの出力は,すべての反復にわたってこの残差の履歴を追跡します。

データ型:

反復回数。スカラーとして返されます。この出力は、xに対する計算解が計算された時点での反復回数を示します。

データ型:

残差誤差。ベクトルとして返されます。残差誤差规范(b * x)によって,アルゴリズムがxの特定の値に対する収束にどの程度近いかがわかります。resvecの要素数は反復の回数と同じです。resvecの内容を調べて,托尔または麦克斯特の値を変更するかどうかを決定することができます。

データ型:

共役勾配残差ノルム。ベクトルとして返されます。resveccgの要素数は反復の回数と同じです。

データ型:

詳細

すべて折りたたむ

対称LQ法

MINRES法とSYMMLQ法は,共役勾配法PCGの基盤となっている兰索斯法の変形です。PCGと同様に,係数行列は対称である必要はありますが,MINRESとSYMMLQは不定でも構いません(すべての固有値が正でなくてもよい)。これは,兰索斯法で通常みられる暗黙的な陆分解を回避することで実現されます。これはゼロのピボットが起きたときに,ブレークダウンが発生しやすくなります。

MINRESは2ノルムの残差を最小化しますが,SYMMLQはLQ分解を使用して射影システムを解き,残差を以前のすべての残差と直交したままにします[1]

ヒント

  • 最大反復のメソッドの収束は,係数行列の条件数气孔导度(A)に依存します。平衡を使用して一个の条件数を改善することができ,それ自体で最大反復のソルバーが収束しやすくなります。ただし,平衡を使用することでも,平衡化した行列B = R * P * * Cを次に因子分解する際に前処理行列の品質が向上します。

  • 解剖symrcmなどの行列の並べ替え関数を使用して係数行列の行と列を並べ替え,係数行列が因子分解されて前処理行列が生成される際に非ゼロの数を最小化できます。これによって,後で前処理を使用した線形システムを解くのに必要なメモリと時間を削減できます。

参照

[1] Barrett, R., M. Berry, t.f. Chan等,线性系统解的模板:迭代方法的构建块,SIAM,费城,1994。

[2] Paige, C. C.和M. A. Saunders,“线性方程组的稀疏不定系统的解”。暹罗j .号码。肛交。,Vol.12, 1975, pp. 617-629.

拡張機能

R2006aより前に導入