symmlq
に,係数行列一个
の代わりに* x
を計算する関数ハンドルを与えて線形システムを解きます。
画廊
で生成されたウィルキンソンのテスト行列の1つは21行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と等しくない非ゼロ要素があります。
式
は次のようになります。
結果のベクトルは3つのベクトルの合計として記述できます。
=
MATLAB®で,これらのベクトルを作成および合算することにより* x
の値を与える関数を記述します。
函数Y = [0;x (1:20)] +...[(10: 1:0) ';(1:10) ']。* x +...[x (21);0);结束
(この関数は,ローカル関数として例の最後に保存されています)
ここで,symmlq
に* x
を計算する関数ハンドルを与えて,線形システム
を解きます。1 e-12
の許容誤差と50回の反復を使用します。
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のベクトルを生成していることを確認します。
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⋮