高斯消元法 列主元素消元法

1 篇文章 0 订阅

高斯消元法:

 double l;//被减得比例系数 
    double c;

    //输入矩阵 
    cout<<"这是一个几阶的矩阵:"<<endl;
    cin>>n;
    cout<<"输入矩阵:"<<endl;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n+1;j++)
            cin>>A[i][j];
    }

    //矩阵消元 消第k列的每i行 
    for(int k=0;k<n-1;k++)
    {
        if(A[k][k]==0){
		 return -1;
		 }    
        for(int i=k+1;i<n;i++)
        {
            l=A[i][k]/A[k][k];
            //该行的每个元素 减去 第一行的l倍 
            for(int j=k;j<n+1;j++) 
            {
                A[i][j]=A[i][j]-(l*A[k][j]);
            }
        }
        
         //打印本次消元之后的结果 
         cout<<"A="<<endl;
         for(int i=0;i<n;i++)
        {
           for(int j=0;j<n+1;j++)
           cout<<A[i][j]<<" ";
           cout<<endl;
         }
    }

	//回代
    X[n-1]=A[n-1][n]/A[n-1][n-1];
    for(int k=n-2;k>=0;k--)
    {
        c=A[k][n];
        for(int j=k+1;j<n;j++)
        {
            c=c-A[k][j]*X[j];
        }
        X[k]=c/A[k][k];
    } 
    //此处打印出向量X

    printf("x=\n");

    for(int i=0;i<n;i++)

        printf("\t%f\t\n",X[i]);
    return 0;
}

 

列主元素消元法:

#include<iostream>
#include<math.h>
double A[5][5];
double X[5]; 
int n;
using namespace std;

//换行函数 ,交换第i行和j行,共有n列 
void colsswap(int i,int j,int n){
	double a=0;
	for(int k=0;k<=n;k++){
		a=A[i][k];
		A[i][k]=A[j][k];
		A[j][k]=a;
	}
} 
//判断该列最大元素 所在行
int maxrow(int y,int n){
	int b=y;//初始值置为第0行
	for(int k=y;k<n;k++){
		if(A[k][y]>A[b][y]){
		   b=k;
	    }  
	}
	cout<<"b="<<b<<endl; 
	cout<<endl;
	return b;	
} 
//列主元素消元法
int main(){
	double l;//被减得比例系数 
    double c;

    //输入矩阵 
    cout<<"这是一个几阶的矩阵:"<<endl;
    cin>>n;
    cout<<"输入矩阵:"<<endl;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n+1;j++)
            cin>>A[i][j];
    }

    //矩阵消元 消第k列的每i行 
    for(int k=0;k<n-1;k++)
    {
    	//最大主元素列 
        int c=maxrow(k,n);
        colsswap(k,c,n);
        cout<<"A(交换)="<<endl;
        
           for(int i=0;i<n;i++)
            {
           for(int j=0;j<n+1;j++)
           cout<<A[i][j]<<" ";
           cout<<endl;
            }
            
        cout<<endl;
        if(A[k][k]==0){
		 return -1;
		 }    
        for(int i=k+1;i<n;i++)
        {
        
            l=A[i][k]/A[k][k];
            //该行的每个元素 减去 第一行的l倍 
            for(int j=k;j<n+1;j++) 
            {
                A[i][j]=A[i][j]-(l*A[k][j]);
            }
        }
        
         //打印本次消元之后的结果 
         cout<<"A="<<endl;
         for(int i=0;i<n;i++)
        {
           for(int j=0;j<n+1;j++)
           cout<<A[i][j]<<" ";
           cout<<endl;
         }
    }

	//回代
    X[n-1]=A[n-1][n]/A[n-1][n-1];
    for(int k=n-2;k>=0;k--)
    {
        c=A[k][n];
        for(int j=k+1;j<n;j++)
        {
            c=c-A[k][j]*X[j];
        }
        X[k]=c/A[k][k];
    } 
    //此处打印出向量X

    printf("x=\n");

    for(int i=0;i<n;i++)

        printf("\t%f\t\n",X[i]);
    return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值