Linear Equation - 演算法筆記

文章推薦指數: 80 %
投票人數:10人

由上往下消除變數的過程,就叫做「高斯消去法」。

LinearEquation LinearEquation 「一次方程式」。

一次函數的等式。

3x+4y-6=2x+5z-1 移項整理:變數在左邊,常數在右邊。

1x+2y-5z=5 SystemofLinearEquations 「一次方程組」。

許多道一次方程式同時成立。

{1x+2y-5z=5 {2x+4y+6z=1 {3x+1y+7z=4 一次方程組求解,等同於線性函數求解,或者說矩陣求解。

{1x+2y-5z=5[12-5][x][5] {2x+4y+6z=1--->[246][y]=[1] {3x+1y+7z=4[317][z][4] Axb 特殊矩陣擁有特殊演算法,稍微省時,詳情請見MATLAB的mldivide說明圖片。

簡單起見,以下不介紹特殊矩陣的演算法。

Inverse 「反矩陣」。

一旦知道反矩陣,即可輕鬆解一次方程組。

而且還可以隨意抽換等號右邊數值。

solveAx=b--->findA⁻¹,thenx=A⁻¹b 一次方程組求解演算法,稍作修改,即得反矩陣演算法。

LinearEquation:Elimination 等量公理 相信大家已經學過如何解一次方程組:由上往下消除變數,變成階梯狀;由下往上解出變數,變成對角線。

由上往下消除變數的過程,就叫做「高斯消去法」。

演算法(GaussianElimination) 一個矩陣,化成上三角矩陣,對角線元素皆為一。

由上往下,處理每個橫條,實施三種運算:交換、倍率、相減。

如果橫條的首項係數不是零,以該橫條抵銷下方橫條,令下方橫條的首項係數化成零。

如果是零,就往下找到非零橫條,先交換,再抵銷。

pivotrow:首項係數不是零的橫條。

pivot:上述橫條的首項係數。

pivoting:找到pivotrow,視情況進行交換。

減少誤差的方法:取絕對值最大的pivotrow,抵銷其餘row。

換句話說,首項係數絕對值最大的橫條,總是交換到上方,再來抵銷下方橫條。

倍率小於1,相減誤差少。

矩陣邊長N×M,時間複雜度O(N²M)。

大家習慣討論方陣,N=M,時間複雜度O(N³)。

方陣的高斯消去法,程式碼如下所示。

矩陣的高斯消去法,留給大家自行練習。

doublematrix[10][10]; voidgaussian_elimination() { for(inti=0;i<10;++i) { //如果橫條的首項係數為零,嘗試與下方橫條交換。

if(matrix[i][i]==0) for(intj=i+1;j<10;++j) if(matrix[j][i]!=0) { //交換上方橫條與下方橫條。

for(intk=i;k<10;++k) swap(matrix[i][k],matrix[j][k]); break; } //如果首項係數都是零,那就略過。

if(matrix[i][i]==0)continue; //橫條的首項係數調整成一。

為了讓對角線皆為一。

doublet=matrix[i][i]; //首項係數 for(intk=i;k<10;++k) matrix[i][k]/=t; //抵銷下方橫條,令下方橫條的首項係數化成零。

for(intj=i+1;j<10;++j) if(matrix[j][i]!=0) { doublet=matrix[j][i]; for(intk=i;k<10;++k) matrix[j][k]-=matrix[i][k]*t; } } } 解一次方程組 首先實施高斯消去法,求得上三角矩陣。

由下往上,處理每個橫條。

把先前解出的變數,代入到目前橫條,解出變數。

時間複雜度O(N²)。

doublematrix[10][10+1]; //參數化的矩陣 doublex[10]; //一次方程組的解 voidback_substitution() { for(inti=10-1;i>=0;--i) { if(matrix[i][i]==0)return; //無解、多解 doublet=0; for(intk=i+1;k<10;++k) t+=matrix[i][k]*x[k]; x[i]=(matrix[i][10]-t)/matrix[i][i]; } } UVa101091052410828ICPC3563 演算法(Gauss–JordanElimination) 「高斯喬登消去法」是延伸版本。

對角線化成一、其餘化成零。

時間複雜度仍是O(N³)。

高斯喬登消去法也可以解一次方程組,但是步驟數量比較多。

主要用途是求反矩陣。

求反矩陣 利用「高斯喬登消去法」。

doublematrix[10][10*2]; //參數化的矩陣 boolgauss_jordan_elimination() { //填好參數化的部分 for(inti=0;i<10;++i) for(intj=0;j<10;++j) matrix[i][10+j]=0; for(inti=0;i<10;++i) matrix[i][10+i]=1; //開始進行高斯喬登消去法 //內容幾乎與高斯消去法相同 for(inti=0;i<10;++i) { if(matrix[i][i]==0) for(intj=i+1;j<10;++j) if(matrix[j][i]!=0) { for(intk=i;k<10*2;++k) swap(matrix[i][k],matrix[j][k]); break; } //反矩陣不存在。

if(matrix[i][i]==0)returnfalse; doublet=matrix[i][i]; for(intk=i;k<10*2;++k) matrix[i][k]/=t; //消去時,所有橫條通通消去。

for(intj=0;j<10;++j) if(i!=j&&matrix[j][i]!=0) { doublet=matrix[j][i]; for(intk=i;k<10*2;++k) matrix[j][k]-=matrix[i][k]*t; } } returntrue; } 求determinant 利用「高斯消去法」,對角線不化成一,保留原有數字。

上三角矩陣,對角線元素的乘積,便是determinant。

如果矩陣裡都是整數,那麼determinant也是整數。

想避免浮點數誤差,可以使用輾轉相除法進行消去。

時間複雜度O(N³logC),C是絕對值最大的首項係數。

intmatrix[10][10]; voidrowgcd(int*a,int*b,inti) { if(abs(a[i]){x=(1-3y)/4 {2x+5y=2{y=(2-2x)/5 [x₀]=[0]隨便設定一解,作為初始值 [y₀][0] [x₁]=[(1-3y₀)/4] [y₁][(2-2x₀)/5] [x₂]=[(1-3y₁)/4] [y₂][(2-2x₁)/5] 三維: [43-1][x][1] [251][y]=[2] [-2-26][z][3] {4x+3y-z=1{x=(1-3y+z)/4 {2x+5y+z=2=>{y=(2-2x-z)/5 {-2x-2y+6z=3{z=(3+2x+2y)/6 [x₀][0] [y₀]=[0]隨便設定一解,作為初始值 [z₀][0] [x₁][(1-3y₀+z₀)/4] [y₁]=[(2-2x₀-z₀)/5] [z₁][(3+2x₀+2y₀)/6] 任意維度: Ax=b (D+L+U)x=bD是對角線、L是嚴格下三角、U是嚴格上三角 Dx=b-(L+U)x x=D⁻¹[b-(L+U)x] x=D⁻¹b-D⁻¹(L+U)x 時間複雜度O(N²T),N是方陣維度,T是遞推次數。

高斯消去法直接得到正解。

鬆弛法逐步逼近正解。

當b=0,則完全等價於D⁻¹(L+U)實施不動點遞推法。

判斷收斂:檢查D⁻¹(L+U)的特徵值的絕對值是否都小於1。

「嚴格對角優勢strictlydiagonallydominant」:每個橫條,對角線元素大於其餘元素總和;每個直條亦然。

滿足sdd,保證收斂;不滿足時,可能收斂、也可能不收斂。

foreachrow,|Aii|>∑|Aij| j≠i 演算法(Gauss–SeidelIteration) 每回合依序計算xyz,剛出爐的數字,馬上拿來使用,加快收斂速度。

[43-1][x][1] [251][y]=[2] [-2-26][z][3] {4x+3y-z=1{x=(1-3y+z)/4 {2x+5y+z=2=>{y=(2-2x-z)/5 {-2x-2y+6z=3{z=(3+2x+2y)/6 [x₀][0] [y₀]=[0]隨便設定一個初始值 [z₀][0] [x₁][(1-3y₀+z₀)/4]依序計算x₁、y₁、z₁, [y₁]=[(2-2x₁-z₀)/5]剛出爐的數字,馬上拿來使用, [z₁][(3+2x₁+2y₁)/6]加快收斂速度。

xₖ₊₁=D⁻¹(b-Uxₖ-Lxₖ₊₁) 演算法(SuccessiveOver-relaxation) 原數值、新數值,以固定比例混合。

可令原數值權重小於零、新數值權重大於一,硬是催出收斂速度。

[x₁][(1-w)⋅x₀+w⋅(1-3y₀+z₀)/4] [y₁]=[(1-w)⋅y₀+w⋅(2-2x₁-z₀)/5] [z₁][(1-w)⋅z₀+w⋅(3+2x₁+2y₁)/6] LinearEquation:Projection LinearEquation與Geometry 一次方程式得視作幾何元件:點、線、面、……。

ContourPlot3D[1x+2y-5z==5,{x,-5,5},{y,-5,5},{z,-5,5},Boxed->False,Axes->False,Mesh->None] 一次方程組的解得視作一堆幾何元件的交集。

f:=1x+2y-5z-5;g:=2x+4y+6z-1;h:=3x+1y+7z-4;ContourPlot3D[{f==0,g==0,h==0},{x,-5,5},{y,-5,5},{z,-5,5},Boxed->False,Axes->False,Mesh->None,ContourStyle->Directive[Opacity[0.5]]] 演算法(Kaczmarz'sMethod) 隨便設定一解,依序投影到第一道等式、第二道等式、……,不斷循環,逐步逼近正解。

時間複雜度O(N²T),N是方陣維度,T是遞推次數。

無解時,最後形成無窮迴圈,稱作「極限環LimitCycle」。

https://books.google.com.tw/books?id=1PJ-WHepeBsC&pg=PA620 數學公式(Cramer'sRule) 兩線交點的演算法:求得平行四邊形的面積,以面積比例求得交點位置。

請見本站文件「Intersection」。

「克拉瑪公式」則是此演算法的高維度版本,形成了非常漂亮的公式解!求得超平行體的容積,以容積比例求得解。

linearequation: Ax=b solution: {x=det(Aˣ)/det(A) {y=det(Aʸ)/det(A) {z=det(Aᶻ)/det(A) unisolvence: Ax=bhasauniquesolutioniffdet(A)≠0 example: {1x+2y-5z=5[12-5][x][5] {2x+4y+6z=1--->[246][y]=[1] {3x+1y+7z=4[317][z][4] Axb _b_b_b [|5|2-5][1|5|-5][12|5|] Aˣ=[|1|46]Aʸ=[2|1|6]Aᶻ=[24|1|] [|4|17][3|4|7][31|4|] ‾‾‾ determinant是矩陣當中所有向量所構成的超平行體的容積。

時間複雜度等於N+1次determinant的時間複雜度,O(N⁴)。

Determinant determinant起初用來判定一個一次方程組是否有解、解是多少,因而稱作「決定因子」。

古人沒有意識到determinant是容積。

字面意義是「決定因子」,中文教科書卻譯作「行列式」。

真是異想天開的翻譯啊! http://mathworld.wolfram.com/DeterminantExpansionbyMinors.html 行列式的計算過程是:先刪除一橫行,接著分別刪除每一直行,形成N-1個(N-1)×(N-1)子矩陣,添上正負號。

原矩陣的行列式,等於這些子矩陣的行列式總和。

每個子矩陣各自遞迴下去,直到N=1。

1×1矩陣的行列式,等於矩陣元素。

時間複雜度O(N!)。

N=2or3的時候比較特別,可以直接累加所有「左上右下斜線」的乘積、累減「右上左下斜線」的乘積。

中學數學課程有教。

計算行列式,也可以使用高斯消去法,時間複雜度O(N³)。

不過與其採用高斯消去法求行列式、再用行列式解一次方程組,不如直接採用高斯消去法解一次方程組。

就當作是學個想法吧。

LinearEquation:Decomposition LinearEquation與Algebra 一次方程組可以寫成矩陣乘法的形式。

{1x+2y-5z=5[12-5][x][5] {2x+4y+6z=1--->[246][y]=[1] {3x+1y+7z=4[317][z][4] Axb 一次方程組得視作線性函數,解一次方程組得視作線性反函數。

-1 [12-5][x][5][x][12-5][5] [246][y]=[1]--->[y]=[246][1] [317][z][4][z][317][4] AxbxA⁻¹b 數學公式(InverseMatrix) 一旦求得反矩陣,即可輕鬆解一次方程組。

solveAx=b--->findA⁻¹,thenx=A⁻¹b 計算反矩陣,使用高斯喬登消去法,時間複雜度O(N³)。

不過與其採用高斯喬登消去法求反矩陣、再用反矩陣解一次方程組,不如直接採用高斯消去法解一次方程組。

就當作是學個想法吧。

數學公式(Eigendecomposition) 一旦求得特徵分解,即可輕鬆解一次方程組。

A=EΛE⁻¹ A⁻¹=EΛ⁻¹E⁻¹ x=A⁻¹b=EΛ⁻¹E⁻¹b 不過與其採用特徵分解求反矩陣、再用反矩陣解一次方程組,不如直接採用高斯消去法解一次方程組。

就當作是學個想法吧。

LinearEquation:RootFinding 演算法(Newton'sMethod) Ax=b的解,即是f(x)=Ax-b的根。

牛頓法。

x=x-Aᵀ⁻¹(Ax-b)。

光是求反矩陣就需時O(N³)。

無人使用。

不過與其求反矩陣、不斷遞推,不如直接採用高斯消去法。

就當作是學個想法吧。

演算法(RichardsonIteration) Ax=b的解,即是g(x)=Ax-b+x的不動點。

不動點遞推法。

可以添加權重α。

x=x+α(Ax-b)。

時間複雜度O(N²T),N是方陣維度,T是遞推次數。

不過與其求餘數、不斷遞推,不如直接採用JacobiIteration。

就當作是學個想法吧。

LinearEquation:Optimization 「一次函數求解」等於「二次函數求極值」 A必須是對稱正定矩陣,使得二次函數有唯一最小值。

minimizef(x)=1/2xᵀAx-bᵀx solvef′(x)=Ax-b=0 solveAx=b f(x)的最小值位置,即是f′(x)的根,即是Ax=b的解。

f(x)的最佳化演算法是「共軛梯度法」。

優於高斯消去法。

時間複雜度O(N²T),N是方陣維度,T是遞推次數。

「矩陣求解」化作「對稱正定矩陣求解」 當A不是對稱正定矩陣,那麼等號兩邊同時乘上Aᵀ,得到對稱半正定矩陣AᵀA。

當A有唯一解,則得到對稱正定矩陣AᵀA。

solveAx=b(ifAhasuniquesolution) --->solveAᵀAx=Aᵀb(AᵀAissymmetricpositivedefinite) --->solveA'x=b'(uniquesolution) solveAx=b(ifAhasnosolution) --->min‖Ax-b‖²(leastsquares) --->solveAᵀAx=Aᵀb(normalequation) --->solveA'x=b'(leastsquaressolution) 不過與其變成對稱正定矩陣、再用共軛梯度法解一次方程組,不如直接採用高斯消去法解一次方程組。

就當作是學個想法吧。

LinearLeastSquares LinearLeastSquares 唯一解是稀奇的,無解、多解是普遍的。

無解、多解時,改為找到平方誤差最小的解。

nosolution:無解。

改求‖Ax-b‖²最小的解。

infinitelymanysolutions:多解。

改求‖x‖²最小的解。

uniquesolution:唯一解。

求Ax=b的解。

min‖Ax-b‖²:方程組每一道等式,求得等號左右兩邊的差的平方;累計所有等式,總和越小越好。

min‖x‖²:解的每一項的平方,總和越小越好。

Least意指「盡量小」,Squares意指「平方和」。

平方誤差比起絕對值誤差,有三個好處:一、讓每道等式的誤差保持均勻,不會有某道等式誤差特別高。

二、「一次微分等於零」容易推導數學公式。

三、誤差函數是開口向上的拋物線函數,有唯一最小值,沒有鞍點,容易最佳化。

平方誤差,誤差高低可以拿來比較,適合成為一個參考指標。

NoSolution/InfinitelyManySolutions 請見「Rouché-CapelliTheorem」。

矩陣的rank、column,得以區分無解、多解。

rank:消去冗餘的等式。

column:直條數量、變數數量。

nosolution:rank(A)≠rank([A|b]) infinitelymanysolutions:rank(A)=rank([A|b])≠column(A) uniquesolution:rank(A)=rank([A|b])=column(A) OverdeterminedSystem/UnderdeterminedSystem [XX][XXX] [XX][XXX][XXX] [XX][XXX][XXX] thinfatsquare overdeterminedsystem(thinmatrix):row(A)>column(A) underdeterminedsystem(fatmatrix):row(A)findA⁺,thenx=A⁺b LinearLeastSquares:Decomposition 三種數學公式 solveoverdeterminedsystemAx=b--->min‖Ax-b‖² x=(AᵀA)⁻¹Aᵀb(AᵀAx=Aᵀb)NormalEquation x=R⁻¹Qb(A=QR)QRDecomposition x=VΣ⁻¹Uᵀb(A=UΣVᵀ)SingularValueDecomposition solveunderdeterminedsystemAx=b--->min‖x‖² x=Aᵀ(AAᵀ)⁻¹bNormalEquation x=Q(Rᵀ)⁻¹b(Aᵀ=QR)QRDecomposition x=UΣ⁻¹Vᵀb(Aᵀ=UΣVᵀ)SingularValueDecomposition https://eigen.tuxfamily.org/dox-devel/group__LeastSquares.html 數學公式(NormalEquation) http://people.csail.mit.edu/bkph/articles/Pseudo_Inverse.pdf 線性代數經典公式!視作最佳化問題,以微分求極值。

「一次微分等於零」的地方是極值、鞍點。

因為平方誤差是開口向上的拋物面,所以「一次微分等於零」的地方必是最小值。

以下只證明無解的情況。

時間複雜度O(N³)。

solveAx=b min‖Ax-b‖² d/dx‖Ax-b‖²=0「一次微分等於零」的地方是極值、鞍點 [d/dx(Ax-b)][2(Ax-b)]=0微分連鎖律 Aᵀ[2(Ax-b)]=0微分 AᵀAx=Aᵀb同除以2、展開、移項 x=(AᵀA)⁻¹Aᵀb移項。

注意到A的向量們必須線性獨立! 注意到最後一步,A的向量們必須線性獨立(事先清除冗餘的、無意義的變數),AᵀA才有反矩陣。

結果宛如向量投影公式:b投影到A。

Aᵀbdot(A,b) x=(AᵀA)⁻¹Aᵀb=―――=――――――――=projAb AᵀAdot(A,A) 平方誤差盡量小=垂直投影!分析與幾何兩大領域打通了! solveAx=b --->min‖Ax-b‖² --->2Aᵀ(Ax-b)=0 --->x=projAb 數學公式(QRDecompostion) http://www.cs.cornell.edu/courses/cs322/2007sp/notes/qr.pdf 以下只證明無解的情況。

A=QR,正規正交矩陣Q不影響最小值,最小值取決於零餘部分R。

至於多解的情況,改為分解A的轉置矩陣Aᵀ=QR。

時間複雜度O(N³)。

但是計算量比NormalEquation少。

solveAx=b min‖Ax-b‖² min‖Qᵀ(Ax-b)‖²正規正交矩陣,變換後長度不變 min‖QᵀAx-Qᵀb‖²展開 min‖Rx-Qᵀb‖²QᵀA=QᵀQR=R min‖[R₁x-Q₁ᵀb]‖²R=[R₁]區分出零,讓R₁是方陣 ‖[0-Q₂ᵀb]‖[0]區分上段和下段 solveR₁x-Q₁ᵀb=0此式有唯一解,可為零(因此最小值是‖Q₂ᵀb‖²) R₁x=Q₁ᵀb移項 x=R₁⁻¹Q₁ᵀb移項 數學公式(SingularValueDecompostion) 以下只證明無解的情況。

證明手法如出一轍。

至於多解的情況,改為分解A的轉置矩陣Aᵀ=UΣVᵀ。

時間複雜度O(N³)。

我不確定實務上是否比較快。

solveAx=b min‖Ax-b‖² min‖Uᵀ(Ax-b)‖²正規正交矩陣,變換後長度不變 min‖UᵀAx-Uᵀb‖²展開 min‖ΣVᵀx-Uᵀb‖²UᵀA=UᵀUΣVᵀ=ΣVᵀ solveΣVᵀx-Uᵀb=0此式有唯一解,可為零 ΣVᵀx=Uᵀb移項 x=VΣ⁻¹Uᵀb移項 LinearLeastSquares:Optimization TikhonovRegularization 一次方程組,無解、多解時,改為最佳化問題,以得到唯一解。

solveAx=b--->min‖Ax-b‖²[overdeterminedsystem] solveAx=b--->min‖x‖²[underdeterminedsystem] 甚至利用Regularization,追加其他最佳化目標。

solveAx=b--->min‖Ax-b‖²+αf(x)(α≥0) solveAx=b--->min‖x‖²+αf(x)(α≥0) 一次方程組,有許多式子和變數。

可能有其中一群變數與式子構成無解、另一群構成唯一解、剩下一群構成多解。

更有甚者,切割一些群結果無解變多解、整併某些群結果多解變無解。

無法釐清是無解、多解的時候,那就兩個一起上吧。

solveAx=b--->min‖Ax-b‖²+α‖x‖²(α≥0) d/dx[‖Ax-b‖²+α‖x‖²]=0「一次微分等於零」的地方是極值、鞍點 二次函數、恆正,必得最小值 2AᵀAx-2Aᵀb+2αx=0展開 (AᵀA+αI)x=Aᵀb移項,左式即是AᵀA的對角線加上α 左式是實數對稱正定矩陣,有唯一解。

時間複雜度O(N³)。

HomogeneousLinearEquation 討論特例b=0的情況。

當b=0,則x=0,缺乏討論意義。

於是添加限制「x長度(的平方)為1」,增進討論意義。

solveAx=0--->min‖Ax‖²subjectto‖x‖²=1 min‖Ax‖²-λ(‖x‖²-1)Lagrangemultiplier ∂/∂x[‖Ax‖²-λ(‖x‖²-1)]=0「一次微分等於零」的地方是極值、鞍點 二次函數,必得極值 2AᵀAx-2λx=0展開 AᵀAx=λx移項,此即特徵向量的格式 答案是AᵀA的最小的特徵值的特徵向量! AᵀA是對稱半正定矩陣,特徵值即是奇異值,特徵向量即是奇異向量。

AᵀA的特徵值即是A的奇異值,AᵀA的特徵向量即是A的右奇異向量。

LinearInequality SystemofLinearInequalities 「一次不等式組」。

許多道一次不等式同時成立。

幾何意義是半空間交集,所有解形成一個凸多胞形,也可能形成開放區間、退化、空集合。

請見本站文件「Half-plane」。

目前沒有演算法。

大家更傾向討論「LinearProgramming」。

有人適度乘上負號,調整成Ax>b的格式,套用高斯消去法,但是不知道正不正確。



請為這篇文章評分?