[解決済み] MATLABによるパワーメソッド
2022-02-09 07:57:09
質問
を実装したいのですが パワーメソッド MATLABで行列の支配的な固有値と固有ベクトルを決定する。
ここまで書いたものがこちらです。
%function to implement power method to compute dominant
%eigenvalue/eigenevctor
function [m,y_final]=power_method(A,x);
m=0;
n=length(x);
y_final=zeros(n,1);
y_final=x;
tol=1e-3;
while(1)
mold=m;
y_final=A*y_final;
m=max(y_final);
y_final=y_final/m;
if (m-mold)<tol
break;
end
end
end
上記のコードで、数値の例を示します。
A=[1 1 -2;-1 2 1; 0 1 -1]
A =
1 1 -2
-1 2 1
0 1 -1
>> x=[1 1 1];
>> x=x';
>> [m,y_final]=power_method(A,x);
>> A*x
ans =
0
2
0
MATLABで上の行列の固有値、固有ベクトルと比較すると、そうなりました。
[V,D]=eig(A)
V =
0.3015 -0.8018 0.7071
0.9045 -0.5345 0.0000
0.3015 -0.2673 0.7071
D =
2.0000 0 0
0 1.0000 0
0 0 -1.0000
固有値は一致するが、固有ベクトルは接近するはずである
[1/3 1 1/3]
. ここで、私は得る。
y_final
y_final =
0.5000
1.0000
0.5000
この不正確さを見てもいいのでしょうか、それとも私が何か勘違いをしているのでしょうか?
解決方法は?
正しい実装をしているが、チェックが甘い
両方
固有ベクトルと固有値が収束しているかどうか。 固有値の収束だけをチェックしているのです。 べき乗法では、顕著な固有ベクトルと固有値の両方を推定するので、おそらく
両方とも
は収束した。 そうすると、なんとか
[1/3 1 1/3]
. これを容易にするために、あなたのコードをどのように修正したかを説明します。
function [m,y_final]=power_method(A,x)
m=0;
n=length(x);
y_final=x;
tol=1e-10; %// Change - make tolerance more small to ensure convergence
while(1)
mold = m;
y_old=y_final; %// Change - Save old eigenvector
y_final=A*y_final;
m=max(y_final);
y_final=y_final/m;
if abs(m-mold) < tol && norm(y_final-y_old,2) < tol %// Change - Check for both
break;
end
end
end
上記のコードを例の入力で実行すると、こうなります。
>> [m,y_final]=power_method(A,x)
m =
2
y_final =
0.3333
1.0000
0.3333
について余談ですが
eig
MATLABはその固有ベクトルを別のノルムを用いてスケーリングしている可能性が高いです。 固有ベクトルは
は一意ではない
であり、スケールアップまで正確です。 もし確認したいのであれば、単に
V
で割ると、Power 法と同じように、1成分が1の値で正規化されます。
>> [V,D] = eig(A);
>> V(:,1) / max(abs(V(:,1)))
ans =
0.3333
1.0000
0.3333
これは、あなたが観察したものと一致します。
関連
-
[解決済み】Matlab: 黒を使わないグレースケールでのimagescの使用
-
[解決済み] Matlab. 位置2のインデックスが配列の境界を越えています(1を超えてはいけません)。
-
[解決済み] Matlabで列ベクトルを反復処理する方法は?[重複].
-
[解決済み] matlabでrandnを持つ確率変数の範囲はどうなっていますか?
-
[解決済み] Matlab: 逆コサイン(acos)の完全解を返す
-
[解決済み] なぜSIFTはMatlabで利用できないのですか?
-
[解決済み] グラフと関係のないカスタム凡例を追加する
-
[解決済み] Wolfram AlphaとMATLABでは伝達関数のプロットが異なる
-
[解決済み] Matlabで'symfun'によって記号関数の微分を実装するには?
-
[解決済み] Matlab: 小図形ウィンドウでYラベルが表示されない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Matlabの角括弧と中括弧の違い?
-
[解決済み] KroneckerDelta - matlab
-
[解決済み] matlabでhashtables/hashmapsを使う方法はありますか?重複
-
[解決済み] matlabでrandnを持つ確率変数の範囲はどうなっていますか?
-
[解決済み] Matlab - rectangle関数を使用せずに矩形をプロットする
-
[解決済み] 匿名関数の微分
-
[解決済み] mnrfitを用いたmatlabでのロジスティック回帰
-
[解決済み] matlabでchi2gof関数を理解する
-
[解決済み] Matlab: 小図形ウィンドウでYラベルが表示されない
-
[解決済み] Matlabでベクトルを表示(印刷)するには?