[计算方法]列主元消去法 LU分解法求线性方程解

原创 2018年04月17日 11:12:18
/*计算方法实验二
 *WYC
 *计科1604
 */
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;

const int MAXSIZE = 20;
void columnPivoting(double a[MAXSIZE][MAXSIZE],int n, double b[]);   //声明函数columnPivoting

int main(){
    double matrix[MAXSIZE][MAXSIZE];//系数
    double b[MAXSIZE]; //b
    int sizeM;
    cin>> sizeM;
    for(int i=0;i<sizeM;i++){
        for(int j=0;j<sizeM;j++)
            cin>> matrix[i][j];
        cin>>b[i];
    }
    columnPivoting(matrix,sizeM,b);
    return 0;
}

//列主元消去法
void columnPivoting(double a[MAXSIZE][MAXSIZE], int n, double b[]){
    int i, j, k;
    int col = 0, row = 0;
    for (k = 0; k < n - 1; k++){
        double tmp = 0;
        //找出消元列中最大的那个元素所在的位置
        for (i = k; i < n ; i++)
            if (fabs(a[i][k]) > tmp){
                tmp = fabs(a[i][k]);
                //cout << "MAX " << tmp << endl;//
                row = i;
                col = k;
            }

        //如果该对角线元素是0,同样不能用高斯消元法来求解
        if (a[row][row] == 0){
            cout << "can't solve" << endl;
            return;
        }
        //将找出的行进行交换
        if (k != row){
            for (i = 0; i < n; i++){
                swap(a[row][i], a[k][i]);
                swap(b[k], b[row]);
            }
        }
        //消元过程
        double c[n];
        for (j = k + 1; j < n; j++){
            c[j] = a[j][k] / a[k][k];
            //cout << c[j] << endl;
        }
        for (i = k + 1; i < n; i++){
            for (j = 1; j < n; j++){
                a[i][j] = a[i][j] - c[i] * a[k][j];
            }
            b[i] = b[i] - c[i] * b[k];
        }

    }

    double x[n];
    x[n - 1] = b[n - 1] / a[n - 1][n - 1];
    for (i = n - 2; i >= 0; i--){
        double sum = 0;
        for(j = i + 1; j < n; j++)
            sum += a[i][j] * x[j];
        x[i] = (b[i] - sum)/a[i][i];
    }
    for(int i=0;i<n;i++)
        printf("x[%d] = %.4f\n",i+1,x[i]);  //输出结果
    printf("\n");
}

/*
 4
 1 1 0 3 4
 2 1 -1 1 1
 3 -1 -1 3 -3
 -1 2 3 -1 4
 3
 1 1 -1 1
 1 2 -2 0
 -2 1 1 1
 4
 3 1 0 0 1
 2 3 1 0 0 
 0 2 3 1 1
 0 0 1 3 0

 */
/*计算方法实验二 LU Decomposition
 *WYC
 *计科1604
 */
#include<iostream>
using namespace std;

const int MAXSIZE = 20;
void LUDecomposition(double a[MAXSIZE][MAXSIZE], double b[MAXSIZE],int n);

int main()
{
    double a[MAXSIZE][MAXSIZE];
    double b[MAXSIZE];
    int n;
    cin>> n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++)
            cin>> a[i][j];
        cin>>b[i];
    }
    LUDecomposition(a, b, n);
    return 0;
}

//矩阵的ALU分解
void LUDecomposition(double a[MAXSIZE][MAXSIZE], double b[MAXSIZE],int n)
{
    double l[MAXSIZE][MAXSIZE] = { 0 };
    double u[MAXSIZE][MAXSIZE] = { 0 };
    int i, r, k;
    //进行U的第一行的赋值
    for (i = 0; i<n; i++)
    {
        u[0][i] = a[0][i];
    }

    //进行L的第一列的赋值
    for (i = 1; i<n; i++)
    {
        l[i][0] = a[i][0] / u[0][0];
    }

    //计算U的剩下的行数和L的剩下的列数
    for (r = 1; r<n; r++)
    {
        for (i = r; i <n; i++)
        {
            double sum1 = 0;
            for (k = 0; k < r; k++)
            {
                sum1 += l[r][k] * u[k][i];
                //cout << "" << r << "" << sum1 << endl;
            }
            u[r][i] = a[r][i] - sum1;
        }


        if(r!=n)
            for(i=r+1;i<n;i++)
            {
                double sum2 = 0;
                for (k = 0; k<r; k++)
                {
                    sum2 += l[i][k] * u[k][r];
                }
                l[i][r] = (a[i][r] - sum2) / u[r][r];
            }

    }

    double y[MAXSIZE] = { 0 };
    y[0] = b[0];
    for (i = 1; i<n; i++)
    {
        double sum3 = 0;
        for (k = 0; k<i; k++)
            sum3 += l[i][k] * y[k];
        y[i] = b[i] - sum3;
    }

    double x[MAXSIZE] = { 0 };
    x[n - 1] = y[n - 1] / u[n - 1][n - 1];
    for (i = n - 2; i >= 0; i--)
    {
        double sum4 = 0;
        for (k = i + 1; k<n; k++)
            sum4 += u[i][k] * x[k];
        x[i] = (y[i] - sum4) / u[i][i];
    }
    for (i = 0; i<n; i++)
        cout << "x[" << i + 1 << "]=" << x[i] << endl;

}


