LU列主元法解线性方程组

一、 L-U列主元法解线性方程组

1.1 实验原理

定理1:设非奇异,若其顺序主子式均不为零,则存在唯一的单位下三角矩阵L和上三角矩阵U,使得A=LU.

  设A = LU,其中L为一个单位下三角矩阵,U为一个上角矩阵,即

转化为Ly = b及Ux = y的两个三角形方程组,由三角形方程组很容易通过回代方法求解方程组的解。

1.2 算法说明

1.3 流程图

1.4 程序设计说明

1.5 程序例题

1.5.1 实验题目

计算下列线性方程组的解

1.5.2 程序运行结果

1.5.3 手算验证过程

1.6 代码

// Note:Your choice is C++ IDE
#include<iostream>
using namespace std;
#include<math.h>

#define N 3        //矩阵维数,可自定义

double A[N][N] = {1,2,3,5,4,10,3,0.2,5};    //系数矩阵
double B[N] = {1,0,2};        //右端项
double Y[N];         //中间项
double X[N];         //输出
double S[N];         //选取列主元的比较器

int i, j, k;         //计数器

int main()
{
    
    for (k = 0; k < N; k++)
    {
        //选列主元
        int index = k;
        for (i = k; i < N; i++)
        {
            double temp = 0;
            for (int m = 0; m < k; m++)
            {
                temp = temp + A[i][m] * A[m][k];
            }
            S[i] = A[i][k] - temp;
            if (S[index] < S[i])
            {
                index = i;
            }
        }
        //交换行
        double temp;
        for (i = k; i < N; i++)
        {
            temp = A[index][i];
            A[index][i] = A[k][i];
            A[k][i] = temp;
        }
        temp = B[index];
        B[index] = B[k];
        B[k] = temp;
        // 构造L、U矩阵
        for (j = k; j < N; j++)
        {
            double temp = 0;
            for (int m = 0; m < k; m++)
            {

                temp = temp + A[k][m] * A[m][j];
            }
            A[k][j] = A[k][j] - temp;   //先构造U一行的向量
        }
        for (i = k + 1; i < N; i++)
        {
            double temp = 0;
            for (int m = 0; m < k; m++)
            {
                temp = temp + A[i][m] * A[m][k];
            }
            A[i][k] = (A[i][k] - temp) / A[k][k];  //再构造L一列的向量
        }
    }
    //求解LY = B
    Y[0] = B[0];
    for (i = 1; i < N; i++)
    {
        double temp = 0;
        for (int j = 0; j < i; j++)
        {
            temp = temp + A[i][j] * Y[j];
        }
        Y[i] = B[i] - temp;
    }
    //求解UX = Y
    X[N - 1] = Y[N - 1] / A[N - 1][N - 1];
    for (i = N - 2; i >= 0; i--)
    {

        double  temp = 0;
        for (int j = i + 1; j < N; j++)
        {
            temp = temp + A[i][j] * X[j];
        }
        X[i] = (Y[i] - temp) / A[i][i];
    }
    //打印X
    cout << "此方程组的解为:" << endl;
    for (i = 0; i < N; i++)
    {
        cout << X[i] << " ";
    }
    cout << endl;

    return 0;
}
发布了91 篇原创文章 · 获赞 193 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44057443/article/details/103245009