高斯-約旦消元法
此演算法是基於高斯消元的基礎上改進而成的,唯一不同之處是多進行了幾次矩陣變換使得化為行最簡型矩陣。相比於高斯消元法此方法效率較低,但是不需要回帶求解
此演算法的過程大概為:首先確定每個a[i
][i]
a[i][i]
a[i][i
]不為0
00(如果為0
00就和下面的行替換),接著將每個a[i
][i]
a[i][i]
a[i][i
]通過行變換化為1
11(該行都除以a[i
][i]
a[i][i]
a[i][i
]),然後通過行變換將每列除了a[i
][i]
a[i][i]
a[i][i
]以外的都消成0
00,重複n
nn次即可
如下是乙個求解過程的示例:
首先最簡單的操作是輸入增廣矩陣:
scanf
("%d"
,&n)
;for
(int i=
1;i<=n;i++
)for
(int j=
1;j<=n+
1;j++
)scanf
("%lf"
,&a[i]
[j])
;
接下來開始消元的第一步:判斷是否有解
我們每次考慮a[i
][i]
a[i][i]
a[i][i
],先看該列的元素是否全為0
00。第二次以後時我們都沒有考慮該列上面得到元素,因為他們已經可以被化簡為000。
for
(int i=
1;i<=n;i++
)
消元的第二步:找到該列第乙個非零元素後將該行和第i
ii行元素作行交換
我們上面判斷是否有解實際上是在找第i
ii列第乙個非零元素
//將第tmp行第i列元素不為0的那一行與當前第i行交換
for(
int j=
1;j<=n+
1;j++
)swap
(a[i]
[j],a[tmp]
[j])
;
消元的第三步:將第i
ii行第i
ii列的元素化為111
方法是當前行的所有元素都除以a[i
][i]
a[i][i]
a[i][i
]
double p=a[i]
[i];
for(
int j=
1;j<=n+
1;j++
) a[i]
[j]=a[i]
[j]/p;
消元的第四步:將第i
ii列除了第i
ii行的元素全消成000
方法是第j
jj行每個元素a[j
][k]
a[j][k]
a[j][k
]都減去a[j
][k]
∗a[i
][k]
a[j][k]*a[i][k]
a[j][k
]∗a[
i][k
]
for
(int j=
1;j<=n;j++
)}
其實上面四步寫在乙個for
forfo
r迴圈即可,因此得到該函式:
const
double esp=
1e-8
;double a[
1005][
1005];
bool gauss
(int n)}}
return
true
;}
如果有多個解的情況呢?如果某變數有多個解,那麼該行的n+1
n+1n+
1個數一定都等於0
因為每次我們都先保證前面的a[i][i]
a[i][i]
a[i][i
]都一定要為1
11,因此一定在最後幾個a[i
][i]
a[i][i]
a[i][i
]。看題目要求我們將通解設定為某些常量,而且還需要注意上面有不會完全消為0
00的項,那麼我們就需要代入通解求解。
下面是存在乙個通解並且將其設定為1的例子:
//否則肯定最後乙個是不定解,由於求最小的整數解那麼即為1
x[col]=1
;for
(int i=
1;ibool gauss
(int n)}}
solve()
;return
true
;}
高斯 約旦消元法
學了將近兩個晚上。突然看懂時感覺自己是個 寫個部落格記一下吧。模板 洛谷p3389 模板 高斯消元法 有 n 個形如 a 1x 1 a 2x 2 cdots a nx n b 的方程。解方程組。有唯一解則將其求出,否則輸出no solution。把方程組用矩陣形式寫出來 left begin a a...
數學 高斯 約旦消元法
給定 n 元一次方程組 begin a x 1 a x 2 cdots a x n b 1 a x 1 a x 2 cdots a x n b 2 cdots a x 1 a x 2 cdots a x n b n end 請求出方程組的解的情況 對於這樣的問題,我們可以使用高斯消元法進行求解,當然...
高斯 約旦消元法 理解
高斯消元是一種解方程的很巧妙的方法,核心是把方程轉換成矩陣形式,然後再通過加減消元,求出值後再回帶,就解出了這個方程,這裡我就不贅述了。我一般用高斯 約旦消元法,這種方法是直接轉換成單位矩陣求解,減少回帶次數,提高精確度,實現方式如下 下方是乙個方程 把它轉換成矩陣形式就是 我們可以這樣對其進行變換...