首页 > 其他分享 >「学习笔记」高斯消元

「学习笔记」高斯消元

时间:2023-06-13 15:44:14浏览次数:57  
标签:... 13 frac int begin 笔记 学习 aligned 高斯消

简单说:高斯消元就是我们初中学的解方程组时用的加减消元法和代入消元法,只是高斯这个人最后总结了一下

过程

给定方程组

\[\left \{ \begin{aligned} 3x + 2y + z = 10 \quad &(1)\\ 5x + y + 6z = 25 \quad &(2)\\ 2x + 3y + 4z = 20 \quad &(3)\\ \end{aligned} \right. \]

我们用 \((2)\) 式来消去 \(x\)

\[\begin{aligned} & 5x + y + 6z = 25\\ & 5x = 25 - y - 6z\\ & x = 5 - \frac{1}{5}y - \frac{6}{5}z \end{aligned} \]

代入得

\[\left \{ \begin{aligned} & 3(5 - \frac{1}{5}y - \frac{6}{5}z) + 2y + z = 10 \\ & 5x + y + 6z = 25 \quad (忽略)\\ & 2(5 - \frac{1}{5}y - \frac{6}{5}z) + 3y + 4z = 20 \end{aligned} \right. \]

\[\left \{ \begin{aligned} & \frac{7}{5}y - \frac{13}{5}z = -5 \quad &(1)\\ & \frac{13}{5}y + \frac{8}{5}z = 10 \quad &(2) \end{aligned} \right. \]

我们现在再用 \((2)\) 式来消去 \(y\) 得

\[\begin{aligned} & \frac{13}{5}y + \frac{8}{5}z = 10\\ & 13y + 8z = 50\\ & 13y = 50 - 8z\\ & y = \frac{50}{13} - \frac{8}{13} \end{aligned} \]

代入得

\[\left \{ \begin{aligned} & \frac{7}{5}(\frac{50}{13} - \frac{8}{13}) - \frac{13}{5}z = -5 \\ & \frac{13}{5}y + \frac{8}{5}z = 10 (忽略) \end{aligned} \right. \]

\[\begin{aligned} & \frac{45}{13}z = \frac{135}{13}\\ & z = 3 \end{aligned} \]

我们再将 \(z = 3\) 代会得 \(y = 2\),再带回得 \(x = 1\)

代码

这里有应对 doubleint 两种数据类型的代码。

应对 double 数据的

double a[N][N];
cin >> n;
for (int i = 1; i <= n; ++ i) {
    for (int j = 1; j <= n; ++ j) {
        cin >> a[i][j];
    }
    cin >> a[i][n + 1];
}
// a[1][1] * x1 + a[1][2] * x2 + ... + a[1][n] * xn = a[1][n + 1];
// a[2][1] * x1 + a[2][2] * x2 + ... + a[2][n] * xn = a[2][n + 1];
// ...
// a[n][1] * x1 + a[n][2] * x2 + ... + a[n][m] * xn = a[n][n + 1];

void gauss() {
    for (int i = 1; i <= n; ++ i) { // 现在要把 xi 从第 i + 1 个方程到第 n 个方程消掉
        for (int j = i; j <= n; ++ j) {
            if (fabs(a[j][i]) > fabs(a[i][i])) {
                for (int k = 1; k <= n + 1; ++ k) {
                    swap(a[i][k], a[j][k]);
                }
            }
        }
        for (int j = i + 1; j <= n; ++ j) { // 把 xi 从第 j 个方程消掉
            double ratio = a[j][i] / a[i][i];
            for (int k = 1; k <= n + 1; ++ k) {
                a[j][k] -= a[i][k] * ratio;
            }
        }
    }
    for (int i = n; i >= 1; -- i) { // 解 x[i] 的值
        for (int j = i + 1; j <= n; ++ j) {
            a[i][n + 1] -= a[i][j] * x[j];
        }
        x[i] = a[i][n + 1] / a[i][i];
    }
}

应对 int 数据的

int a[N][N];
cin >> n;
for (int i = 1; i <= n; ++ i) {
    for (int j = 1; j <= n; ++ j) {
        cin >> a[i][j];
    }
    cin >> a[i][n + 1];
}
// a[1][1] * x1 + a[1][2] * x2 + ... + a[1][n] * xn = a[1][n + 1];
// a[2][1] * x1 + a[2][2] * x2 + ... + a[2][n] * xn = a[2][n + 1];
// ...
// a[n][1] * x1 + a[n][2] * x2 + ... + a[n][m] * xn = a[n][n + 1];

void gauss() {
    for (int i = 1; i <= n; ++ i) { // 现在要把 xi 从第 i + 1 个方程到第 n 个方程消掉
        for (int j = i; j <= n; ++ j) {
            if (a[j][i] != 0) {
                for (int k = 1; k <= n + 1; ++ k) {
                    swap(a[i][k], a[j][k]);
                }
                break;
            }
        }
        for (int j = i + 1; j <= n; ++ j) { // 把 xi 从第 j 个方程消掉
            if (a[j][i] == 0)    continue;
            int l = a[i][i] / gcd(abs(a[i][i]), abs(a[j][i])) * a[j][i];
            int ratioi = l / a[i][i];
            int ratioj = l / a[j][i];
            for (int k = 1; k <= n + 1; ++ k) {
                a[j][k] = a[j][k] * ratioj - a[i][k] * ratioi;
            }
        }
    }
    for (int i = n; i >= 1; -- i) { // 解 x[i] 的值
        for (int j = i + 1; j <= n; ++ j) {
            a[i][n + 1] -= a[i][j] * x[j];
        }
        x[i] = a[i][n + 1] / a[i][i];
    }
}

标签:...,13,frac,int,begin,笔记,学习,aligned,高斯消
From: https://www.cnblogs.com/yifan0305/p/17051498.html

相关文章

  • 「学习笔记」严格次短路
    出题人说:“有最短路,还要有次短路。”于是,就有了次短路这个东西。与次小生成树一样,目前不知道有啥用。本文求的是严格次短路!变量n:点数;m:边数;e:vector存图;dis1:储存最短路;dis2:储存次短路。过程我们要利用dijkstra的贪心思想和松弛操作。dijkstra的贪心思想,就是用目前路......
  • mysql笔记
    1.mysql初始密码修改:进入mysql后,输入:ALTERUSERroot@localhostIDENTIFIEDBY'新密码';2.mysql打开命令:1.mysql-uroot-p,密码;2.mysql-uroot-p密码;3.显示所有数据库:showdatabases;;4.删除数据库:dropdatabase数据库名;;......
  • 强化学习驱动的低延迟视频传输
    随着视频会议、视频直播的流行以及未来AR/VR业务的发展,低延迟视频传输服务被广泛使用,但视频质量(QoE)还不能满足用户要求。那么近年来新兴的AI神经网络是否能为视频传输带来智能化的优化?今天LiveVideoStack大会北京站邀请了来自北京邮电大学的周安福教授,为我们分享关于使用强化学习方......
  • ​关于深度学习、NLP和计算机视觉的30个顶级Python库
    正文字数:2214 阅读时长:3分钟再次感谢艾哈迈德·阿尼斯(AhmedAnis)为收集这些数据做出的贡献,并感谢KDnuggets的其他工作人员的意见,见解和建议。作者/ MatthewMayo原文链接/https://www.kdnuggets.com/2020/11/top-python-libraries-deep-learning-natural-language-processing......
  • python入门笔记
     pip批量安装#安装和卸载pipwheel-wpackage_tmp_dir-rrequirement.txtpipdownload-dpackage_tmp_dir-rrequirement.txt#离线下载pipinstall-rrequirement.txtpipuninstallpackage#安装源:pipinstall-ihttps://pypi.douban.com/simple/package_name......
  • c++ linux基础学习第一课
    课程目标:1.shell命令解析器shell就是命令解析器,将用户命令翻译成内核能够识别的指令。shell常用的快捷键:tab:补齐命令,补齐文件(包括目录和文件)ctrl+a光标移动到头部,ctrl+e光标移动到尾部2.linux下主要目录:/bin保存着二进制文件、可执行程序和shell命令/sbins是superu......
  • 014 数据库学习笔记--查询
    常用查询方式:select*fromtablenameselectcol1,clo2fromtablenamewhereage=18selectcol1,clo2fromtablenamewhere age>=18andage<=60selectcol1,clo2fromtablenamewhere agebetween18and60selecttop(100)col1,clo2fromtablenamewhere ......
  • 如何使用机器学习提高推荐系统的准确性
    推荐系统是在互联网时代中非常重要的一项技术,它能够通过收集用户的行为数据和偏好,为用户提供个性化的推荐服务。而机器学习则是推荐系统中最为核心的部分,通过机器学习算法可以对大量的用户数据进行挖掘和分析,从而提高推荐系统的准确性和效率。下面,我将介绍一些如何使用机器学习提高......
  • GoodNotes 5(mac手写笔记软件)
    GoodNotes5mac版是一款非常好用的手写笔记软件,GoodNotes5将会支持使用苹果系统的Mac电脑进行手写,并提供多种不同的笔刷来对字体进行书写。GoodNotes5这款软件采用了非常符合Mac用户习惯的界面,其手写风格和功能完全可以满足日常的记录需求。GoodNotes5在书写方面非常流畅,......
  • C/C++学习(10)关于数组、内联函数、虚函数的错题集锦
    1、顺序存储方式不仅用于存储线性结构,还可以用于存放非线性结构,如完全二叉树是属于非线性结构,但其最佳存储方式是顺序存储方式。 2、数组名有两重属性:1)数据结构的一个对象(数据结构为当前数组),在java中数组就是一个对象。2)某些情况下自动退化成指向第一个元素的常量指针。 3、有两......