【线性代数|C++】克拉默法则

一、定义(克拉默法则)

  • 设含有 n n n个未知数 x 1 , x 2 , ⋯   , x n x_1,x_2,\cdots ,x_n x1,x2,,xn n n n个线性方程的方程组 { 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 , (1) \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 \cdots \cdots \\ a_{n1}x_1+a_{n2}x_2+\cdots +a_{nn}x_n=b_n\end{cases}\tag{1} , a11x1+a12x2++a1nxn=b1a21x1+a22x2++a2nxn=b2⋯⋯⋯an1x1+an2x2++annxn=bn,(1)如果线性方程组(1)的系数行列式不等于零,即 D = ∣ a 11 ⋯ a 1 n ⋮ ⋮ a n 1 ⋯ a n n ∣ ≠ 0 , D=\begin{vmatrix}a_{11}&\cdots &a_{1n} \\ \vdots && \vdots \\a_{n1} & \cdots & a_{nn} \end{vmatrix} \neq 0, D= a11an1a1nann =0,那么,方程组(1)有唯一解 x 1 = D 1 D , x 2 = D 2 D , ⋯   , x n = D n D , x_1=\frac{D_1}{D},x_2=\frac{D_2}{D},\cdots ,x_n=\frac{D_n}{D}, x1=DD1,x2=DD2,,xn=DDn,其中 D j ( j = 1 , 2 , ⋯   , n ) D_j(j=1,2,\cdots ,n) Dj(j=1,2,,n)是把系数行列式D中的第 j j j列的元素用方程组右端的常数项代替后所得到的 n n n阶行列式,即 D j = ∣ a 11 a 1 , j − 1 b 1 a 1 , j + 1 ⋯ a 1 n ⋮ ⋮ ⋮ ⋮ ⋮ a n 1 a n , j − 1 b n a n , j + 1 ⋯ a n n ∣ . D_j=\begin{vmatrix} a_{11}&a_{1,j-1}&b_1&a_{1,j+1}&\cdots & a_{1n} \\ \vdots & \vdots & \vdots &\vdots &&\vdots \\ a_{n1}&a_{n,j-1}&b_n & a_{n,j+1}&\cdots &a_{nn}\end{vmatrix}. Dj= a11an1a1,j1an,j1b1bna1,j+1an,j+1a1nann .

二、定理4

  • 如果线性方程组(1)的系数行列式 D ≠ 0 D\neq 0 D=0,则(1)一定有解,且解是惟一的.

三、定理4’

  • 如果线性方程组(1)无解或有两个不同的解,则它的系数行列式必为零.

四、定义(非齐次线性方程组、齐次线性方程组)

  • 线性方程组(1)右端的常数项 b 1 , b 2 , ⋯   , b n b_1,b_2,\cdots ,b_n b1,b2,,bn不全为零时,线性方程组(1)叫做非齐次线性方程组.
  • b 1 , b 2 , ⋯   , b n b_1,b_2,\cdots ,b_n b1,b2,,bn全为零时,线性方程组(1)叫做齐次线性方程组.

五、定理5

  • 如果齐次线性方程组(1)的系数行列式 D ≠ 0 D\neq 0 D=0,则齐次线性方程组(1)没有非零解.

六、定理5’

  • 如果齐次线性方程组(1)有非零解,则它的系数行列式必为零.

七、C++代码实现

  • 解线性方程组 { 2 x 1 +      x 2 − 5 x 3 + x 4 = 8      x 1 − 3 x 2    − 6 x 4 = 9        2 x 2 −    x 3 + 2 x 4 = − 5      x 1 + 4 x 2 − 7 x 3 + 6 x 4 = 0 \begin{cases}2x_1+\;\;x_2-5x_3+x_4=8\\ \;\; x_1-3x_2 \quad \quad \; -6x_4=9 \\ \quad \quad \;\;\; 2x_2-\;x_3+2x_4=-5\\ \;\;x_1+4x_2-7x_3+6x_4=0\end{cases} 2x1+x25x3+x4=8x13x26x4=92x2x3+2x4=5x1+4x27x3+6x4=0
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

//行列式求值函数
int GetDetVal(const vector<vector<int>> &vvDetInput)
{
    int iDetVal;

    //行列式空白时,退出
    if(0 == vvDetInput.size())
        return 0;
    
    //当行列式仅有1个元素(阶数为1)时,该值就是行列式的值
    if(1 == vvDetInput.size() && 1 == vvDetInput[0].size())
    {
        return vvDetInput[0][0];
    }
    //当行列式元素阶数大于1时,将行列式按第1行展开
    else
    {
        //先求行列式的余子式
        vector<vector<int>> vvCofactor(vvDetInput);//1.复制输入行列式
        vvCofactor.erase(vvCofactor.cbegin());//2.删除第1行
        for(unsigned int i = 0; i < vvCofactor[0].size(); i++)//3.逐列删除
        {            
            for(unsigned int j = 0; j < vvCofactor.size(); j++)
            {
                vvCofactor[j].erase(vvCofactor[j].cbegin() + i);
            }
            //对第1行各元素预期代数余子式的成绩进行累加,得到行列式的值。当行列式阶数大于1时,递归调用本函数
            iDetVal += (vvDetInput[0][i] * pow(-1, i) * GetDetVal(vvCofactor));
            vvCofactor.clear();
            vvCofactor = vvDetInput;
            vvCofactor.erase(vvCofactor.cbegin());//2.删除第1行
        }
    }
    return iDetVal;
}

//主函数
int main() {
    //方程组系数行列式
    vector<vector<int>> vvCoefficients{{2,1,-5,1},
                                      {1,-3,0,-6},
                                      {0,2,-1,2},
                                      {1,4,-7,6}};
    //方程组常数项
    vector<int> vConstants{8,9,-5,0};

    //克拉默法则中分母D的值
    int D = GetDetVal(vvCoefficients);

    //求克拉默法则中分子的值,并代入公式求方程的解
    for(unsigned int i = 0; i < vvCoefficients[0].size(); i++)
    {
        vector<vector<int>> vvDet0(vvCoefficients);
        for(unsigned int j = 0; j < vvCoefficients.size(); j++)
        {
            vvDet0[j][i] = vConstants[j];
        }
         cout << "x" << i + 1 << " = " << GetDetVal(vvDet0) / D << endl;
    }

    return 0;
}

在这里插入图片描述


引用文献:《工程数学 线性代数(第五版)》同济大学数学系编,高等教育出版社

  • 42
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测绘工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值