[解決済み] 部分ピボットによるガウス消去の実装【終了しました
2022-02-09 01:42:01
質問
MATLABで部分ピボットによるガウス消去を実装するプログラムを書いています。行を直接交換するのではなく、行の交換を保存するために整数配列を作りました。
しかし、正しい結果を得ることができず、問題を把握することができませんでした。どのようにコードを修正すれば、正しい答えが得られるのでしょうか?
A=[1, -2, 1; 2, 1, -3; 4, -7, 1];
b=[0, 5, 1];
b=b';
function x = GE(A,b)
[m,n]= size(A);
if m ~= n
disp('Not a square');
end
for p=1:n
array(p)=p;
endfor
A = [A,b];
%elimination
for i = 1:n-1
pivot = i;
%select pivot
for j = i+1:n
if abs(A(array(i),i)) < abs(A(array(i),i)) %row interchange
temp = array(i);
array(i) = array(j);
array(j) = temp;
end
end
while (pivot <= n && A(pivot,i)== 0)
pivot = pivot+1;
end
if pivot > n
disp('No unique solution');
break
else
if pivot > i
tem = array(i);
array(i) = pivot
pivot= tem;
end
end
for j = i+1:n
m = -A(array(j),i)/A(array(i),i);
for k = i+1:n+1
A(array(j),k) = A(array(j),k) + m*A(array(i),k);
end
end
end
if A(n,n) == 0
disp('No unique solution');
return
end
%backward substitution
x(n) = A(array(n),n+1)/A(array(n),n);
for i = n - 1:-1:1
sum = 0;
for j = i+1:n
sum = sum + A(array(i),j)*x(j);
end
x(i) = (A(array(i),n+1) - sum)/A(array(i),i);
end
endfunction
解決方法は?
あなたのエラーはとてもシンプルです。 ピボットが正しく行われていないのです。
if
ステートメントを使用します。
for j = i+1:n
if abs(A(array(i),i)) < abs(A(array(i),i)) %row interchange <-------
temp = array(i);
array(i) = array(j);
array(j) = temp;
end
end
どの係数からピボットするかというチェックは、インデックスを使用しているため正しくありません。
i
を使用する必要がある場合、列に沿ってチェックするために
j
. したがって、ブール条件の反対側を変更するだけで、その条件では
j
:
for j = i+1:n
if abs(A(array(i),i)) < abs(A(array(j),j)) %// CHANGE HERE
temp = array(i);
array(i) = array(j);
array(j) = temp;
end
end
あなたの例では
A
と
b
という答えが返ってきます。
x = [2 1 0]
これは、MATLABの
ldivide
の演算を行います。
x = A \ b
.
関連
-
[解決済み] Matlabでシンプソンの1-3 (h / 3)メソッド
-
[解決済み] エラー: 等号の左側にある式は代入の対象として有効ではありません Matlab
-
[解決済み] Matlab: 逆コサイン(acos)の完全解を返す
-
[解決済み] Matlabでcorr2関数を説明する
-
[解決済み] Wolfram AlphaとMATLABでは伝達関数のプロットが異なる
-
[解決済み] Matlabで固有ベクトルを正しくプロットする
-
[解決済み] MATLABでベクトルの線形スパンを求める
-
[解決済み] キュービックスプライン補間と多項式補間の比較
-
[解決済み] Matlab の imrect を用いて,新しい矩形の座標を取得します.
-
[解決済み] MATLABのコードヘルプです。バックワードオイラー法
最新
-
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でカラーバーのスケールを制御する
-
[解決済み] プロットを回転させる?
-
[解決済み] Matlab - 連立方程式を解くときにvpasolveエラーが発生する
-
[解決済み] パーフカーブで1つの値を返す - matlab
-
[解決済み] Wolfram AlphaとMATLABでは伝達関数のプロットが異なる
-
[解決済み] MatlabのA=[x; y']は何を意味するのですか?
-
[解決済み] 入力引数が多すぎる Matlab ode45
-
[解決済み] MATLABのパスに影をつける」とはどういう意味ですか?ファイル内で行うにはどうしたらいいですか?
-
[解決済み] Matlabでforward inputnames?
-
[解決済み] Matlabでベクトルを表示(印刷)するには?