数值分析——三角分解法(LU分解法)C++

这篇具有很好参考价值的文章主要介绍了数值分析——三角分解法(LU分解法)C++。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从例题着手,求解方程组:

10x1+20x2+20x3+50x4=200

50x1+40x2+10x3+10x4=250

30x1+10x2+40x3+20x4=210

20x1+40x2+40x3+40x4=340

根据方程组可以得到系数矩阵Aij[4][4], 通过矩阵A的元素进行LU分解;由Ax=b,从题干得到b[4]矩阵。现在已知了A、b矩阵,再通过LU分解法的递推公式计算出L U矩阵各个元素。

注意:(选用了最笨的办法 )通过LU分解法的递推过程我们知道,要把系数矩阵A分解为L和U,需要先计算出U的第一行和L的第一列,接着计算出U的第二行L的第二列,继续U的第三行L的第三列......以此类推。整个递推的过程不是先计算出U的整个矩阵元素,再计算L的;两者是穿插进行的,直到所有行和列都陆续求出,得到最后完整的L[4][4], U[4][4]。

公式如下:

(1)U第一行,L第一列:u1i=a1i (i=0,1,2...n), li1=ai1/u11

(2)计算U的第r行,L的第r列元素:

     Uri = Ari -  Lrk*Uki, (i=r,r+1,...n);

     Lir = ( Air -  Lik*Ukr)/Urr, i=r+1,....n 且r != n;

(3)求解Ly=b, Ux=y 的计算公式:

y1=b1;

yi = bi -  Lik*yk ,i=2,3,4...n;

xn=yn/Unn;

xi = ( yi -  Uik*xk)/Uii , i=n-1,n-2,...1;

(根据上面公式编写代码)例题代码如下:


double Ai[4][4] = { 10,20,20,50,50,40,10,10,30,10,40,20,20,40,40,40 };  //Ai系数矩阵
double L[4][4] = { 0 }; //L初始化
double U[4][4] = { 0 }; //U初始化
double bi[4] = { 200,250,210,340 };  //b矩阵
double y[4] = { 0 };  //存放Ly=b 的结果y
double x[4] = { 0 }; //存放Ux=y 的最终结果x

void U1i_and_Li1( ) //计算U的第一行U1i,L的第一列Li1
{
    for (int i = 1; i <= 4; i++)
    {
        U[0][i-1] = Ai[0][i-1];
        L[i-1][0] = Ai[i-1][0] / U[0][0];
    }
}
//根据LU分解法递推公式分别计算U的某一行,L的某一列
void Uri(int m )  //形参m表示计算U的某一行
{
    double temp = 0.0;
    for (int r = 2; r <=m; r++)
    {
        for (int j = r; j <= 4; j++)
        {
            for (int k = 1; k <= r - 1; k++)
            {
                
                temp = temp + L[r - 1][k - 1] * U[k - 1][j - 1];
            }
            U[r-1][j-1] = Ai[r-1][j-1] - temp;
            temp = 0.0;
        }
    }
}
void Lir( int m) //m:L的某一列
{
    double temp = 0.0;
    for (int r = 2; r <= m; r++)
    {
        for (int i = r; i <= 4;i++)
        {
            for (int k = 1; k <= r - 1; k++)
            {
                temp = temp + L[i-1][k-1] * U[k-1][r-1];
            }
            L[i-1][r-1] = (Ai[i-1][r-1] - temp) / U[r-1][r-1];
            temp = 0.0;
        }
    }
}
void print(double a[4][4])  //打印结果
{
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            cout << a[i][j] << " ";
            if ((i == 0 || i == 1 || i == 2 || i == 3) && j == 3)
                cout << endl;
        }
    }
}
void yi()  //计算yi
{
    double temp = 0;
    for (int i = 1; i <=4; i++)
    {
        if (i == 1)
            y[0] = bi[0];
        else 
        {
            for (int j = 1; j <=i - 1; j++)
            {
                temp = temp + L[i-1][j-1] * y[j-1];
            }
            y[i - 1] = bi[i - 1] - temp;
            temp = 0;
        }           
    }
}
void xi()  //计算最终结果xi
{
    double temp = 0;
    x[3] = y[3] / U[3][3];
    for (int i = 3; i >=1; i--)
    {
        for (int k = i + 1; k <=4; k++)
        {
            temp = temp + U[i - 1][k - 1] * x[k - 1];
        }
        x[i - 1] = (y[i - 1] - temp) / U[i - 1][i - 1];
        temp = 0;
    }
}

main函数和结果

int main()
{
    U1i_and_Li1();
    cout << "U 的第一行为:" << U[0][0] << " " << U[0][1] << " " << U[0][2] << " " << U[0][3] << endl;
    cout << "L 的第一列为:" << L[0][0] << " " << L[1][0] << " " << L[2][0] << " " << L[3][0] << endl;
    Uri(2);
    Lir(2);
    cout << "U 的第二行为:" << U[1][0] << " " << U[1][1] << " " << U[1][2] << " " << U[1][3] << endl;
    cout << "L 的第二列为:" << L[0][1] << " " << L[1][1] << " " << L[2][1] << " " << L[3][1] << endl;//l12,l22,l32,l42
    Uri(3);
    Lir(3);
    cout << "U 的第三行为:" << U[2][0] << " " << U[2][1] << " " << U[2][2] << " " << U[2][3] << endl;
    cout << "L 的第三列为:" << L[0][2] << " " << L[1][2] << " " << L[2][2] << " " << L[3][2] << endl;
    Uri(4);
    Lir(4);
    cout << "U 的第四行为:" << U[3][0] << " " << U[3][1] << " " << U[3][2] << " " << U[3][3] << endl;
    cout << "L 的第四列为:" << L[0][3] << " " << L[1][3] << " " << L[2][3] << " " << L[3][3] << endl;
    cout << "U矩阵表示为:" << endl;
    print(U);
    cout << "L矩阵表示为:" << endl;
    print(L);
    yi();
    cout << "由Ly=bi计算出y[4]为:" << y[0] << " " << y[1] << " " << y[2] << " " << y[3] << endl;
    xi();
    cout<< "由Ux=y计算出x[4]为:" << x[0] << " " << x[1] << " " << x[2] << " " << x[3] << endl;

    
    return 0;
}

