- 定义
齐次线性方程组:等式右侧常数项全部为0
非齐次线性方程组: 等式右侧常数项不全部为0
2.齐次方程组的求解
将系数矩阵化为行阶梯形矩阵,记全为0的行数量为r=n-R(A)。
则非零行的首非零元所在列对应的就是约束变量, 其余变量即为自由变量。
将后r个自由变量未知数,每次只有一个取值为1 ,其余为0 ,然后每次分别带入方程计算,对应的形成r个解。这些r个解的线性组合即为基础解系。
3.非齐次方程组的求解
https://jingyan.baidu.com/article/2a138328e4d4bb074a134fcc.html
分为两步:1.计算特解。将增广矩阵化为行阶梯形矩阵,将r个未知数全部取值为0,得到一个特解。
2.计算对应的齐次方程组的基础解系。
4. 方程组有解的判断条件
齐次方程组:R(A)=n,只有唯一零解
R(A)<n,有无穷多个解。基础解系中含有的解数量为r=n-R(A)个
非齐次方程组:R(A)< R(B) ,无解
R(A)=R(B) ,有解。具体解的情况同齐次方程组。
程序实现:列主消元法
#include<iostream>
#include<cmath>
using namespace std;
const int n = 3;
//交换2个数的大小
template<class T>
void SWAP(T& a, T& b)
{
T c;
c = a;
a = b;
b = c;
}
//高斯列主元素消元法
void gaussin_L(double a[n][n], double b[n])
{
int i, j, k;
int col, row;
for (k = 0; k < n - 1; k++)
{
double ave = 0;
//找出消元列中最大的那个元素所在的位置
for (i = k; i < n ; i++)
if (fabs(a[i][k]) > ave)
{
ave = fabs(a[i][k]);
cout << "ave " << ave << endl;
row = i;
col = k;
}
//如果该对角线元素是0,同样不能用高斯消元法来求解
if (a[row][row] == 0)
{
cout << "can't solve" << endl;
return;
}
//将找出的行进行交换
if (k != row)
{
for (i = 0; i < n; i++)
{
SWAP(a[row][i], a[k][i]);
}
SWAP(b[k], b[row]);
}
//消元过程
double c[n];
for (j = k + 1; j < n; j++)
{
c[j] = a[j][k] / a[k][k];
cout << c[j] << endl;
}
for (i = k + 1; i < n; i++)
{
for (j = 1; j < n; j++)
{
a[i][j] = a[i][j] - c[i] * a[k][j];
}
b[i] = b[i] - c[i] * b[k];
}
}
double x[n];
x[n - 1] = b[n - 1] / a[n - 1][n - 1];
for (i = n - 2; i >= 0; i--)
{
double sum = 0;
for (j = i + 1; j < n; j++)
sum += a[i][j] * x[j];
x[i] = (b[i] - sum)/a[i][i];
}
//打印输出
for (i = 0; i < n ; i++)
cout << " x" << "[" << i << "]=" << x[i] << endl;
}
思考:列主消元法仅适用于系数矩阵是方阵,而且必须是满秩?
这个消元的过程不就是最简化行列式的过程吗
齐次坐标
就是增加一个维度。笛卡尔坐标系(x,y)对应的齐次坐标为(wx,wy,w)。可以对应无穷多个齐次坐标,其实就是一个投影的过程。