LUP分解法求解线性方程组
本节我们讨论如何用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分解法求解线性方程组相关推荐
- matlab lu解线性方程,MATLAB报告用LU分解法求解线性方程组.doc
MATLAB报告用LU分解法求解线性方程组 <MATLAB>期末大报告 报告内容:用LU分解法求解线性方程组 学院(系): 专 业: 班 级: 学 号: 学生姓名: 2014 年 6 月 ...
- 乔列斯基分解法求线性方程组的MATLAB程序实现
编写的 乔列斯基分解算法的MATLAB 程序如下: 功能:LL分解法求线性方程组AX=b的解调用格式:[X,L]= SymPosl (A,b) 其中, A:线性方程组的系数矩阵: b:线性方程组的常数 ...
- Matlab实现 LU分解法解线性方程组(全选主元列选主元)
选主元LU分解 实验内容:列选主元LU分解和全选主元LU分解求解线性方程组 计算方法: 全选主元消元法 1.1 初始化 根据参数A.b,记录下矩阵.右端项的尺寸n: 以得到的尺寸n初始化解向量x: 同 ...
- 杜利特尔 (Doolittle)矩阵分解法求线性方程组的解
简介 若方阵 A 可以分解为一个下三角矩阵 L 和一个上三角矩阵 U的乘积,即 A = LU,则这种分解称为 A 的一种三角分解或 LU分解.如果 L 为单位下三角矩阵,则称为杜利特尔 (Doolit ...
- 数值分析3-解线性方程组的高斯消去法、LU分解法及列主元消去法的matlab程序和调试方法
对于形如Ax=b的线性方程组,在线性代数中是通过求逆的方式求解的,即x=A-1b,而在数值分析中,解线性方程组的方法是通过直接法或者迭代法来实现的,今天写的三个程序都属于直接法,分别为高斯消去法.LU ...
- IEEE14节点求解系统潮流matlab仿真( PQ分解法)
目录 程序运行结果与IEEE14节点标准测试系统数据比较 设置变量和相关参数 线路和变压器参数矩阵 节点参数矩阵 计算节点导纳矩阵 调整节点编号 计算节点导纳矩阵 PQ解偶迭代 发电机和负荷的注入功率 ...
- doolittle分解法解线性方程
doolittle分解法解线性方程 相比于gauss分解法解线性方程组,doolittle分解法虽然复杂点,但是对于高阶线性方程,处理起来更明了,简洁,目的性更强.A =(a(i,j)),n×n矩阵, ...
- c# lu分解的代码_LU分解法(C语言)
LU 分解法求解线性方程: #include void solve(float l[][100],float u[][100],float b[],float x[],int n) {int i,j; ...
- MATLAB之楚列斯基分解法(九)
楚列斯基分解法 楚列斯基分解是专门针对对称正定矩阵的分解.设A=aij∈Rn×nA=a_{ij}\in R^{n\times n}A=aij∈Rn×n是对称正定矩阵,A=RTRA = R^TRA=R ...
- 用直接分解法求方程组的C语言程序,c语言编程求解线性方程组论文
计算机编程求解线性方程组 第一章 绪 论 在自然科学.工程技术.经济和医学各领域中产生的许多实际问题都可以通过数学语言描述为数学问题,也就是说,由实际问题建立数学模型,然后应用各种数学方法和技巧来求解 ...
最新文章
- vMware vSphere 5.0发布时间
- 异步实现,查询大量数据时的加载
- webstorm 设置jsp支持
- 关于Android Force Close 出现的原因 以及解决方法
- ssl2863-石子合并【dp练习】
- thymeleaf常用语法
- Leetcode每日一题:454.4sum-ii(四数相加Ⅱ)
- 严格单调递增与非严格之间的转换
- 【渝粤教育】国家开放大学2018年秋季 0133-21T大学物理 参考试题
- scala 单例对象 伴生对象
- SpringBoot 集成 Caffeine、Redis实现双重缓存方式(二)
- 为PXI硬件选择合适的设备驱动程序–VISA还是IVI?
- Android_聊天_表情
- 什么是Pythonic?
- eSIM卡业务开通地区
- ios播放本地声音文件
- 刘强东割袍弃兄弟,马爸爸醉心 996
- 对淘宝双飞翼布局的的一点理解
- 重磅!这些高校公布扩招规模,博士将达10万人……
- 微博怎样精准引流?这4点引流方法让用户主动加微信?