精华内容
下载资源
问答
  • 列主元消元法解方程组
    千次阅读
    2021-01-13 09:38:42

    高斯列主元消元法求解线性方程组

    AX=b

    的简要步骤

    n

    n

    nn

    n

    n

    n

    n

    b

    b

    b

    x

    x

    x

    a

    a

    a

    a

    a

    a

    a

    a

    a

    2

    1

    2

    1

    2

    1

    2

    22

    21

    1

    12

    11

    方法说明(以

    4

    阶为例)

    1

    步消元——在增广矩阵(

    A

    b

    )第一列中找到绝对值最大的元素,将其所在

    行与第一行交换,再对(

    A

    b

    )做初等行变换使原方程组转化为如下形式:

    *

    *

    *

    *

    *

    *

    *

    0

    *

    *

    *

    0

    *

    *

    *

    0

    *

    *

    *

    *

    4

    3

    2

    1

    x

    x

    x

    x

    2

    步消元——在增广矩阵(

    A

    b

    )中的第二列中(从第二行开始)找到绝对值

    最大的元素,将其所在行与第二行交换,再对(

    A

    b

    )做初等行变换使原方程组

    转化为:

    *

    *

    *

    *

    *

    *

    0

    0

    *

    *

    0

    0

    *

    *

    *

    0

    *

    *

    *

    *

    4

    3

    2

    1

    x

    x

    x

    x

    3

    步消元——在增广矩阵(

    A

    b

    )中的第三列中(从第三行开始)找到绝对值

    最大的元素,将其所在行与第二行交换,再对(

    A

    b

    )做初等行变换使原方程组

    转化为:

    *

    *

    *

    *

    *

    0

    0

    0

    *

    *

    0

    0

    *

    *

    *

    0

    *

    *

    *

    *

    4

    3

    2

    1

    x

    x

    x

    x

    x

    4

    x

    3

    x

    2

    x

    1

    的顺序回代求解出方程组的解。

    更多相关内容
  • 使用列主元消元法解方程组c语言代码
  • 列主元Gauss消去是指在解方程组时,未知数顺序消去,在要消去的那个未知数的系数中找按模最大者作为主元.完成消元后,系数矩阵化为上三角形,然后在逐步回代求解未知数.列主元Gauss消去是在综合考虑运算量与舍人误差...
  • 列主元消元法解方程组

    千次阅读 2015-01-17 14:05:03
    列主元消元法的算法步骤: # include # include # define N 3 main(){ int i,j,k,h,s,m,n,z; float max(float *y); float A[N][N+1],B[N],ma,t,M[N]={0},X; float x[N]; /*输入系数矩阵 */ ...

    列主元消元法的算法步骤:

    # include<stdio.h>
    # include<math.h>
    # define N 3
    main(){
    	int i,j,k,h,s,m,n,z;
        float max(float *y);
        float A[N][N+1],B[N],ma,t,M[N]={0},X;
    	float x[N];
    
    /*输入系数矩阵 */
    
    for(i=0;i<N;i++)
       for(j=0;j<N+1;j++)
    	   scanf("%f",&A[i][j]);
    
     printf("向命令窗口输入的曾广矩阵是:\n"); 
     
       for(i=0;i<N;i++)
     {
       for(j=0;j<N+1;j++)
    	   printf("%2.1f  ",A[i][j]);
       printf("\n");
     }
    	
    
    /*正消过程*/
    	for (i=0;i<N-1;i++)
    	{
    
    		 /*找出每行最大的值 */
    		for (j=i;j<N;j++)
    			B[j-i]=A[j][i];
    		ma=max(B);
    		for (s=0;s<N;s++)
    			B[s]=0;
    
    		/* 交换最大值行和当前行 */
    		if(ma!=0){
    		for (k=i;k<N;k++)
    			if (A[i][i]!=ma && A[k][i]==ma && ma!=0)
    			{
    				for (h=0;h<N+1;h++)
    				{
    					t=A[i][h];
    					A[i][h]=A[k][h];
    					A[k][h]=t;
    				}
    			}
    		      }
    		      else
    		      { printf("A是非奇异矩阵!\n");
    		      break;
    		      } 
    
    		/*	消去过程   */
    			for (m=i+1;m<N;m++)
    				M[m]=A[m][i]/A[i][i];
    			for (n=i+1;n<N;n++)
    			{
    				for (z=0;z<N+1;z++)
    					A[n][z]=A[n][z]-M[n]*A[i][z];
    			}
    			for (m=0;m<N;m++)
    				M[m]=0;
    	}
    	/*输出三角矩阵  */
    
    printf("通过高斯列主元消去法化成的上三角曾广矩阵是:\n");      
     for(i=0;i<N;i++)
     {
       for(j=0;j<N+1;j++)
    	   printf("%2.1f  ",A[i][j]);
       printf("\n");
     }
     /*
     回带过程
     */
     x[N-1]=A[N-1][N]/A[N-1][N-1];
     for(i=N-2;i>0 || i==0;i--)
     {   
    	 for(j=N-1;j>i;j--)
    		 X=X+A[i][j]*x[j];
    	 x[i]=(A[i][N]-X)/A[i][i];
    	 X=0; 
     }
    	  /*
    将方程的解输出
      */
    printf("该方程组的解依次为:\n");
     for(i=0;i<N;i++){
     	printf("x[%d]=%2.1f   ",i+1,x[i]);
     } 
    }
    
    
    /*
    计算最大值函数
      */
    float max(float *y){
    	int w;
    	float max=y[0];
    	for (w=0;w<N;w++)
    
    		if (fabs(y[w])>fabs(max))
    			max=y[w];
    			return max;
    }


    运行结果;

    展开全文
  • 列主元消元法比起高斯消元增加了每次化简时取第一列最大元素作为主元 即: 题目: 代码: #include <iostream> #include <cstdio> #include <queue> #include <cstring> #include <...

    在这里插入图片描述
    列主元消元法比起高斯消元增加了每次化简时取第一列最大元素作为主元
    即:
    在这里插入图片描述
    题目:
    在这里插入图片描述
    代码:

    #include <iostream>
    #include <cstdio>
    #include <queue>
    #include <cstring>
    #include <cmath>
    using namespace std;
    #define ll long long
    const int maxn = 205;
    const int INF = 0x3f3f3f;
    
    void _pri(double x, long long n, bool f) { //预处理数字,保留位数,是否需要四舍五入
        double _ma = 1.0, _mi = 1.0, _t = 10.0;
        long long _n = n, i = 0, cnt = 0;
        while(_n) {
            if(_n % 2 == 1) _ma *= _t, _mi /= _t;
            _n >>= 1, _t *= _t;
        }
        if(x < 0) printf("-"), x = -x;
        if(x < 1) printf("0.");
        if(x < _mi) {
            for(i = 0; i < n; ++i) printf("0");
            return;
        }
        double t = 1.0, _x = x;
        if(x >= 1)
            while(_x >= 1)
                _x /= 10, cnt++;
        if(x < 1)
            while(_x < 1) {
                if(_x < 0.1) printf("0");
                _x *= 10;
            }
        while(_x < _ma) _x *= 10;
        long long a = (long long)_x;
        if(f == 1 && cnt <= n && a % 10 >= 5)
            if(a > 0) a += 10;
            else if(a < 0) a -= 10;
        a /= 10;
        char ans[105]; _n = 0;
        while(a) {
            ans[_n++] = a%10 + '0';
            a /= 10;
        }
        for(i = 0; i < _n; ++i) {
            if(i == cnt && cnt != 0) printf(".");
            printf("%c",ans[_n - i - 1]);
        }
    }
    
    double a[1005 * 1005] = {0.0}, b[1005] = {0.0};
    double x[1005] = {0.0};
    int n = 0, n2 = 0;
    
    inline void IN() { //输入
        int t = 0;
        while(scanf("%lf",&a[++t]) != EOF) {}
        while(n*(n+1) != (t-1)) {n++;}
        n2 = n * n;
    }
    
    inline double *A(int i, int j) {
        return &a[j + (i-1) * n];
    }
    
    inline double *B(int j) {
        return &a[j + n2];
    }
    
    void _swap(int a, int b) {
        for(int i = 1; i <= n; ++i) {
            swap(*A(a,i), *A(b,i));
        }
        swap(*B(a), *B(b));
    }
    
    inline void SIM() { //化简为三角行列式
        for(int k =  1; k <= n; ++k) {
            double ma = abs(*A(k,k)), _i = k;
            for(int i = k+1; i <= n; ++i) {
                if(abs(*A(i,k)) > ma) {
                    ma = abs(*A(i,k));
                    _i = i;
                }
            }
            _swap(_i,k);
            for(int i = k+1; i <= n; ++i) {
                double mik = *A(i,k) / *A(k,k);
                for(int j = k; j <= n; ++j) {
                    *A(i,j) -= *A(k,j) * mik;
                }
                *B(i) -= mik * *B(k);
            }
        }
    }
    
    inline void _Pri(){
        for(int i = 1; i <= n; ++i) {
            for(int j = 1; j <= n; ++j) {
                printf("%lf ", *A(i,j));
            }
            printf("\n");
        }
        for(int i = 1; i <= n; ++i) {
            printf("%lf ", *B(i));
        }
        printf("\n");
    }
    
    inline void ANS() { //迭代求解
        for(int i = n; i >= 1; --i) {
            x[i] = *B(i);
            for(int j = i+1; j <= n; ++j) {
                x[i] -= *A(i,j) * x[j];
            }
            x[i] /= *A(i,i);
        }
    }
    
    inline void OUT() {
        for(int i = 1; i <= n; ++i) {
            _pri(x[i],(long long)5,1); printf("\n\n");
        }
    }
    
    int main() {
        IN();
        SIM();
        ANS();
        OUT();
        return 0;
    }
    
    展开全文
  • 高斯列主消元法解线性方程输入有方程组可得到阶梯矩阵与相应的无穷多时只得到阶梯矩阵
  • 本实验报告主要解决了Gauss列主演消去的几个简单问题的MATLAB实现,仅供参考,如有不足,烦请指正。
  • 懒得介绍了,方法思路看书 CPP代码 在这里插入代码片

    题
    高斯消元的优化,为了避免分母过小造成的误差,在每次选取基准数的时候在每列中选择最大的那个并于该行做初等行变换,该代码的时间复杂度为 O ( N 4 ) O(N^4) O(N4)

    CPP代码

    /*
    WANG_zibi 列消元 
     
    */
    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    typedef pair<int, int> PII;
    const int N = 1e4 + 10;
    double a[N][N];
    int n, m;
    const double INF = 0x3f3f3f3f;
    void test()
    {
        printf("经过变换的矩阵为:\n");
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
                cout << a[i][j] << " ";
            puts("");
        }
    }
    void deal(int x)
    {
        pair<double, int> flag;
        flag.first = flag.second = -INF;
        for (int i = x + 1; i < n; i++)
        {
            if (a[i][x] > flag.first)
            {
                flag.first = a[i][x];
                flag.second = i;
            }
        }
        if(flag.second!=-INF)
        for (int i = 0; i < m; i++)
                swap(a[flag.second][i], a[x][i]);
    }
    void gauss()
    {
        for (int k = 0; k < n; k++)
        {
            deal(k);
            for (int i = k + 1; i < n; i++)
            {
            	
                double t = a[i][k] / a[k][k];
                for (int j = k; j < m; j++)
                {
                    a[i][j] -= a[k][j] * t;
                }
            }
        }
        
        for (int j = 2; j >= 0; j--)
        {
            for (int k = j + 1; k < 3; k++)
            {
                a[j][3] = a[j][3] - a[j][k] * a[k][k];
            }
            a[j][j] = a[j][3] / a[j][j];
        }
    }
    
    void solve()
    {
        printf("最终得到的x1,x2,x3分别为:\n");
        for (int i = 0; i < 3; i++)
            cout << a[i][i] << " ";
    }
    signed main()
    {
        cin >> n >> m;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                cin >> a[i][j];
        test(); 
        gauss();
        solve();
        return 0;
    }
    
    

    PYTHON代码

    class gauss:
        def __init__(self, M, nn, mm):
            self.Matrix = M
            self.n = nn
            self.m = mm
        def __deal(self, t):
            x = -9999999.0
            y = None
            for i in range(t+1,self.n):
                if(self.Matrix[i][t] > x):
                    x = self.Matrix[i][t]
                    y=i
                for i in range(0,self.m):
                    temp = self.Matrix[t][i]
                    self.Matrix[t][i] = self.Matrix[y][i]
                    self.Matrix[y][i]=temp
    
        def solve(self):
            for k in range(0, self.n):
                self.__deal(k)
                for i in range(k + 1, self.n):
                    t = self.Matrix[i][k] / self.Matrix[k][k]
                    for j in range(0, self.m):
                        self.Matrix[i][j] -= self.Matrix[k][j] * t
            for j in range(self.n - 1, -1, -1):
                for k in range(j + 1, self.n):
                    self.Matrix[j][self.n] = self.Matrix[j][self.n] - self.Matrix[j][k] * self.Matrix[k][k]
                self.Matrix[j][j] = self.Matrix[j][self.n] / self.Matrix[j][j]
    
            for i in range(0, self.m - 1):
                print(self.Matrix[i][i], end=' ')
    
    def main():
        n,m=map(int, input().split())
        line = [[0] * m] * n
        for i in range(n):
            line[i] = input().split(" ")
            line[i] = list(map(int,line[i]))
        G = gauss(line,n,m)
        G.solve()
    main()
    
    
    展开全文
  •   数学上,高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解。但其算法十分复杂,不常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵。不过,如果有过百万条等式时...
  • 列主消元法解线性方程组源程序
  • 高斯顺序消元法程序简单,操作便捷,结果比较精确,但是每次运算的时候必须保证对角线上元素不为0,否则将无法计算,并且当...通过对比,列主元法通过判断大小并行行交换的操作能够有效地克服高斯顺序消元法的缺陷。
  • 数值分析实验报告!包含多个实验! 实验一 非线性方程求根 实验二 线性代数方程组的解法 --------列主元Gauss消元法 实验三 线性代数方程组的解法 ——Gauss-Seidel迭代法等
  • matlab用列主元高斯消去法解方程组,

    千次阅读 2021-04-18 14:05:21
    二、实验目的:进一步熟悉理解Guass消元法解法思路,提高matlab编程能力.三、实验要求:已知线性方程矩阵,利用软件求解线性方程组.四、实验原理:消元过程:设0)0(11a,令乘数)0(11)0(11/aamii,做(消去第i个...
  • .m文件,应用列主消元法求解方程, 列主元素消去法是在高斯消去法的基础上,为了避免在akk不等于零,但相对很小时,当其作为除数会导致其他元素数量级的增长严重的舍入误差增大的现象,同时从算法上讲又相较于全主...
  • 列主元高斯消去法解线性方程组的MATLAB程序,参考教材《数值分析》李乃成
  • 算法步骤 例题 程序代码 function x=liezhuyuan(A,b) k=1; n=length(b); m=zeros(n,n); X=A Y=b for k=1:n-1 [ark,rk]=max(abs(A(k:n,k))); rk=k-1+rk; if rk>k link=A(k,:);... ..
  • 学过线性代数的朋友都知道有多种方法能用来线性方程组,今天我给大家介绍的方法是,列主元高斯消元法及其算法实现 如何线性方程组? 相信大家在初中就学过解方程组,如下面做这个题目 我们求解的时候,就是用消元的...
  • 列主元消去法解方程组比起全主元,计算过程要简单很多,里面包括matlab代码及其注释说明,还有一个解方程组的例子,希望对大家有帮助。
  • 线性方程组的高斯主列消去vb程序。pfg
  • error=0 #ans用于保存运算结果,dic将以字典的形式表示,error用于判断该方程组是否有唯一,error=0则有唯一 for i in range(len(mat)-1): max=0 change=[] for j in range(i,len(mat)): i
  • 高斯列主元消去法解方程组,用C语言描述了高斯列主元消去法解方程组的过程
  • 高斯列主元消元法求解线性方程组

    万次阅读 2014-01-05 23:35:26
    一、高斯消去的基本思想 ... 解方程组:   方程组矩阵形式为:AX=b,其中:    第一步,消元过程:对增广矩阵进行消元   即得方程组   第二步, 回代过程:   此方法就是高斯消去。 二、改进版
  • 利用高斯列主元消元法求解方程组的C++代码,用VC++6.0实现,通过更改输入参数可求一般线性方程组
  • 列主元消去法解线性方程组(C++实现) #include<cstdio> #include<iostream> using namespace std; int quen(double a[],int n){ double x; int k; for(int i=0;i<n;i++){ if(a[i]>=0){ a...
  • 题目:运算精度设置为单精度,用Matlab编程实现下列方程组,分别使用顺序Gauss消去列主元Gauss消去给出计算结果,并回答下列问题: 计算结果和期望结果是否一致,为什么 给出例子分析计算结果的计算程序 ...
  • 列主元高斯消去法解线性方程组——C语言实现

    千次阅读 多人点赞 2020-06-27 17:52:33
    的基本原理就是用初等变换将用行的,逐次消去未知数的方法,把原来的方程组,化为与其等价的上三角方程组。 设有线性方程Ax=B\boldsymbol{A}\boldsymbol{x}=\boldsymbol{B}Ax=B如下 $$ \begin{bmatrix} a_{11}& ...
  • Gauss列主元消元法解线性方程组(通用)
  • 用高斯用列主元消元法求解下面的方程组.doc
  • %高斯消元解方程 G=[0.4096 0.1234 0.3678 0.2943 0.4043;0.2246 0.3872 0.4015 0.1129 0.1550;0.3645 0.1920 0.3781 0.0643 0.4240;0.1784 0.4002 0.2786 0.3927 -0.2557]; %输入增广矩阵 [m,n]=size(G); %m为增广...
  • 研究生学习数值分析时一行一行写的,Guass列主元消元法求解线性方程组,找主元->换行->变A为上三角矩阵->回代求值。程序移植性强,注释详细,可以用来学习一下。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 472
精华内容 188
关键字:

列主元消元法解方程组