BY-SAのより転載著作権契約CC 4.0に従ってこの記事ShineEternalさんのブログ
1.前文
線形方程式といえば、私たちの最初の反応は、おそらくガウスの消去法で、この記事はあなたを提示するために詳細に、その例と関連した方法に沿って説明します。
そこに絵をもっとあり、さらに詳細に説明するための記事を例示し、その後のコードを配置し、あまりにも多くの長い記事や不快感の読み取りの原因になります、それは上にテンプレートだけです。
0、由来
遇到形如:
\ [\左\ {\開始{アレイ} {1} {A_ {11} X_ {1} + A_ {12} X_ {2} + \ cdots + A_ {1、N} X_ {N} = B_ {1}} \\ {A_ {21} X_ {1} + A_ {22} X_ {2} + \ cdots + A_ {2 N} X_ {N} = B_ {2}} \\ {\ cdots } \\ {\ cdots} \\ {\ cdots} \\ {A_ {N 1} X_ {1} + A_ {N 2} X_ {2} + \ cdots + A_ {NN} X_ {N} = B_ { N}} \端{アレイ}右\。\]
このような方程式は、どのように解除しますか?
それは数学の分野であるので、可能性がある場合、パスが出てきたの周りに、ばか特に単純なように、式の方程式の数は、の一つです。
しかし、あなたはOIフィールドに、このような問題が発生した場合は?私たちは、ことがわかったコンピュータが特定の問題を達成するために、アルゴリズムによって固定されている必要がありますが、人間の脳は、統合されたと考えることができますが、それは脳とコンピュータの間の差であるプログラムに脳内神経活動で表現することはできませんそれは、一次方程式の解の様々な方法が生まれました。
コンピュータと人間の脳:ここで、私は有名な本のことを思い出しています。フォン・ノイマンは、歴史の一部を読むことができます興味のある方は、自分の人気を購入することができ、書きました
この一次方程式はまた、工学で広く使われている、このモデル:
- 不明より
- 異なる方程式の数
そして、考慮すべき方程式の解を考えるとき:
- あなたは解けるですか?
- 解決した場合、それはユニークですか?
- そうでない場合のみ、溶液構造とどのような法則?
従って、線形方程式の解は、特に重要です。
ここでは、2つの一般的に使用される方法と関連する事例を紹介します
1、ガウスの消去法
歴史的な知識のいくつかのスポット:
この方法は、数学者ガウス、ラBuzhaの比率にちなんで命名されました。李Dingteの改善、フランスで出版されたが最初に登場した中国の古代図書「算術の九章」 BCについてで書かれ、\(150 \)年。
ガウス:
有名なドイツの数学者、物理学者、天文学者、幾何学者、測地科学者。世界では「数学の王子」をお楽しみください、本当に汎用性があり、有名な「自然数\(1 \ sim100は\)問題が加算された」と彼ということです\(9 \)を計算歳の時、それは今私たちのために簡単かもしれないがが、それは今後の研究のための強固な基盤を築くために、その時点で彼の革新的な精神を反映しません。
これは私たちがよりよく知っているソリューションです。
だから、このソリューションの核となるアイデアはそれということです何ですか?
我々は、コンピュータのソリューションを書くことができる線形方程式の種類、アイデアを見てみましょうか?
私たちは、特定の式から始める場合は明らかに、解の未知数を取得し、その後、各式は解の未知数を得ることができ、この溶液は不明だったが、別の式を代入します。
などなど。
要約すると、「三角測量」(名前から身をブラインド)であります
あるいは、上記の一般的な形式をとります:
\ [\左\ {\開始{1} + A_ {12} X_ {アレイ} {1} {A_ {11} X_ {2} + \ cdots + A_ {1、N} X_ {N} = B_ {1} } \\ {A_ {21} X_ {1} + A_ {22} X_ {2} + \ cdots + A_ {2 N} X_ {N} = B_ {2}} \\ {\ cdots} \\ {\ cdots} \\ {\ cdots} \\ {A_ {N 1} X_ {1} + A_ {N 2} X_ {2} + \ cdots + A_ {NN} X_ {N} = B_ {N} \端右\ {アレイ}。\]
しかし、利便性を観察するために、我々は想定しているので、おいしい:( 4の3行)の式
\ [\左\ {\開始{アレイ} {1} {X_ {1} +3 X_ {2} +4 X_ {3} = 5} \\ {X_ {1} +4 X_ {2} +7 X_ {3} = 3} \\ {9 X_ {1} +3 X_ {2} +2 X_ {3} = 2} \端{アレイ}右\。\]
このとき、係数行列はちょうどライン上の表現として、それは問題ではない学んだことがない:(行列で書かれています)
\ [\左[\開始{アレイ} {LLLL} {1}と{3}および{4}と{5} \\ {1}及び{4}および{7}と{3} \\ {9} &{3}および{2}および{2} \端{アレイ} \右] \]
最初のステップ:除去を行う係数の左側
へ
\ [\ [\ {4 \カラー{青}}&{{1 \色{赤}} {アレイ} {LLLを}開始&{3}および{4} \\ {\カラー{緑} 1}&左7} \\ {\カラー{緑} 9}と{\カラー{オレンジ} 3}と{\カラー{紫} 2} \端{アレイ} \右] \]
変換の「スプリット三角形」へ
これは、ターゲットの状態であります
\ [\左[\開始{アレイ} {LLL} {}?&{?}&{?} \\ {0}&{?}&{?} \\ {0}&{0}&{}? \端{アレイ} \右] \]
この場合、我々は、赤いマークセット(\ \色{赤} 1 \) 主要素、目標状態に対して見られ、マークされた緑色(\ \カラー{緑} 1 \) と\(\カラー{緑} 9 \ )の必要性\(0 \) 。
私たちは単に緑の実現には、全体の第一列、第二列を減算する必要が\(\カラー{緑} 1 \) の\(0 \) 。
だから、\(9 \)はどのようにそれを変換するには?
対応する全体的なマイナスにこの時間\(9 \)回最初の行ライン上の(存在の容易係数であってもよい\(0 \)方法、我々は達成する統一設計コンピュータアルゴリズムを与えなければなりません)
だから我々は得ました:
\ [\左[\開始{アレイ} {CCC} {1}と{3}および{4} \\ {0}&{\カラー{青} 1}と{3} \\ {0}&{\カラー{オレンジ} { - 24}}&{-34} \端{アレイ} \右] \]
そして次に青色に\(1 \カラー{青} \) 主要素、今する必要がある(\ {色オレンジ} {\ - 24} \) 0にします
そう全3行目マイナス\( - 24 \) (プラスに実際相当に時間セカンドライン(\ 24 \)回)
Q:良いの最初の行の前には存在しません\(0 \) 、それをフラッシュしますか?
:明らかに、最初のステップは、メインカラム係数が他の全ての外側要素であることを確認することであった\(0 \) 、上記の状況が発生しません
Q:グリーン上記の場合(\ \カラー{緑} 1 \) する(0 \)\行う方法?
これは主要な要素は特別である\(0 \)この時点で、各式の状態が非旋回以下ピボット位置と等しく、従って行のみであるため、ケース\(0 \)ラインスワップはすることができます。
追加Q:場合は、以下がそれを持っていませんか?
:だから、方程式の解決策が、この場合は、後述されません。
そして彼
\ [\左[\開始{アレイ} {LLL} {}?&{?}&{?} \\ {0}&{?}&{?} \\ {0}&{0}&{}? \端{アレイ} \右] \]
この状態は、ターゲットアップに対応しています。
そして私は、理解のギアを望んでいました。
しかし、右のを見つけました\(のb \)をマトリックスに置換されていません。
それから
ステップ2:拡大行列の排除
いわゆる拡大行列?
右側に(また、増幅マトリックスとして知られる)拡大行列の追加の係数行列であり、この列は線形方程式の等号の右辺の値です。----- Baiduの百科事典
実際には、余分な\(のb \)その列も
\ [\左[\開始{アレイ} {LLLL} {1}と{3}および{4}と{5} \\ {1}及び{4}および{7}と{3} \\ {9} &{3}および{2}および{2} \端{アレイ} \右] \]
上記
拡大行列の左側にある係数行列演算と全く同じで、単にガウスの消去法の理解を深め、困難に単純なものから1つだけの係数行列のプロセスを開始しました。限られたスペースの理由は、それらを繰り返すことはしません。
第三段階:リワインド
最後に、除去の一連の後、次の行列が得られます。
\ [\左[\ {CCCCを} {アレイを}開始{1}と{3}および{4}と{5} \\ {0}と{1}と{3}および{-2} \\ {0 }&{0}と{38}&{-91} \端{アレイ} \右] \]
そして、バック行列方程式への書き込み:
\ [\左\ {\開始{アレイ} {1} {X_ {1} +3 X_ {2} +4 X_ {3} = 5} \\ {0 X_ {1} +1 X_ {2} +3 X_ {3} = - 2} \\ {0 X_ {1} +0 X_ {2} +38 X_ {3} = - 91} \端{アレイ}右\。\]
どうやら私たちは因子削除することができます\(0 \)文字を:
\ [\左\ {\開始{アレイ} {1} {X_ {1} +3 X_ {2} +4 X_ {3} = 5} \\ {1 X_ {2} +3 X_ {3} = - 2} \\ {38 X_ {3} = - 91} \端{アレイ}右\。\]
結果は、今まで下からプッシュ明確です:
順番にすることができ
\ [X_3 = \ FRAC 38 {{}} = -91 -2.39 \である]
(小数点以下を保持)
次いで、既知の\(X_3 \)中の中間体式に代入、\(X_3 \)与えることを理解した上で、
\ [X_2 = 5.18 \]
最後に、\は(X_2、X_3 \)すぎ、バック最上式の代わりに、次のとおりです。
\ [X_1 = -0.97 \]
最後にこのように、マニュアルシミュレーションガウスの消去
明らかに、数学のテストは、無限の質問にお答えしますしかし、コンピュータのために、それは一般的な方法です。
時間の複雑さ:\(。O(N ^ 3)\)
時間計算量が高いが、いずれにしても、私たちは、線形方程式を解くためのコンピュータに対して、以下のコードで実装される一般的な方法を発見しました。
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
const double eps=1e-7 ;
double a[105][105],ans[105];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n+1;j++)//这里千万别忘了右侧那一列了
{
scanf("%lf",&a[i][j]);
}
}
for(int i=1;i<=n;i++)
{
int m=i;
for(int j=i+1;j<=n;j++)
if(fabs(a[m][i])<fabs(a[j][i]))//fabs 能取浮点数绝对值
m=j;//找到当前这一列最大的数字,作为主元消元,这样能最大限度的避免精度误差
if(fabs(a[m][i])<eps)//这里要判精度,其实就是如果该位置的系数为 $0$ 则无解(double 没法准确处理这种精度
{
printf("No Solution\n");
return 0;
}
if(i!=m)swap(a[i],a[m]);//如果巧了,当前行不是最大行,那得罪了,你换下去吧,让未来的主元上来,好直接枚举之后的方程就行了
double d=a[i][i];
for(int j=i;j<=n+1;j++)
a[i][j]/=d;//将该位置的系数变为 1
for(int j=i+1;j<=n;j++)
{
d=a[j][i];
for(int k=i;k<=n+1;k++)
{
a[j][k]-=a[i][k]*d;//将其他的方程用两式相减的方法减去应当减掉的系数的值
}
}
}
ans[n]=a[n][n+1];
for(int i=n-1;i>=1;i--)//回带,最后一行直接写出答案,然后其他行还有等待前面处理出来,从后往前推即可
{
ans[i]=a[i][n+1];//这里不难理解
for(int j=i+1;j<=n;j++)
{
ans[i]-=a[i][j]*ans[j];
}
}
for(int i=1;i<=n;i++)
{
printf("%.2lf\n",ans[i]);
}
return 0;
}
このテンプレートは、することができガウスの消去は、P3389 [テンプレート]リンクは私のように見えるの前に言葉が再び行こうとなっている(テストを提出します
他の場所には、理解することは困難ではない、なぜPCAは、エラーを回避するために最大で聞かせなければなりませんか?
これは、アップ希望証拠からであるワイドを見て興味を持っている人たちの毎日は、それから出てくることができるはずです。
おそらく:
除去係数への電流式を設定\(Q_ {I1}、Q_ {I2}、Q_ {I3}、\ cdots、\ {で} Q_)
係数私たちの主な目標であると仮定すると、\(Q_ {I1} \)
そこ
\ [Q_ {JN} = Q_ {JN} - FRAC \ {Q_ {J 1}} {Q_ {I 1}} \回Q_ {IW} \]
我々は最大主要素ことがわかり、この時点で\(Q_ {I1} \)
、それが大きい場合、それが意味する\(dfrac {Q_ {J1} } {Q_ {I1を}} \ \) より小さいが、これを所望の全体の結果をもたらすために小さな数の影響が小さい場合、QAQの精度誤差を引き起こす可能性はありません
この、ガウスの消去が終わっているが、
答えを見つけるために戻すことを避けるためにガウスの消去法の高度なバージョンがあります。
2、ガウス - Jordanの消去
それがに来るとき答えを見つけるために持ち帰っ避けて、私たちは目的を考える、またはこのアルゴリズムのサンプルを取ることができるはず、それは式となります:
\ [\ [\ {?} {アレイ} {LLLLを}開始&{0}&{0}&{?} \\ {0}&{?}・{0}&{?} \\ {0}左&{0}&{?}&{?} \端{アレイ} \右] \]
このように、我々は、各方程式の解を分離することができます。
だから、どのように我々は、このフォームにそれを得るのですか?
まず第一に、我々は簡単に、単純なガウスの消去法に従って得ることができます。
\ [\ [\ {アレイ} {LLLLを}開始{?}&{?}&{?}&{?} \\ {0}&{?}&{?}&{?} \\ {0}左&{0}&{?}&{?} \端{アレイ} \右] \]
上部および下部マトリックスを観察することは、我々がちょうどその時排除で除去取得することは容易である下記式の式はここで主成分、上記式も対処しなければならないため。
それが始まったので、一番下はオリジナルです。
\ [\左[\開始{アレイ} {LLLL} {1}と{3}および{4}と{5} \\ {1}及び{4}および{7}と{3} \\ {9} &{3}および{2}および{2} \端{アレイ} \右] \]
最初の通常の除去は同様に、取得します:
\ [\左[\開始{アレイ} {RRRR} {1}と{3}および{4}と{5} \\ {0}と{1}と{3}および{-2} \\ {0 }&{-24}&{-34}&{-43} \端{アレイ} \右] \]
しかし、2行目に与えることを、最初の排除を持っています:
\ [\左[\ {アレイを}開始{RRRR} {1}と{0}&{-5}&{11} \\ {0}と{1}と{3}および{-2} \\ { 0}&{0}と{38}&{-91} \端{アレイ} \右] \]
そして、最後のステップは、(このステップは、より多くのためにガウスの消去法よりも簡単である)です。
\ [\ [\ {アレイ} {RRRR} {1}を開始&{0}&{0}&{-0.97} \\ {0}と{1}と{0}&{5.18} \\ {0左}&{0}と{38}&{-91} \端{アレイ} \右] \]
書き戻す行列方程式
\ [\左\ {\開始{アレイ} {1} {X_ {1} +0 X_ {2} +0 X_ {3} = - 0.97} \\ {0 X_ {1} + X_ {2} +0 X_ {3} = 5.18} \\ {0 X_ {1} +0 X_ {2} +38 X_ {3} = - 91} \端{アレイ}右\。\]
係数\(0 \)が削除されます。
\ [\左\ {\開始{アレイ} {1} {X_ {1} = - 0.97} \\ {X_ {2} = 5.18} \\ {38 X_ {3} = - 91} \端{アレイ} \右。\]
この結果は明らかに噴火しています。
\ [\左\ {\開始{アレイ} {1} {X_ {1} = - 0.97} \\ {X_ {2} = 5.18} \\ {X_ {3} = - 2.39} \端{アレイ} \右。\]
ここでは、テンプレートのコードは次のとおりです。
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
double a[105][105];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n+1;j++)
{
scanf("%lf",&a[i][j]);
}
}
for(int i=1;i<=n;i++)//枚举列(项)
{
int m=i;
for(int j=i+1;j<=n;j++)//选出该列最大系数
{
if(fabs(a[j][i])>fabs(a[m][i]))//fabs 是取浮点数的绝对值的函数
{
m=j;
}
}
for(int j=1;j<=n+1;j++)//交换
{
swap(a[i][j],a[m][j]);
}
if(a[i][i]==0)//最大值等于 $0$ 则说明该列都为 $0$,肯定无解
{
printf("No Solution\n");
return 0;
}
for(int j=1;j<=n;j++)//每一项都减去一个数
{
if(j!=i)//不是主元那一项
{
double d=a[j][i]/a[i][i];
for(int k=i+1;k<=n+1;k++)
{
a[j][k]-=a[i][k]*d;
}
}
}
}
for(int i=1;i<=n;i++)//最后的结果系数可能不为 $1$,所以记得消去常数
{
printf("%.2lf\n",a[i][n+1]/a[i][i]);
}
return 0;
}
もちろん、コードのこの作品より簡潔数
3、例
例\(1 \)
ジェーンシリアの質問の意味:
既知\(N- \)リニア式基であり、それは、決定したソリューションです。
- 本当の解決策を出力しない-1
- 無限に多くの真の解決策を出力0
- それはユニークなソリューション、出力ソリューション(小数点以下2小数点以下の桁)を持っています。サンプルの特定のフォーマットを参照してください。
分析:
この質問だけで、以前のテンプレートのタイトルの微細化はユニークなソリューションの場合を判断するために来ることができないされ、複数のソリューションの判定方法について話をするので、無ソリューション&&方法:
(私たちは知っている限り、ノー溶液または未知の解決策として、全体の方程式を説明することができます)
解決策ありません
私たちの最も直接的な最後の行があるかどうかを判断することです
\ [\ [\ {アレイ} {LLLLを}開始{?}&{?}&{?}&{?} \\ {0}&{?}&{?}&{?} \\ {0}左&{0}&{?}&{?} \端{アレイ} \右] \]
左係数がさ(0 \)\と右の係数がされていません(0 \)\します
しかし、容易に脱落した場合には、我々は、未知の滞在単一の除去の前にある、各行を考えるにも、最初の行と同じです。
したがって、各行は、テンプレートのルーチンの最後の行に応じて決定することができます。
if(a[i][i]==0&&a[i][n+1]!=0)
解決策ありません
複数のソリューション
上記に対応して、想像するのは簡単です:
if(a[i][i]==0&&a[i][n+1]==0)
複数のソリューション
- そう直接出て、その後、複数のソリューションに目を向けるならば、何の解決策は、最初に決めるべきではないことに注意してください。
まず、解無しであれば、未知の可解性に基づいて、複数のソリューションので、全体の方程式の自然ソリューションは、理解を超えて言及しないように、存在しません。
タイトルのように、その後、テンプレート上の他はまったく同じ
例2
(この質問は私がソースを見つけられませんでした)
トピック:[式]ビタミン
質問の意味:
彼は人間に適したビタミンの様々な利点を取ることができれば、いくつかのビタミンを既存の、彼は尋ねたが策定これらのビタミンを必要とします
入力フォーマット:
最初の行:人々はビタミンのいくつかのタイプを追加する必要があります\(Vを(1 \ルV \ル25)\)
二行目:\(V \)番号、\(私は\) $の数
V_I $、最初のボディを示す\を(私は\)ビタミンの需要(\(1000年1 \ Viのル\ル。 \) )
第三行:ビタミン既知タイプ\(G(1 \ルGの \のLE15)\)
次である\(G \回V \)の整数の行列は、\({} \のA_ ijが)を表し、\(Iは\)に含まれるビタミンの\(J \)ビタミンAの含有量を(\ (1 {} \ル000 \の\ルA_ IJ) )
出力フォーマット:
最初の行の出力が「YES」または「NO」に、製剤化することができます
2行目:出力準備もし\(G \) 、整数、Giを
GIを表す\(Iは\)シリーズで、ビタミンを取って、複数の出力方式の任意のセットを。出力にこの行をしないように持つことなく、ワインの準備。
サンプル入力:
4
100 200 300 400
4
50 50 50 50
30 100 100 100
20 50 150 250
50 100 150 200
出力例:
YES
1 1 1 0
分析:
我々は最初のビタミンとビタミンの違いを理解する必要があります。
そして、ガウスの消去法を考えるのは簡単でなければなりません。
セクション策定する必要が提供\(私は\)ビタミンの数の種\(X_Iを(I \ル15 )\)
質問のよる意味は、一覧表示することができます。
\ [\左\ {\開始{アレイ} {1} {50 X_ {1} +30 X_ {2} +20 X_ {3} +50 X_ {4} = 100} \\ {50 X_ {1} + 100 X_ {2} +50 X_ {3} +100 X_ {4} = 200} \\ {50 X_ {1} +100 X_ {2} +150 X_ {3} +150 X_ {4} = 300} \ \ {50 X_ {1} +100 X_ {2} 250 X_ {3} +200 X_ {4} = 400} \端{アレイ}右\。\]
- これは良い考えの最初のステップですが、それは順番ランクを間違えやすく、よく見ると必要性を明らかにする(V_I \)\最初の行列に補完\(G + 1 \)ライン、などの各式。
マトリックスを形成するためにフィット:
\ [\左[\開始{アレイ} {LLLLL} {50}と{30}と{20}と{50}および{100} \\ {50}および{100}と{50}および{100}& {200} \\ {50}および{100}および{150}および{150}および{300} \\ {50}および{100}および{250}および{200}および{400} \端{アレイ} \右]\]
パスの除去に:
\ [\開始{アレイ} {CCCCC} {1}と{2}・{1}と{2}および{4} \\ {0}と{1}と{3月7日}&{5月7日} &{10月7日} \\ {0}&{0}と{1}と{/ 2}・{1} \\ {0}&{0}&{0}&{0}&{0} \端{アレイ} \]
この時点で、我々はそれを見つけるために驚いた:最後の行がある\(0 \)
(ああ、これを行う方法!)
(学習するだけでどのように!ないマルチソリューションの状況というの知識?!)
まあ、多くの解決策が重要ではないがあった、キーは、私たちがこのような状況に対処する方法であります
しかし、これは、鍵となる難しいことではありません。
私達はちょうどに必要いくつかの怠惰溶液は、より多くの未知数に設定することができる(0 \)\ライン上で操作を減らすために、できるだけ。
この特定のサンプルでは、それはセットアップすることです\(X_4 = 0 \) 、彼が影響を受けていない回答数とは何の関係もありません。
4、ガウス消去注:
間違ったテンプレートをバックアップしないでください- 精度の問題を避けるために、というよりも比較して、最高とEPS \(0 \)は(時々これは基本的に同じであるが)を比較
- 解決策は、マルチオーダーソリューションと同様に決定されていません
- 変換エラーの話題に遭遇または抗ガウスの消去法に変換したときに興奮しないでください。
5、ポストスクリプト
これは、最終的に完成品、LaTeXの書き込み行列や内部の写真と線形方程式のガウスの消去法であることは、あなたがこの記事の助けを持っている場合は、賞賛を与えること自由に感じなさい、容易ではありません。