題目大意
求解線性方程組,比如:
的解。
解題思路
使用高斯消元法,步驟模擬如下。
(1) 合二爲一: 將係數矩陣與結果向量合併得到:
(2) 以如下策略消元, (假設有個變元):
- 當消去第個元時,選取大於等於行中第個變元係數絕對值最大的一行作爲基準。如果最大絕對值爲0,則無解或有無窮解.
- 將第行與基準行交換。
- 將第行歸一化。
- 使用歸一化後的第行按比例關係消去其他行的第個變元的係數。
- 加一,重複上述過程直到全部變元消去。
(3)模擬如下:
代碼
#include<iostream>
#include<vector>
using namespace std;
typedef vector<double> vec;
typedef vector<vec> mat;
double abs(double x)
{
if(x < 0)
return -x;
return x;
}
vec gauss_jordan(const mat &A, const vec &b)
{
int n = A.size();
mat B(n, vec(n+1));
// (1) -----------合併-------------
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
B[i][j] = A[i][j];
for(int i=0; i<n; i++)
B[i][n] = b[i];
// --------------------------------
for(int i=0; i<n; i++)
{
int base_index = i;
// 前i行已經固定,因此從j>=i行中選
for(int j=i+1; j<n; j++)
if(abs(B[j][i]) > abs(B[base_index][i]))
base_index = j;
// 無解或無窮解
if(abs(B[base_index][i]) < 10e-4) return vec();
swap(B[i], B[base_index]);
// -----------規範化-------------
int tmp = B[i][i];
for(int j=i; j<n+1; j++)
B[i][j] /= tmp;
//----------------------------------
// 消去其他行
for(int j=0; j<n; j++)
{
if(j!=i)
{
int tmp = B[j][i];
for(int k=i; k<n+1; k++)
B[j][k] -= tmp * B[i][k];
}
}
}
vec x(n);
for(int i=0; i<n; i++)
x[i] = B[i][n];
return x;
}
int main()
{
mat A(3, vec(3));
vec b(3);
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
cin >> A[i][j];
for(int i=0; i<3; i++)
cin >> b[i];
vec x(3);
x = gauss_jordan(A, b);
for(int i=0; i<3; i++)
cout << x[i] << endl;
return 0;
}