目次
序文
線形方程式の直接解には、ガウス消去法、ピボット消去法、平方根法、キャッチアップ法などを含む多くの方法があります。しかし、MATLAB では、「\」または「/」を直接使用して問題を解決できます。これら 2 つの方法には、過決定方程式に対する最小二乗法の使用、過小決定方程式に対する最小の誤差ノルムによる解の提供、三重対角行列方程式に対するキャッチアップ法の使用など、多くの適応アルゴリズムが含まれています。
1. 直接解法: 行列の除算
線形方程式を解くためのMATLAB 呼び出し形式は次のとおりです。
x=A\B
この関数を呼び出すときは、行列 A、B の行数が同じである必要があります。行列 A が適切にスケーリングされていない場合、または行列 A が特異に近い場合、コードの実行時に MATLAB は警告メッセージを表示します。
行列 A は次の 3 つの状況に分類できます。
- A がスカラーの場合、A\B は A.\B と同等です。
- A が正方行列、B が n 行行列の場合、A\B は方程式 A*X=B の解になります。
- A が行列、B が m 行の行列の場合、A\B は方程式系 A*X=B の最小二乗解を返します。
例1
次の方程式を解きます。
ほどく:
MATLAB コードは次のとおりです。
clc;clear;
A=[0.4096 0.1234 0.3678 0.2943;0.2246 0.3872 0.4015 0.1129;
0.3645 0.1920 0.3781 0.0643;0.1784 0.4002 0.2786 0.3927];
b=[0.4043;0.1150;0.4240;-0.2557];
x=A\b;
x' %将结果输出为行向量
実行結果:
ans =
0.332683779325239 -1.412140862756104 1.602847655449206 -0.500293786006566
例 2
A は次数 4 の魔方陣行列であり、線形方程式系 Ax=b を解きます。b の式は次のようになります。
備考: 魔方陣行列の定義:配列に同じ行と列があり、各行、列、対角線の合計が同じである場合、これらの配列は魔方陣行列になり、魔方陣行列とも呼ばれます。
ほどく:
MATLAB コードは次のとおりです。
clc;clear;
A=magic(4); %生成四阶的幻方矩阵
b=[34;34;34;34];
x=A\b;
x'
操作結果:
答え =
0.980392156862745 0.941176470588235 1.058823529411765 1.019607843137255
分析:
次数 4 の魔方陣行列は特異行列であり、特異行列も解くことができますが、MATLAB は次のような警告を生成します。
警告: 行列が特異値に近いか、スケーリングが正しくありません。結果は正確ではない可能性があります。RCOND = 4.625929e-18。
例 3
一次方程式系 Ax=b を解き、誤差がないか解析します。A、b行列は次のとおりです。
,
ほどく:
MATLAB コードは次のとおりです。
clc;clear;
A=[1 2 0;0 4 3];
b=[8;18];
x=A\b
E=norm(b-A*x) %求范数误差
操作結果:
x =
0
3.999999999999997
0.666666666666670
E =
7.160723346098895e-15
分析: この方程式は過小決定方程式であり、MATLAB は最小二乗法を使用してそれを解くため、誤差が生じます。
さらに、最後の例では、スパース行列を使用して単純な線形方程式系 Ax=B を解きます。
MATLAB コード:
clc;clear;
A=sparse([0 2 0 1 0;4 -1 -1 0 0;0 0 0 3 -6;-2 0 0 0 2;0 0 4 2 0]);%稀疏矩阵
B=sparse([8;-1;-18;8;20]); %稀疏矩阵
x=A\B
E1=norm(B-A*x) %范数误差
操作結果:
x =
(1,1) 1.000000000000000
(2,1) 2.000000000000000
(3,1) 3.000000000000000
(4,1) 4.000000000000001
(5,1) 5.000000000000001
E1 =
4.189529226675416e-15
2.直接解決:判断と解決
行列 A、B を次のように指定します。
解を形成する決定行列 C は次のとおりです。
連立一次方程式には解があるという判断定理は、次の 3 つの場合に分けられます。
2.1 m=n およびランク(A)=ランク(C)=n
この場合、連立方程式には一意の解があります。
例 4
次の連立方程式を解きます。
ほどく:
MATLAB コードは次のとおりです。
clc;clear;
A=[1 2 3 4;4 3 2 1;1 3 2 4;4 1 3 2];
B=[5 1;4 2;3 3;2 4];
C=[A B];
%判定前提条件
rank_A=rank(A)
rank_C=rank(C)
%求解
x1=inv(A)*B
%计算范数误差
E1=norm(A*x1-B)
%计算精确解
x2=inv(sym(A))*B
%计算范数误差
E2=norm(A*x2-B)
操作結果:
ランク_A =4
ランク_C = 4
x1 =
-1.800000000000000 2.399999999999999
1.866666666666666 -1.266666666666667
3.866666666666667 -3.266666666666667
-2.13333333333 3333 2.733333333333333
E1 =7.291088482824584e-15
x2 =
[ -9/5、12/5]
[ 28/15、-19/15]
[ 58/15、-49/15]
[ -32/15、41/15]
E2 =0
2.2 ランク(A)=ランク(C)=r<n
この場合、連立方程式には無限に多くの解があります。元の連立方程式は、次の形式で対応する同次方程式系の解に変換できます。
このとき、 A 行列 のゼロ化行列を取得する必要があり、MATLAB の形式は次のとおりです。
Z=null(A)
または、 A 行列 のゼロ化行列の正準形式を見つけます。MATLAB 形式は次のとおりです。
Z=null(A,'r')
例5
次の連立方程式を解きます。
ほどく:
MATLAB コードは次のとおりです。
clc;clear;
A=[1 2 3 4;2 2 1 1;2 4 6 8;4 4 2 2];
B=[1;3;2;6];
C=[A B];
%判断可解性
rank=[rank(A),rank(C)]
%求解出规范化的化零空间
Z=null(sym(A))
%求特解
x0=sym(pinv(A)*B)
%验证得出的解
a1=randn(1);
a2=rand(1); %a1和a2是不同分布的随机数
x1=a1*Z(:,1)+a2*Z(:,2)+x0;
E=norm(double(A*x1-B))
%将通解表示出来
syms a3 a4;
x2=a3*Z(:,1)+a4*Z(:,2)+x0
操作結果:
ランク = 2 2
分析: 解決策が存在し、複数の解決策があることを説明します。
Z =
[ 2, 3]
[ -5/2, -7/2]
[ 1, 0]
[ 0, 1]
分析: この結果は、次の方程式として解釈できます。
x0 =
125/131
96/131
-10/131
-39/131
E =0
分析: この方法で得られた結果にはエラーはありません
x2 =
2*a3 + 3*a4 + 125/131
96/131 - (7*a4)/2 - (5*a3)/2
a3 - 10/131
a4 - 39/131
分析: この結果は、一般式として次のように書くことができます。
2.3
現時点では、最小二乗法を解くためにムーア・ペンローズの一般化逆関数のみを使用できます。MATLAB の形式は次のとおりです。
x=pinv(A)*B
この方法では、誤差ノルム測定値の最小値を ||Ax-B|| にすることしかできず、元の代数方程式に完全に準拠することはできません。
3. 逆行列で一次方程式を解く
係数行列Aを反転することにより、一次方程式系Ax=bを解くこともできる。残念ながら、この方法は以前のバックスラッシュ計算による方法よりも遅く、残差が比較的大きくなります。しかし実際には、利点もあります。サンプル問題を見てみましょう。
例6
8 次の魔方陣行列を使用して、MATLAB の 2 つの解法 x1=A\b と x2=pinv(A)*b の精度を比較します。
ほどく:
MATLAB コードは次のとおりです。
clc;clear;
A=magic(8);
A1=A(:,1:6); %行数全取,列数保留1~6列,具体原因见"分析"
rank_A1=rank(A1)
b=260*ones(8,1); %260是原A矩阵的幻数和
%使用反斜杠法求解
x1=A1\b
norm_x1=norm(x1)
E1=norm(A1*x1-b)
%使用pinv()函数求解
x2=pinv(A1)*b
norm_x2=norm(x2)
E2=norm(A1*x2-b)
操作結果:
ランク_A1 =3
警告: ランクが不足しています。ランク = 3、tol=1.882938e-13。
(A1行列は正方行列ではないため、行列のランクを計算する際に警告が表示されます。行列のランクに関する導入については、以下の記事を参照してください)
MATLAB に基づく行列プロパティ: 行列式、ランク、トレース、ノルム、特性多項式、行列多項式 ブログ-CSDN ブログ
x1 =
2.999999999999998
4.000000000000000
0
0
1.000000000000002
0
ノルム_x1 = 5.099019513592784
E1 = 1.392373714442771e-13
x2 =
1.153846153846151
1.461538461538463
1.384615384615385
1.384615384615383
1.461538461538461
1.153846153846153
ノルム_x2 =3.281650616569467
E2 =4.019436694230464e-13
分析します:
(1) A 行列を A1 に変換します。列が 6 つしかない場合でも、方程式は一貫しており、依然として解が存在し、解はすべて 1 で構成されているわけではないからです。また、行列のランクが低いため、解の数は無限に存在します。
(2) ノルム誤差計算の結果によると、2 つの解法の精度は一致しています。
(3) 解 x1 の特徴は非ゼロ要素が 3 つだけであること、解 x2 の特徴はそのノルム(x2) が非常に小さいことです。