MATLAB に基づいて線形方程式を解く (完全なコードと例付き)

目次

序文

1. 直接解法: 行列の除算

例1

 例 2

例 3

2.直接解決:判断と解決

2.1 m=n およびランク(A)=ランク(C)=n

2.2 ランク(A)=ランク(C)=r<>

例5

2.3 

3. 逆行列で一次方程式を解く

例6


序文

線形方程式の直接解には、ガウス消去法ピボット消去法平方根法キャッチアップ法などを含む多くの方法があります。しかし、MATLAB では、「\」または「/」を直接使用して問題を解決できます。これら 2 つの方法には、過決定方程式に対する最小二乗法の使用過小決定方程式に対する最小の誤差ノルムによる解の提供三重対角行列方程式に対するキャッチアップ法の使用など、多くの適応アルゴリズムが含まれています。

1. 直接解法: 行列の除算

線形方程式を解くためのA*X=BMATLAB 呼び出し形式は次​​のとおりです。

x=A\B

この関数を呼び出すときは、行列 A、B の行数が同じである必要があります。行列 A が適切にスケーリングされていない場合、または行列 A が特異に近い場合、コードの実行時に MATLAB は警告メッセージを表示します。

行列 A は次の 3 つの状況に分類できます。

  • A がスカラーの場合、A\B は A.\B と同等です。
  • A がn\回n正方行列、B が n 行行列の場合、A\B は方程式 A*X=B の解になります。
  • A がm\回n行列、m\neq nB が 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 の式は次のようになります。

b=\begin{bmatrix}34\\34\\34\\34 \end{}

備考: 魔方陣行列の定義:配列に同じ行と列があり、各行、列、対角線の合計が同じである場合、これらの配列は魔方陣行列になり、魔方陣行列とも呼ばれます。

ほどく:

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行列は次のとおりです。

A=\begin{bmatrix}1&2&0\\0&4&3 \end{}b=\begin{bmatrix}8\\18 \end{}

ほどく:

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 は次のとおりです。

C=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}&b_{11}&b_{12}&\cdots&b_{1p}\\ a_{21}&a_{22}&\cdots&a_{2n }&b_{21}&b_{22}&\cdots&b_{2p}\\ \vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\ddots&\vdots\\ a_{m1}&a_{m2}&\cdots&a_{mn}&b_ {m1}&b_{m2}&\cdots&b_{mp} \end{}

連立一次方程式には解があるという判断定理は、次の 3 つの場合に分けられます。


2.1 m=n およびランク(A)=ランク(C)=n

この場合、連立方程式には一意の解があります。 x=A^{-1}B

例 4

次の連立方程式を解きます。

\begin{bmatrix}1&2&3&4\\ 4&3&2&1\\ 1&3&2&4\\ 4&1&3&2 \end{}X=\begin{bmatrix}5&1\\4&2\\3&3\\2&4 \end{}

ほどく:

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

この場合、連立方程式には無限に多くの解があります。元の連立方程式は、次の形式で対応する同次方程式系の解に変換できます。

\hat x=\alpha_1x_1+\alpha_2x_2+\ldots+\alpha_{nr}x_{nr},\quad \alpha_i,i=1,2,\cdots,nr

このとき、 A 行列 のゼロ化行列を取得する必要があり、MATLAB の形式は次のとおりです。

Z=null(A)

 または、 A 行列 のゼロ化行列の正準形式を見つけます。MATLAB 形式は次のとおりです。

Z=null(A,'r')

例5

次の連立方程式を解きます。


\begin{bmatrix}1&2&3&4\\ 2&2&1&1\\ 2&4&6&8\\ 4&4&2&2 \end{}X=\begin{bmatrix}1\\3\\2\\6 \end{}

ほどく:

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]
 分析: この結果は、次の方程式として解釈できます。

\begin{bmatrix}x_1\\x_2\\x_3\\x_4 \end{}=\begin{bmatrix}2&3\\-2.5&-3.5\\1&0\\0&1 \end{}\begin{bmatrix}x_3\ \x_4 \終了{}
 
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

分析: この結果は、一般式として次のように書くことができます。

\begin{bmatrix}x_1\\x_2\\x_3\\x_4 \end{}=a_3\begin{bmatrix}2\\-2.5\\1\\0 \end{}+a_4\begin{bmatrix}3\ \-3.5\\0\\1 \end{}+\begin{bmatrix}0.9542\\0.7328\\-0.0763\\-0.2977 \end{}

2.3 ランク(A)\leq ランク(C)

現時点では、最小二乗法を解くためにムーア・ペンローズの一般化逆関数のみを使用できます。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) が非常に小さいことです。

おすすめ

転載: blog.csdn.net/forest_LL/article/details/124209950