精华内容
下载资源
问答
  • 列主元消元法解方程组

    千次阅读 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;
    }


    运行结果;

    展开全文
  • 高斯列主元消元法求解线性方程组AX=b的简要步骤nnnnnnnnbbbxxxaaaaaaaaa2121212222111211方法说明(以4阶为例):...

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

    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++代码,用VC++6.0实现,通过更改输入参数可求一般线性方程组
  • 懒得介绍了,方法思路看书 CPP代码 在这里插入代码片

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

    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()
    
    
    展开全文
  • 高斯列主元消元法求解线性方程组

    万次阅读 2014-01-05 23:35:26
    一、高斯消去的基本思想 ... 解方程组:   解 方程组矩阵形式为:AX=b,其中:    第一步,消元过程:对增广矩阵进行消元   即得方程组   第二步, 回代过程:   此方法就是高斯消去。 二、改进版
    一、高斯消去法的基本思想
        例1. 解方程组:
                     

    解 方程组矩阵形式为:AX=b,其中: 
                 

    第一步,消元过程:对增广矩阵进行消元

        




    即得方程组
       
    第二步, 回代过程:
                 

    此方法就是高斯消去法

    二、改进版算法

    由高斯消去法知道,在消元过程中可能出现=0的情况, 这时消去法将无法进行;即使主元素≠0,但很小时,用其作除数,会导致其他元素数量级的严重增长和舍入误差的扩散, 最后也使得计算解不可靠。 
        引例 求解方程组
                  

    4位浮点数进行计算。
       解: 方法1 用高斯消去法求解。

                 
                                      
    其中
             
    计算解为:

             

    显然计算解 是一个很坏的结果,不能作为方程的近似解。
        方法2 交换行,避免绝对值小的主元做除数。
                    


    得计算解为:
             x=(-0.4900,-0.05113,0.3678)T ≈x*.
    这个例子告诉我们,在采用高斯消去法解方程组时,小主元可能产生麻烦,故应避免采用绝对值小的主元素a 。对一般矩阵来说,最好每一步选取系数矩阵(或消元后的低价矩阵)中绝对值最大的元素作为主元素,以使高斯消去法具有较好的数值稳定性, 这就是全主元素消去法, 在选主元时要花费较多机器时间,目前主要使用的是列主元消去法。 

    本节主要介绍列主元消去法,并假定(2.1)A∈Rn×n为非奇异的。
       1列主元素消去法
    设方程组(2.1)的增广矩阵为:

                      
     
    首先在A的第一列中选取绝对值最大的元素作为主元素,例如: 
             |ai1,1|= max |ai1|≠0, 1≤i≤n 
    然后交换B的第一行与第i1 行,经第一次消元计算得
             (A|b)→(A(2)|b(2) ) 
     重复上述过程,设已完成第k-1步的选主元素,交换两行及消元计算,(A|b)约化为:

                 (2.2)

    其中A(k) 的元素仍记为aij ,b(k) 的元素仍记为bi 。

    k步选主元素(A(k) 右下角方阵的第一列内选),即确定ik ,使
                   
    交换(A(k) |b(k) ) 第k行与ik 列的元素,再进行消元计算,最后将原方 程组化为(k=1,2…,n-1):

                       
    回代求解

             
        2. 高斯-若当消去法
    高斯消去法始终是消去对角线下方的元素,现考察高斯消去法的一种修正,即消去对角线下方和上方的元素,这种方法称为高斯-若当(Gauss—Jordan)消去法。通过选主元,消元等过程最终化为: 

                    
    说明:用高斯-若当方法将A约化为单位矩阵,计算解就在常数位置得到,因此用不着回代求解,用高斯-若当方法解方程组其计算量要比高斯消去法大,但用高斯—若当方法求一个矩阵的逆矩阵还是比较合适的。
        定理4(高斯-若当法求逆矩阵)设A为非奇异矩阵,C=(A|In ), 如果对C应用高斯—若当方法化为(In|T)
    A-1=T 。

        例4 用高斯-若当方法求 的逆矩阵以及的解。

    解:


     
             
             

    c++代码实现如下:

    /*
     * test.cpp
     *
     *  Created on: 2014-1-5
     *      Author: zhijian
     */
    
    #include <stdio.h>
    #include <math.h>
    
    #define MAXN 100
    #define ZERO 0.000000001	//定义浮点0
    //#define DEBUG
    
    //交换两个变量的值
    void swap(double *a,double *b){
    	double temp = *a;
    	*a = *b;
    	*b = temp;
    }
    
    //B行的每一个元素加上A行的每一个元素的值*k
    void lineOper(double A[],double B[],int n,double k){
    	for(int i = 0;i<n;i++)
    		B[i] += A[i] * k;
    }
    /*
     * 解线性方程组Ax = b,
     * 其中A为n*n的方阵,x,b为n维向量
     * 返回是否有解
     */
    bool solveEquations(double A[MAXN][MAXN],int n,double x[MAXN],double b[MAXN]){
    	double temp[MAXN][MAXN + 1];	//增广矩阵
    	//初始化增广矩阵
    	for(int i = 0;i<n;i++){
    		for(int j = 0;j<n;j++)
    			temp[i][j] = A[i][j];
    		temp[i][n] = b[i];
    	}
    	//化为上三角矩阵
    	for(int j = 0;j<n;j++){
    		//寻找该列绝对值最大的行
    		int mmaxi = j;
    		for(int i = j+1;i<n;i++)
    			if(fabs(temp[i][j])>fabs(temp[mmaxi][j]))mmaxi = i;
    		if(fabs(temp[mmaxi][j])<ZERO)
    			return false;//无解
    		if(mmaxi != j){//交换两行
    			for(int i = 0;i<n+1;i++)
    				swap(&temp[mmaxi][i],&temp[j][i]);
    		}
    		//消元
    		for(int i = j + 1;i<n;i++){
    			double k = temp[i][j] / temp[j][j];
    			lineOper(temp[j],temp[i],n+1,-k);
    		}
    	}
    	//迭代求值
    	for(int j = n - 1;j>=0;j--){
    		double sum = 0;
    		for(int i = j+1;i<n;i++)
    			sum += x[i] * temp[j][i];
    		x[j] = (temp[j][n] - sum) / temp[j][j];
    	}
    	return true;
    }
    void test(){
    	double A[MAXN][MAXN];
    	double x[MAXN];
    	double b[MAXN];
    	int n;
    	printf("请输入矩阵A的规模:\n");
    	scanf("%d",&n);
    	printf("请按行输入矩阵A:\n");
    	for(int i = 0;i<n;i++)
    		for(int j = 0;j<n;j++)
    			scanf("%lf",&A[i][j]);
    	printf("请输入向量b:\n");
    	for(int i = 0;i<n;i++)
    		scanf("%lf",&b[i]);
    	if(!solveEquations(A,n,x,b))
    		printf("无解\n");
    	else{
    		for(int i = 0;i<n;i++)
    			printf("%lf\n",x[i]);
    	}
    }
    int main(){
    	test();
    	return 0;
    }
    
    
    求逆的实现:
    /*
     * test.cpp
     *
     *  Created on: 2014-1-5
     *      Author: zhijian
     */
    
    #include <stdio.h>
    #include <math.h>
    
    #define MAXN 100
    #define ZERO 0.000000001	//定义浮点0
    #define DEBUG
    
    //交换两个变量
    void swap(double *a,double *b){
    	double temp = *a;
    	*a = *b;
    	*b = temp;
    }
    
    //交换两行变量
    void swapLine(double A[],double B[],int n){
    	for(int i = 0;i<n;i++)
    		swap(&A[i],&B[i]);
    }
    //将一行(B)的每一个元素加上另外一行(A)的每一个元素*k
    void lineOper(double A[],double B[],int n,double k){
    	for(int i = 0;i<n;i++)
    		B[i] += k * A[i];
    }
    
    /*
     *
     *
     * 矩阵求逆
     * 返回是否有逆
     */
    bool inverse(double A[MAXN][MAXN],int n,double A_[MAXN][MAXN]){
    	double temp[MAXN][MAXN];	//辅助矩阵
    	//单位矩阵初始化
    	for(int i = 0;i<n;i++){
    		for(int j = 0;j<n;j++)
    			A_[i][j] = 0,temp[i][j] = A[i][j];
    		A_[i][i] = 1;
    	}
    	//化成上三角矩阵
    	for(int j = 0;j<n;j++){
    		int mmaxi = j;
    		for(int i = j + 1;i<n;i++)
    			if(fabs(temp[i][j])>fabs(temp[mmaxi][j]))mmaxi = i;
    		if(fabs(temp[mmaxi][j])<ZERO)return false;	//无逆
    		if(mmaxi != j){
    			swapLine(temp[mmaxi],temp[j],n);
    			swapLine(A_[mmaxi],A_[j],n);
    		}
    		for(int i = j+1;i<n;i++){
    			double k = temp[i][j] / temp[j][j];
    			lineOper(temp[j],temp[i],n,-k);
    			lineOper(A_[j],A_[i],n,-k);
    		}
    	}
    	//变成对角矩阵
    	for(int j = n-1;j>=0;j--){
    		for(int i = 0;i<j;i++){
    			double k = temp[i][j] / temp[j][j];
    			lineOper(temp[j],temp[i],n,-k);
    			lineOper(A_[j],A_[i],n,-k);
    		}
    	}
    	//单位化
    	for(int i = 0;i<n;i++){
    		double k = 1.0 / temp[i][i];
    		for(int j = 0;j<n;j++)
    			A_[i][j] *= k;
    	}
    	return true;
    }
    
    void test(){
    	double A[MAXN][MAXN];
    	double A_[MAXN][MAXN];
    	int n;
    	printf("输入方阵规模\n");
    	scanf("%d",&n);
    	for(int i = 0;i<n;i++)
    		for(int j = 0;j<n;j++)
    			scanf("%lf",&A[i][j]);
    	if(!inverse(A,n,A_)){
    		printf("无解\n");
    	}
    	else{
    		for(int i = 0;i<n;i++){
    			for(int j  = 0;j<n;j++)
    				printf("%lf ",A_[i][j]);
    			printf("\n");
    		}
    		printf("\n");
    	}
    }
    int main(){
    	test();
    	return 0;
    }
    
    

    参考链接:http://sxyd.sdut.edu.cn/zhanshi/shuzhifenxi/shuzhifenxi/2.1/szfx021.htm

    http://sxyd.sdut.edu.cn/zhanshi/shuzhifenxi/shuzhifenxi/2.2/szfx022.htm


    展开全文
  • 主要包含列主元Gauss消元法的算法流程和python实现,并且以教科书上的一个例题加以验证
  • 解方程组列主元高斯消元法和Cholesky分解计算数学与科学工程计算研究所 陆嵩基本思想一般的高斯消元法的运算量为O(n3)O(n^3),这是我们所不能接受的。高斯消元法本质上就是矩阵的LULU分解,高斯消元的过程,其实...
  • 学过线性代数的朋友都知道有多种方法能用来解线性方程组,今天我给大家介绍的方法是,列主元高斯消元法及其算法实现 如何解线性方程组? 相信大家在初中就学过解方程组,如下面做这个题目 我们求解的时候,就是用消元的...
  • 这里主要有列主元消元法,LU分解法,改进的平方根法,追赶法和雅可比迭代,高斯—塞德尔迭代 的构造过程及相应的程序。线性方程的解法在数值计算中占有极重要的地位,因此,线性方程组的求解是数值分析课程中最基本的...
  • import java.util.Scanner; public class Gauss { static final int MAXN = 20;...//用来记录出来的根,本题用一维数组即可,二维数组是为完全主元素消元法做准备 static int num; public static v
  • Python实现列主元高斯消去法与LU分解法 数值分析:Python实现列主元高斯消去法与LU分解法求解线性方程组 一、矩阵形式的线性代数方程组 二、高斯消去法 三、高斯列主元消去法 ...#列主元消元法 def
  • 本实验主要涉及线性方程组的直接法中的消元法列主元消去法。通过上机计算使学生学会程序的录入和Matlab的使用与操作;通过计算结果的比较,使学生了解求线性方程组的精度不但与方法有关,而且与问题的性态有关。...
  • 实际上后面的Guass列主选主元,全选主元,都是由顺序高斯消元法稍加改动变化而来的,但是...为了避免此,就提出了列主元高斯消元法,即在每次选择保留的元时,选择那个元所对应的系数较大的所对应的方程,然后基于次
  • 在上一篇博客里面,笔者介绍了解线性方程组列主元Guass消元法,这篇将介绍LU分解法及其算法实现. 什么是LU分解? 对于一个线性方程组Ax=b,其中A是非奇异系数矩阵,b是线性方程组右端项,在列主元Guass消元法里面我们...
  • 列主元高斯消去(C语言)

    千次阅读 2017-09-02 11:49:19
    高斯消元法是将方程组中的一方程的未知数用含有另一未知数的代数式表示,并将其代人到另一方程中,这就消去了一未知数,得到一;或将方程组中的一方程倍乘某个常数加到另外一方程中去,也可达到消去一未知数的目的...
  • +线性方程组的直接方法:方程组的逆矩阵解法及其MATLAB程序,三角形方程组的解法及其MATLAB程序,高斯(Gauss)消元法和列主元消元法及其MATLAB程序, LU分解法及其MATLAB程序,误差分析及其两种MATLAB程序,求解...
  • 如题:详细代码:(一)顺序Gauss消元法functioncode1.m%用顺序Guass消元法...(三)列主元Gauss消元functioncode3.m%用列主元高斯消元法求解此方程组,计算结果与精确做比较 (四)Jacobi迭代法functioncode4.m...
  • 2.用 列主元高斯(Gauss)消元法 求n阶线性方程组。 3.用 列主元LU直接分解法 求n阶线性方程组。 4.用 Jacobi迭代法 求n阶线性方程组。 5.用 Gauss-Seidel迭代法 求n阶线性方程组。 编程语言与扩展库...
  • 高斯消元法求行列式及逆矩阵

    千次阅读 2018-01-28 12:57:02
    题目简介 给定一个 n*n 的矩阵,输出它的行列...高斯消元法求解线性方程组只要稍微修改下代码就可以,判断无/无穷多也不难,至于求自由未知量然后输出任意一……还没有想好,也是以后再来填(逃 #include us
  • 线性方程组求解的数值实验报告 用Gauss消元法把上述方程组的系数矩阵化为上三角...列主元消元的基本做法是选取系数矩阵的每一列中绝对值最大的作为主元,然后采取和顺序Gauss消元法相同的步骤进行 ,求得方程组
  • 采用高斯先列主元消元法(也可采用其他方法)求解线性方程组AX=b。 鼓励可视化编程;   源程序中应有足够的注释;   学生可自行增加新功能模块(视情况可另外加分);   必须上机调试通过;   ...
  • 线性方程组:高斯消元法和高斯列主元消去法 线性方程组的迭代方法:雅克比(Jacobi)迭代法与高斯-赛德尔迭代法 拉格朗日插值法 非线性方程的迭代方法:区间半分法、不动点迭代法和牛顿法 一、线性...
  • Main_Gauss.m

    2021-02-04 18:43:59
    采用列主元高斯消元法将矩阵化为上三角矩阵,再采用回代法解线性方程组。高斯消元法对于一般的方程组,通过对增广矩阵的变化,化矩阵为上三角
  • c++高斯消元

    千次阅读 2017-07-24 22:57:35
    (3) 消元过程,然后采用高斯消元法使得新得到的第i行以下的元素均为零; (4) 重复上述过程直到,从而得到上三角矩阵; (5) 对上三角矩阵进行回代求解,即可以得到方程组的解。1高斯列主元法解线性方
  • 为了解决这个问题,就出现了完全主元素消去法和列主元消元法,通过一定的矩阵行变换,达到减小误差的目的。完全主元素消去主要是低阶稠密矩阵方程组,列主元消去则更简便,选择绝对值最大的列主元交换求解即可,...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

列主元消元法解方程组