2010年3月8日 星期一

高斯消去法

最近在看數值分析的書籍時提到求線性方程式解時可以分為兩種方式

  • Direct Method

  • Iterative Method


Direct Method 運用給定的步驟下求得結果;而 Iterative Method則是未知的,它的結果取決於它收斂的速度

底下為針對Direct Method,撰寫關於 高斯消去法 (Gauss Elimination) 求解的程式,

public double[][] GaussElimination() {
double[][] mtr = new double[3][]{
new double[3]{2,1,-1},
new double[3]{-3,-1,2},
new double[3]{-2,1,2}
};
double[][] b = new double[3][]{
new double[1]{8},
new double[1]{-11},
new double[1]{-3}
};
double factor;
for (int i = 0; i < mtr.GetLength(0); i++)
{
if (mtr[i][i] == 0)
throw new InvalidOperationException("無法產出");
for (int j = i+1; j < mtr.GetLength(0); j++)
{
factor = (mtr[j][i] / mtr[i][i]);
b[j][0] -= (b[i][0] * factor);
for (int k = i; k < mtr[i].GetLength(0); k++)
{
mtr[j][k] = mtr[j][k] - (mtr[i][k]) * factor;
}
}
}
return mtr;
}

內容中的數值出處來自於維基百科
有興趣的人可以去該處看看詳細解說
在這份程式碼中並未實作 Pivoting 的解法,在使用時如果遇到矩陣有 0 的消除項需特別留意!

沒有留言:

張貼留言