• 数论学习日记四—高斯消元法


    高斯消元法对于学过线性代数的我们算是一个比较熟悉的名词,一般高斯消元法是用来求解线性方程的组的一个算法,今天我们就来复习一下高斯消元法。

     

    忘了?没有关系,我们慢慢来。

     

    什么是高斯消元法,怎么用?

    首先了解高斯消元法的原理和核心:

    原理:

    消元法是将方程组中的一方程的未知数用含有另一未知数的代数式表示,并将其代人到另一方程中,这就消去了一未知数,得到一解;或将方程组中的一方程倍乘某个常数加到另外一方程中去,也可达到消去一未知数的目的。消元法主要用于二元一次方程组的求解。

    核心:

    一:两方程互换,解不变;

    二:一方程乘以非零数k,解不变;

    三:一方程乘以数k加上另一方程,解不变

    对于一个线性方程组:

    式中x1,x2,…,xn代表未知量,αij(1≤i≤m,1≤jn)称为方程⑴的系数,bi(1≤i≤m)称为常数项。系数和常数项都是任意的复数或某一个域的元素。

    而方程组系数构成的m行n列的矩阵

    称为该方程组的系数矩阵,高斯消元法就是针对此类复杂的线性方程组来求解的一种快速解法。

    我们还是用一组实例来解释吧,为了方便起见,我就直接从网上找了一个比较好消元的线性方程组来做示例:

      {  X1 + x2 + x3 = 3

    { {  X1 + 2x2 + 4x3 = 7

      {  X1 + 3x2 + 9x3 = 13

    观察可得出它的系数矩阵为(我们就先一步一步纸算吧):

     ==》 ==》 ==》 ==》 ==》

    这就是消元的全过程(我觉得写的应该算详细的了)

    消完元后,我们可以得到新的线性方程组:

      { X1 = 1

    { { x2 = 1

      { x3 = 1

    很明显,因为这个线性方程组比较好消,所以我们直接得出了所有未知数的值,这就是高斯消元法求线性方程组的全过程。

     

    下面是C++的实现代码:

    #include<iostream>
    #include<cmath>
    #include<conio.h>
    #include<malloc.h>
    #include<memory.h>
    #include<string>
    #include<cstdio>
    #include<iomanip>
    
    using namespace std;
    
    int main(int argc, const char * argv[])
    {
        double matrix[3][4] = { {1,1,1,3},
                                {1,2,4,7},
                                {1,3,9,13} };
        int line = 3, column = 4;
        for (int i = 0; i < line - 1; i++)
        {   
            int head = 0;
            for (int j = 0; j < column; j++){if (matrix[i][j]){head = j;break;}}
            if (matrix[i][head] != 1 && matrix[i][head])
            {
                double Convention_Number = matrix[i][head];
                for (int j = head; j < column; j++)
                    matrix[i][j] /= Convention_Number;
            }
            
            for (int j = i + 1; j < line; j++)
            {
                if (!matrix[j][head]) continue;
                double Convention_Number = matrix[j][head];
                for (int s = head; s < column; s++)matrix[j][s] -= matrix[i][s] * Convention_Number;
            }
        }
        
        for (int i = line - 1; i > 0 ; i--)
        {
            int head = 0;
            for (int j = 0; j < column; j++){if (matrix[i][j]){head = j;break;}}
    
            if (matrix[i][head] != 1 && matrix[i][head])
            {
                double Convention_Number = matrix[i][head];
                for (int j = head; j < column; j++)matrix[i][j] /= Convention_Number;
            }
            for (int j = 0; j < i; j++)
            {
                if (!matrix[j][head]) continue;
                double Convention_Number = matrix[j][head];
                for (int s = head; s < column; s++)matrix[j][s] -= matrix[i][s] * Convention_Number;
            }
        }
    
        for (int i = 0; i < line; i++)
        {
            for (int j = 0; j < column; j++)
                cout << fixed << setprecision(3) << matrix[i][j] << " ";
            cout << endl;
        }
        _getch();
        return 0;
    }

    实现的重点就是考虑从第一行开始,将后面几行首元化为0,以此类推,只要注意消元的过程中行的变化,每个数字同乘同除就行了。

    -------------------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    leetcode -- Maximum Depth of Binary Tree
    leetcode -- Binary Tree Level Order Traversal
    leetcode -- Binary Tree Inorder Traversal
    leetcode -- Subsets II
    Egret入门学习日记 --- 第十七篇(书中 7.4~8.2节 内容)
    Egret入门学习日记 --- 问题汇总
    Egret入门学习日记 --- 第六篇(书中 3.6~3.9节 内容)
    Egret入门学习日记 --- 第十六篇(书中 6.10~7.3节 内容)
    Egret入门学习日记 --- 第十五篇(书中 6.1~6.9节 内容)
    Egret入门学习日记 --- 第十四篇(书中 5.4~5.6节 内容)
  • 原文地址:https://www.cnblogs.com/xiangqi/p/11138938.html
Copyright © 2020-2023  润新知