解线性方程组(一)——克拉默法则求解(C++)

这篇具有很好参考价值的文章主要介绍了解线性方程组(一)——克拉默法则求解(C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

克拉默法则

解线性方程组最基础的方法就是使用克拉默法则,需要注意的是,该方程组必须是线性方程组。
假设有方程组如下:
{ 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=b2an1x1+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} a11a21am1a12a22am2a1na2namn x1x2xn = b1b2bn
根据克拉默法则有:
x i = ∣ A i ∣ ∣ A ∣ x_i=\frac{|A_i|}{|A|} xi=AAi
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= a11a21an1a1i1a2i1ani1b1b2bna1i+1a2i+1ani+1a1na2nann

代码

实现方法可以参考行列式求值(C++)、插值(一)——多项式插值(C++)

//克拉默法则求解线性方程组
/*
5x1+2x2-2x3=1
x1+4x2+x3=2
x1-2x2+4x3=-1
*/
#include<iostream>
#include<cmath>
//使用代数余子式进行求解
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;j++)
        {
            D_temp[i][j]=D[i][j];
        }
    }
    // 转为上三角
    for (int i = 0; i < n; i++)
    {
        if (D_temp[i][i] == 0)
        {
            int j = i + 1;
            // 将主对角线上的值转为非0值
            for (; j < n; j++)
            {
                if (D_temp[j][i] != 0)
                {
                    double temp;
                    for (int k = 0; k < n; k++)
                    {
                        temp = D_temp[i][k];
                        D_temp[i][k] = D_temp[j][k];
                        D_temp[j][k] = temp; // 交换两行
                    }
                    flag = -flag;
                    break;
                }
            }
            if (j == n)
            {
                return D_value;
            }
        }
        // 将主对角线下面的值转为0
        for (int j = i + 1; j < n; j++)
        {
            double temp = D_temp[j][i] / D_temp[i][i];
            for (int k = i; k < n; k++)
            {
                D_temp[j][k] -= temp * D_temp[i][k];
            }
        }
    }
    // 计算行列式的值
    D_value = 1.0;
    for (int i = 0; i < n; i++)
    {
        D_value *= D_temp[i][i];
    }
    D_value*=flag;
    for (int i = 0; i < n;i++)
    {
        delete[] D_temp[i];
    }
    delete [] D_temp;
    return D_value;
}
//克拉默法则求解线性方程组
void Kramer(double **A,double *b,double *x,int n)
{
    double **A_i=new double*[n];
    double A_value=determinant_value(A,n);
    if(A_value==0)
    {
        std::cout<<"该方程组不是线性方程组"<<std::endl;
        exit(0);
    }
    for (int i = 0; i < n; i++)
    {
        A_i[i] = new double[n];
        for (int j = 1; j < n; j++)
        {
            A_i[i][j] = A[i][j];
        }
    }
    //下面是为了求D_i,每次只需要修改两列数据
    for (int i = 0; i < n;i++)
    {
        if(i==0)
        {
            for(int j = 0;j < n;j++)
            {
                A_i[j][0]=b[j];
            }
        }
        else{
            for(int i2 = 0;i2 < n;i2++)
            {
                A_i[i2][i-1]=A[i2][i-1];
                A_i[i2][i]=b[i2];
            }
        }
        // for(int i2 = 0;i2 < n;i2++)
        // {
        //     for (int j2 = 0;j2 < n;j2++)
        //     {
        //         std::cout<<A_i[i2][j2]<<" ";
        //     }
        //     std::cout<<std::endl;
        // }
        //求多项式系数
        x[i] = determinant_value(A_i, n) / A_value;
    }
    for (int i = 0; i < n; i++)
    {
        delete[] A_i[i];
    }
    delete[] A_i;
}
int main()
{
    int n;//矩阵维度
    std::cout<<"请输入矩阵维度:";
    std::cin>>n;
    double *x=new double[n];
    double **A = new double *[n];
    std::cout<<"请输入矩阵A的元素:"<<std::endl;
    for(int i = 0;i < n;i++)
    {
        A[i] = new double [n];
        for(int j = 0;j < n;j++)
        {
            std::cin>>A[i][j];
        }
    }
    double *b = new double [n];
    std::cout<<"请输入矩阵b的元素:"<<std::endl;
    for(int i = 0;i < n;i++)
    {
        std::cin>>b[i];
    }
    Kramer(A, b, x, n);
    for (int i = 0; i < n; i++)
    {
        std::cout<<"x"<<i+1<<"="<<x[i]<<" ";
    }
    for (int i = 0; i < n; i++)
    {
        delete[] A[i];
    }
    delete[] A;
    delete [] b;
    delete[] x;
    return 0;
}

结果分析

运行结果如下:
解线性方程组(一)——克拉默法则求解(C++),计算方法,c++,线性代数