版权声明:本文为博主原创文章,未经博主允许不可转载。 https://blog.csdn.net/orion_pistachio/article/details/79971470

LU分解法解线性方程组(C语言)

#include #include #define N 10 //矩阵大小范围 /** 使用已经求出的x,向前计算x(供getx()调用)* float a[][] 矩阵U* float x[] ...
  • linvo
  • linvo
  • 2009-02-15 18:33:00
  • 5662

[计算方法]列主元消去法 LU分解法求线性方程解

/*计算方法实验二 *WYC *计科1604 */ #include &amp;lt;cstdio&amp;gt; #include &amp;lt;cmath&amp;gt; #include...
  • orion_pistachio
  • orion_pistachio
  • 2018-04-17 11:12:18
  • 20

矩阵的LU分解求解线性方程组(C++实现)

继续解方程组,这次使用LU分解求解方程组的解,该方法思想就是将一个矩阵分解为一个单位下三角矩阵L和一个上三角矩阵U,属于矩阵的三角分解法,又称杜利特尔(Doolittle)分解。其实高斯消元法的进行的...
  • qq_26025363
  • qq_26025363
  • 2016-11-07 22:55:19
  • 3941

python 实现列主元消去算法

学到数值分析的列主元消去上机需要,就用py实现以下, 列主元消去就是在高斯的基础上每次找到没一行的第一个元素最大的那个与第一行交换,在进行高斯变换, 主要是为了避免一些误差. #!/usr/bi...
  • LindaMan_
  • LindaMan_
  • 2017-05-19 20:52:51
  • 675

列主元消去法求解线性方程组(C++实现)

接着上次的继续,上次使用了高斯消元法http://blog.csdn.net/qq_26025363/article/details/53027926,但是,在消元过程中,无法使主元素a(ii)≠0,...
  • qq_26025363
  • qq_26025363
  • 2016-11-05 13:09:21
  • 3196

Lu分解法的C语言实现

将系数矩阵A转变成等价两个矩阵L和U的乘积 ,其中L和U分别是单位下三角矩阵和上三角矩阵。当A的所有顺序主子式都不为0时,矩阵A可以分解为A=LU(所有顺序主子式不为0,矩阵不一定不可以进行LU...
  • yang10560
  • yang10560
  • 2017-09-12 17:55:14
  • 415

LU分解法求方程组

LU分解法:当系数矩阵A满足顺序主子式不为0时,可将A分解为为一个单位下三角矩阵L和一个上三角矩阵U的乘积,且分解唯一,然后方程式变为Ly=b,Ux=y,接着先求y,再求出x。 LU公式: #in...
  • qq_39216184
  • qq_39216184
  • 2018-03-28 15:51:38
  • 56

高斯消去法,列主元高斯法,Doolittle分解法C++程序,解方程组

查看了网上的别人编的程序,yi
  • robert_chen1988
  • robert_chen1988
  • 2014-10-29 13:27:46
  • 2793

线性方程组的求解-列主元消元法,LU分解法,改进的平方根法,追赶法和雅可比迭代,高斯—塞德尔迭代

  • 2010年04月06日 12:34
  • 605KB
  • 下载

LU分解法求解线性方程组

LU分解法求解线性方程组 分类: 数值分析 2007-12-03 10:15 13774人阅读 评论(1) 收藏 举报 output算法matrixvectorstringc...
  • BPSSY
  • BPSSY
  • 2013-11-27 10:07:11
  • 3381
收藏助手
不良信息举报
您举报文章:[计算方法]列主元消去法 LU分解法求线性方程解
举报原因:
原因补充:

(最多只允许输入30个字)