本节我们讨论如何用LUP分解法求解线性方程组,对于含有n个未知变量x1,x2,x3,…,xn的线性方程组:

同时满足方程组中所有方程的一个数值集:x1,x2,…,xn称为方程组的解。

将方程组改写成矩阵向量等式:

记为:

Ax=b

如果A为非奇异矩阵,那么A存在逆矩阵,亦即方程组有解。

LUP分解的思想是找出三个n*n的矩阵,L、U和P,满足

PA=LU

其中,L是一个单位下三角矩阵,U是一个上三角矩阵,P是一个置换矩阵。则称满足上述等式的L、U和P为矩阵A的LUP分解

等式Ax=b两边同乘以P,变形为PAx=Pb,亦即:

LUx=Pb

设y=Ux,其中x就是我们要求的向量解。我们首先通过正向替换求解下三角系统:

Ly=Pb

得到未知变量y。然后,通过正向替换求解上三角系统:

Ux=y

得到未知变量x。

由于置换矩阵P是可逆的,等式PA=LU两边同乘以P-1,得:

A=P-1LU

=P-1Ly

=P-1Pb

=b

于是x就是Ax=b的解。

调用方法:

    linear::CLinearEqualtion l(3);l.init_A("A.txt");l.init_b("b.txt");l.lu_decomposition();l.lup_solve();l.show_y();l.show_x();l.save_solution();

C++实现:

#include <iostream>
#include <vector>
#include <cassert>
#include <fstream>using namespace std;namespace linear
{
#define array_1(__type) std::vector<__type>
#define array_2(__type) std::vector<array_1(__type)>class CLinearEqualtion{/*使用方法:1. 定义计算方程组的类对象,并初始化其系数矩阵的大小linear::CLinearEqualtion l(3);2. 读取系数阵 Al.init_A("A.txt");3. 读取 bl.init_b("b.txt");4. 对系数矩阵进行lu分解l.lu_decomposition();5. 求解方程组l.lup_solve();6. 显示反向替换的解l.show_y();7. 显示正向替换的解l.show_x();8. 保存方程的解l.save_solution();A.txt1    5    42    0    35    8    2b.txt1295x[0] = -0.157895x[1] = -0.0526316x[2] = 3.10526*/private:array_2(double) A;array_2(double) L;array_2(double) U;array_1(double) b;array_1(int) p;array_1(double) x;array_1(double) y;public:CLinearEqualtion(int n){assert(n>1);A = array_2(double)(n);L = array_2(double)(n);U = array_2(double)(n);for (int i= 0; i < n;i++){A[i] = array_1(double)(n);L[i] = array_1(double)(n);U[i] = array_1(double)(n);}b = array_1(double)(n);x = array_1(double)(n);y = array_1(double)(n);p = array_1(int)(n);} // !CLinearEqualtion(int n)virtual ~CLinearEqualtion(){} // !virtual ~CLinearEqualtion()public:void init_A(array_2(double) _A){for (int i = 0; i < _A.size(); i++)A[i].assign(_A[i].begin(), _A[i].end());} // !void init_A(array_2(double) _A)void init_A(std::string _fileName){std::ifstream in(_fileName.c_str());int i = 0;int j = 0;while(!in.eof()){double e = 0;in>>e;std::cout<<e<<std::endl;A[i][j] = e;if (j==A.size() - 1){i++;j = 0;}else{j++;}}} // !void init_A(std::string _fileName)void init_b(std::string _fileName){std::ifstream in(_fileName.c_str());int i = 0;while(!in.eof()){double e = 0;in>>e;std::cout<<e<<std::endl;b[i++] = e;}} // !void init_b(std::string _fileName)void lu_decomposition(){int n = A.size(); // get array sizefor (int i = 0; i < n; i++)p[i] = i;for (int k = 0; k < n; k++){int max = 0;int k_ = k;// get max e in col k.for (int i = k; i < n; i++){if (fabs(A[i][k]) > max){max = fabs(A[i][k]);k_ = i;}}// make sure not all is zero.if (max == 0)assert("singular matrix");// swap cur row,max row.if (k != k_){swap(p[k], p[k_]);for (int i = 0; i < n; i++)swap(A[k][i], A[k_][i]);                    }for (int i = k + 1; i < n; i++){// gen vA[i][k] /= A[k][k];for (int j = k + 1; j < n; j++){A[i][j] -= A[i][k] * A[k][j];}}}init_LU();} // !void lu_decomposition()void init_LU(){int n = A.size(); // get array sizefor (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (i > j){L[i][j] = A[i][j];} else{U[i][j] = A[i][j];if (i == j)L[i][i] = 1;}}}} // !void init_LU()void lup_solve(){int n = A.size();int i = 0, j = 0;for (i = 0; i < n; i++){x[i] = 0;y[i] = 0;}for (i = 0; i < n; i++){y[i] = b[p[i]];for (j = 0; j < i; j++)y[i] -= L[i][j] * y[j];}for (i = n - 1; i >= 0; i--){double delt = y[i];for (j = n - 1; j > i; j--)delt -= U[i][j] * x[j];x[i] = delt / U[i][j];}} // !void lup_solve()void show_y(){int n = A.size();std::cout << "###" << std::endl;for (int i = 0; i < n; i++){std::cout << "y[" << i << "]=" << y[i] << std::endl;}} // !void show_y()void show_x(){int n = A.size();std::cout << "###" << std::endl;for (int i = 0; i < n; i++)std::cout << "x[" << i << "]=" << x[i] << std::endl;} // !void show_x()void save_solution(){int n = A.size();ofstream out("result.txt", ios::out);out << "-------------------------------------" << std::endl;std::cout << "-------------------------------------" << std::endl;for (int i = 0; i < n; i++){                out << "x[" << i << "] = " << x[i]<< std::endl;std::cout << "x[" << i << "] = " << x[i]<< std::endl;}out << "-------------------------------------" << std::endl;std::cout << "-------------------------------------" << std::endl;out.close();}};
}