matlab结果如下:
解线性方程组(一)——克拉默法则求解(C++),计算方法,c++,线性代数
此方法虽然可以求解,但是存在一个问题,就是当矩阵维度较大时,程序运行时间会很长,所以在一些精度要求不高的地方,不需要使用此方法。文章来源地址https://www.toymoban.com/news/detail-830636.html

到了这里,关于解线性方程组(一)——克拉默法则求解(C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 克拉默法则证明(Cramer‘s Rule)

    若 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 begin{equation*} begin{cases} a_{11}x_{1} + a_ {12}x_{2} + ... + a_{1n}x_{n} = b_1 \\\\ a_{21}x_{1} + a_ {22}x_{2} + ... + a_{2n}x_{n} = b_

    2024年02月06日
    浏览(39)
  • PCL 使用克拉默法则进行三点定圆(二维)

    本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。    见:使用克拉默法则进行三点定圆(二维)

    2024年02月07日
    浏览(37)
  • MATLAB当中线性方程组、不定方程组、奇异方程组、超定方程组的介绍

    MATLAB绘图函数的相关介绍——海底测量、二维与三维图形绘制  MATLAB求函数极限的简单介绍 文章目录 一、线性方程组 1.1、线性方程组简介 1.2、矩阵的初等变换 1.3、MATLAB举例 二、对于MATLAB几个函数的解释 2.1、reff()函数 2.2、inv()函数 2.3、其他一些函数的说明 1. ones(n):返回一

    2024年02月07日
    浏览(31)
  • 【线性代数及其应用 —— 第一章 线性代数中的线性方程组】-1.线性方程组

    所有笔记请看: 博客学习目录_Howe_xixi的博客-CSDN博客 https://blog.csdn.net/weixin_44362628/article/details/126020573?spm=1001.2014.3001.5502 思维导图如下:  内容笔记如下:

    2024年02月06日
    浏览(50)
  • 线性方程组AX=b,AX=0以及非线性方程组的最小二乘解(解方程组->优化问题)

    超定方程组无解是因为方程组包含了过多的约束条件,无法满足所有的约束条件,在这种情况下,方程组的某些方程必然是矛盾的,也就是说,他们描述的条件是不兼容的,无法同时满足。 所以求解超定方程组其实是一个拟合问题,其基本思想是最小化所有方程的误差平方和

    2024年02月08日
    浏览(37)
  • 【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

    如果你进行的矩阵乘法涉及一个线性方程组 Ax = b,并且你乘以一个可逆矩阵 M,且产生新的方程组 M(Ax) = Mb,那么这两个系统是等价的;它们具有相同的解集。这是因为可逆矩阵的乘法可以视为一个可逆的线性变换,不会改变方程解的存在性或唯一性。 换句话说,如果你将原

    2024年02月03日
    浏览(47)
  • 【考研数学】线性代数第四章 —— 线性方程组(2,线性方程组的通解 | 理论延伸)

    承接前文,继续学习线性方程组的内容,从方程组的通解开始。 (1)基础解系 —— 设 r ( A ) = r n r(A)=rn r ( A ) = r n ,则 A X = 0 pmb{AX=0} A X = 0 所有解构成的解向量组的极大线性无关组称为方程组 A X = 0 pmb{AX=0} A X = 0 的一个基础解系。基础解系中所含有的线性无关的解向量的个

    2024年02月11日
    浏览(43)
  • 线性代数——线性方程组

    学习高等数学和线性代数需要的初等数学知识 线性代数——行列式 线性代数——矩阵 线性代数——向量 线性代数——线性方程组 线性代数——特征值和特征向量 线性代数——二次型 本文大部分内容皆来自李永乐老师考研教材和视频课。 方程组 { a 11 x 1 + a 12 x 2 + ⋯ + a 1

    2024年02月16日
    浏览(40)
  • 线性代数之线性方程组

    目录 文章目录 一、具体型方程组  1. 解线性方程组     1.1 齐次线性方程组          1.1.1 解向量及其性质          1.1.2基础解系         1.1.3齐次线性方程组有非零解的充要条件及通解  1.2 非齐次线性方程组            1.2.1克拉默法则         1.2.2几个相关说法的等

    2024年02月20日
    浏览(49)
  • 线性代数(三) 线性方程组

    如何利用行列式,矩阵求解线性方程组。 用矩阵方程表示 齐次线性方程组:Ax=0; 非齐次线性方程组:Ax=b. 可以理解 齐次线性方程组 是特殊的 非齐次线性方程组 如何判断线性方程组的解 其中R(A)表示矩阵A的秩 B表示A的增广矩阵 n表示末知数个数 增广矩阵 矩阵的秩 秩r= 未知

    2024年02月13日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包