解线性方程组最基础的方法就是使用克拉默法则,需要注意的是,该方程组必须是线性方程组。
假设有方程组如下:
{ a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n = b 2 ⋯ ⋯ ⋯ a n 1 x 1 + a n 2 x 2 + ⋯ + a n n x n = b n \begin{cases} a_{11}x_1+a_{12}x_2+\cdots+a_{1n}x_n=b_1\\ a_{21}x_1+a_{22}x_2+\cdots+a_{2n}x_n=b_2\\ \cdots \qquad \qquad\cdots \qquad \qquad \cdots \\ a_{n1}x_1+a_{n2}x_2+\cdots+a_{nn}x_n=b_n\\ \end{cases} ⎩ ⎨ ⎧a11x1+a12x2+⋯+a1nxn=b1a21x1+a22x2+⋯+a2nxn=b2⋯⋯⋯an1x1+an2x2+⋯+annxn=bn
将其转换为矩阵形式
A x ⃗ = b ⃗ A\vec{x}=\vec{b} Ax=b
[ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ] [ x 1 x 2 ⋮ x n ] = [ b 1 b 2 ⋮ b n ] \begin{bmatrix} {a_{11}}&{a_{12}}&{\cdots}&{a_{1n}}\\ {a_{21}}&{a_{22}}&{\cdots}&{a_{2n}}\\ {\vdots}&{\vdots}&{\ddots}&{\vdots}\\ {a_{m1}}&{a_{m2}}&{\cdots}&{a_{mn}}\\ \end{bmatrix} \begin{bmatrix} {x_{1}}\\ {x_{2}}\\ {\vdots}\\ {x_{n}}\\ \end{bmatrix}= \begin{bmatrix} {b_{1}}\\ {b_{2}}\\ {\vdots}\\ {b_n} \end{bmatrix} a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn x1x2⋮xn = b1b2⋮bn
根据克拉默法则有:
x i = ∣ A i ∣ ∣ A ∣ x_i=\frac{|A_i|}{|A|} xi=∣A∣∣Ai∣
A i = [ a 11 ⋯ a 1 i − 1 b 1 a 1 i + 1 ⋯ a 1 n a 21 ⋯ a 2 i − 1 b 2 a 2 i + 1 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 ⋯ a n i − 1 b n a n i + 1 ⋯ a n n ] A_i= \begin{bmatrix} {a_{11}}&{\cdots}&{a_{1i-1}}&{b1}&{a_{1i+1}}&{\cdots}&{a_{1n}}\\ {a_{21}}&{\cdots}&{a_{2i-1}}&{b2}&{a_{2i+1}}&{\cdots}&{a_{2n}}\\ {\vdots}&{\vdots}&{\ddots}&{\vdots}\\ {a_{n1}}&{\cdots}&{a_{ni-1}}&{bn}&{a_{ni+1}}&{\cdots}&{a_{nn}}\\ \end{bmatrix} Ai= a11a21⋮an1⋯⋯⋮⋯a1i−1a2i−1⋱ani−1b1b2⋮bna1i+1a2i+1ani+1⋯⋯⋯a1na2nann
实现方法可以参考行列式求值(C++)、插值(一)——多项式插值(C++)
//克拉默法则求解线性方程组
/*
5x1+2x2-2x3=1
x1+4x2+x3=2
x1-2x2+4x3=-1
*/
#include
#include
//使用代数余子式进行求解
double determinant_value(double **D,int n)
{
if(n==1)
{
return D[0][0];
}
else if(n==0){
throw "error: determinant is empty";
}
char flag = 1;//符号位
double D_value = 0.0;
double **D_temp = new double*[n];
for (int i = 0; i < n;i++)
{
D_temp [i]= new double[n];
for(int j=0;j>n;
double *x=new double[n];
double **A = new double *[n];
std::cout<<"请输入矩阵A的元素:"<>A[i][j];
}
}
double *b = new double [n];
std::cout<<"请输入矩阵b的元素:"<>b[i];
}
Kramer(A, b, x, n);
for (int i = 0; i < n; i++)
{
std::cout<<"x"<
matlab结果如下:
此方法虽然可以求解,但是存在一个问题,就是当矩阵维度较大时,程序运行时间会很长,所以在一些精度要求不高的地方,不需要使用此方法。