数值分析——三角分解法(LU分解法)C++文章来源地址https://www.toymoban.com/news/detail-484526.html

到了这里,关于数值分析——三角分解法(LU分解法)C++的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数值分析实验】(八)常微分方程的数值解法(含matlab代码)

            科学技术中很多问题都可用常微分方程的定解问题来描述,主要有初值问题和边值问题两大类。常微分方程式描述连续变化的数学语言,微分方程的求解时确定满足给定方程的可微函数,要找出这类问题的解析解往往非常困难,甚至是不可能的。研究一阶常微分方

    2024年02月03日
    浏览(56)
  • <<数值分析>> 第三章线性方程组的迭代解法

            线性方程组的理论求解公式——,在实际应用中面临着两大问题,1是计算过程复杂,2是无法保证算法的稳定性。同时初始数据存在误差,需要寻求能达到精度要求的、操作和计算过程相对简单的求解方法—— 迭代法。    目录 一.迭代法的基本思想 二.基本迭代

    2024年01月25日
    浏览(53)
  • <<数值分析>>第二章线性方程组的直接解法

              解线性方程组是工程数学中最常见的模型之一。所说的“最常见”有两方面的含义: 1)一部分工程问题的本身建立的就是线性方程组模型; 2)较多工程问题建立的非线性方程组模型需要转化为线性方程组的求解。           线性方程组为Ax=b,以下介绍

    2024年02月08日
    浏览(56)
  • 【数值分析实验】(五)线性方程组的迭代解法(含matlab代码)

            迭代法就是用某种极限过程去逐步逼近线性方程精确解的方法。迭代法具有需要计算机的存储单元较少、程序设计简单、原始系数矩阵在计算过程中始终不变等优点,但存在收敛性及收敛速度问题。 3.1.1 算法过程 3.1.2 代码 3.1.3 计算结果 3.2.1 算法过程 3.2.2 代码

    2024年02月03日
    浏览(46)
  • 5.2 构造数值积分公式的基本方法与有关概念的例题分析

      确定求积公式 中的系数,使其具有尽可能高的代数精度。 我的答案: 一、信息 1.给了我一个求积公式 2.确定求积公式中的系数 3.使得这个求积系数具有尽可能高的代数精度。 二、分析 条件1:告诉我这个求积公式具体有3个未知量 条件2:告诉我此次问题解答的目标1是确定

    2024年02月01日
    浏览(49)
  • Python矩阵LU分解

    scipy.linalg 中提供了一系列矩阵分解函数,其中最基础的肯定是LU分解。 LU分解,即使得矩阵 A A A 分解为 L U LU LU ,其中 L L L 为下三角阵, U U U 为上三角阵。对于这两种矩阵, scipy.linalg 中提供了 tril, triu ,可以将第 k k k 条对角线下面或上面的所有元素置零,即可以此获取L矩

    2024年02月08日
    浏览(34)
  • 04 MIT线性代数-矩阵的LU分解 Factorization into A=LU

    目的: 从矩阵的角度理解高斯消元法, 完成 LU 分解得到 A = LU U 为上三角阵(Upper triangular matrix),  L 为下三角阵(Lower triangular matrix), 通过分解得到对角阵 D (diagonal matrix) 设定一组消元矩阵,其中 E31 为单位阵 I ,其它两个消元矩阵如下: row3 -5 newrow2 = row3 -5( row2 -2 row1 )= row3 -

    2024年02月07日
    浏览(41)
  • 线性代数笔记4--矩阵A的LU分解

    1. 矩阵的转置 1.1 定义 矩阵的转置,即矩阵的行列进行互换。 A = [ 1 2 3 4 5 6 ] A= begin{bmatrix} 1 2 3 \\\\ 4 5 6\\\\ end{bmatrix} A = [ 1 4 ​ 2 5 ​ 3 6 ​ ] 矩阵 A A A 的转置 B = A ⊤ = [ 1 4 2 5 3 6 ] B=A^top= begin{bmatrix} 1 4\\\\ 2 5\\\\ 3 6 end{bmatrix} B = A ⊤ = ​ 1 2 3 ​ 4 5 6 ​ ​ 1.2 性质 ( A ⊤ ) ⊤ = A

    2024年04月13日
    浏览(43)
  • MIT - 线性代数-LU_LDU分解|单位矩阵

    U为消元结果(行变换),L为行变换矩阵的逆矩阵 D为主元(Pivot)A的主对角线元素,在这里为2、3,U为对D做列变换使其得到LU中的U 为什么要写成A=LU而不是E21A=U呢?因为A=LU中L只包含行变换信息,E21A=U还有额外的数字 2×2 2 3×3 3×2=6 4×4 4×3×2=24 结论:单位矩阵的逆=转置矩阵(

    2024年01月23日
    浏览(48)
  • C语言——利用矩阵LU分解法求逆、行列式

    本章介绍了LU分解法,以及如何利用LU分解法求逆、行列式,针对每个公式、原理、代码进行了详细介绍,希望可以给大家带来帮助。 LU分解法与高斯法求逆一样,可以进行较高维数的矩阵运算(可计算万维及以上,但是精度不能保证,并且占有内存大,高维矩阵需要进行分块

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包