链接:http://pan.baidu.com/s/1hqJes4k 密码:elwz

转载于:https://www.cnblogs.com/BigBigLiang/p/4962553.html

LUP分解法求解线性方程组相关推荐

  1. matlab lu解线性方程,MATLAB报告用LU分解法求解线性方程组.doc

    MATLAB报告用LU分解法求解线性方程组 <MATLAB>期末大报告 报告内容:用LU分解法求解线性方程组 学院(系): 专 业: 班 级: 学 号: 学生姓名: 2014 年 6 月 ...

  2. 乔列斯基分解法求线性方程组的MATLAB程序实现

    编写的 乔列斯基分解算法的MATLAB 程序如下: 功能:LL分解法求线性方程组AX=b的解调用格式:[X,L]= SymPosl (A,b) 其中, A:线性方程组的系数矩阵: b:线性方程组的常数 ...

  3. Matlab实现 LU分解法解线性方程组(全选主元列选主元)

    选主元LU分解 实验内容:列选主元LU分解和全选主元LU分解求解线性方程组 计算方法: 全选主元消元法 1.1 初始化 根据参数A.b,记录下矩阵.右端项的尺寸n: 以得到的尺寸n初始化解向量x: 同 ...

  4. 杜利特尔 (Doolittle)矩阵分解法求线性方程组的解

    简介 若方阵 A 可以分解为一个下三角矩阵 L 和一个上三角矩阵 U的乘积,即 A = LU,则这种分解称为 A 的一种三角分解或 LU分解.如果 L 为单位下三角矩阵,则称为杜利特尔 (Doolit ...

  5. 数值分析3-解线性方程组的高斯消去法、LU分解法及列主元消去法的matlab程序和调试方法

    对于形如Ax=b的线性方程组,在线性代数中是通过求逆的方式求解的,即x=A-1b,而在数值分析中,解线性方程组的方法是通过直接法或者迭代法来实现的,今天写的三个程序都属于直接法,分别为高斯消去法.LU ...

  6. IEEE14节点求解系统潮流matlab仿真( PQ分解法)

    目录 程序运行结果与IEEE14节点标准测试系统数据比较 设置变量和相关参数 线路和变压器参数矩阵 节点参数矩阵 计算节点导纳矩阵 调整节点编号 计算节点导纳矩阵 PQ解偶迭代 发电机和负荷的注入功率 ...

  7. doolittle分解法解线性方程

    doolittle分解法解线性方程 相比于gauss分解法解线性方程组,doolittle分解法虽然复杂点,但是对于高阶线性方程,处理起来更明了,简洁,目的性更强.A =(a(i,j)),n×n矩阵, ...

  8. c# lu分解的代码_LU分解法(C语言)

    LU 分解法求解线性方程: #include void solve(float l[][100],float u[][100],float b[],float x[],int n) {int i,j; ...

  9. MATLAB之楚列斯基分解法(九)

    楚列斯基分解法 楚列斯基分解是专门针对对称正定矩阵的分解.设A=aij∈Rn×nA=a_{ij}\in R^{n\times n}A=aij​∈Rn×n是对称正定矩阵,A=RTRA = R^TRA=R ...

  10. 用直接分解法求方程组的C语言程序,c语言编程求解线性方程组论文

    计算机编程求解线性方程组 第一章 绪 论 在自然科学.工程技术.经济和医学各领域中产生的许多实际问题都可以通过数学语言描述为数学问题,也就是说,由实际问题建立数学模型,然后应用各种数学方法和技巧来求解 ...

最新文章

  1. SQLErrorCodeSQLExceptionTranslator 使用以下的匹配规则
  2. 厉害了,比Transformer还好用!
  3. 万亿“中植系”掌门人、毛阿敏丈夫离世,享年61岁,身家260亿
  4. DataFrame 重新设置索引: reindex 和 reset_index 的区别
  5. define宏定义和const常量定义之间的区别
  6. bom sap 替代项目_SAP BOM替代物料讲解
  7. linux开发屏幕保护代码,使用xscreensaver编写屏幕保护程序的提示和技巧?
  8. 超级超级实用的整个网页截图技巧
  9. 决定局域网特性的三要素
  10. 【洛谷】P1427 小鱼的数字游戏
  11. 微软Azure动手实验营4月课程预告
  12. IDA安卓动调 模拟器手机(详细)
  13. c语言 自动生成word文件,C#根据Word模版生成Word文件
  14. android 系统下拉菜单,【MotoX评测】原生Android5.0下拉菜单和基础设置_Moto X_手机评测-中关村在线...
  15. STM32C8T6之按键检测
  16. h3c交换机绑定在线计算机的命令,H3C 3100交换机怎么IP绑定MAC
  17. Android 系统开发
  18. 李政軒Cheng-Hsuan Li的关于机器学习一些算法的中文视频教程
  19. 为何热爱机器人工程专业的朋友如此少
  20. 【卷指南】科研工作团队协作避坑指南

热门文章

  1. Udacity DNN
  2. stream流倒序排序_Stream流排序
  3. 任正非自称不如钱伯斯!钱伯斯究竟是何许人?
  4. 张勇2020年淘宝抓刷单模型-引进区块链技术防虚假交易
  5. 计算机处理器性能排名,2020最新电脑cpu性能天梯图_i5i7i9处理器性能排行榜介绍...
  6. svg之defs以及use的使用
  7. 计算机网络 谢希仁(第8版)第五章习题答案
  8. 十分钟带你解读Effective C++(导读)
  9. 新浪云sae部署php,如何在新浪云 SAE 上安装部署 Laravel 5.1 应用并测试数据库连接...
  10. Python 获取Windows关机消息