数值分析——LU分解(LU Factorization)

2023-10-28

本系列整理自博主21年秋季学期本科课程 数值分析I 的编程作业,内容相对基础,参考书: David Kincaid, Ward Cheney - Numerical Analysis Mathematics of Scientific Computing (2002, Americal Mathematical Society)

目录

背景

LU分解(LU-Factorization)

辅助部分

Doolittle分解

Cholesky分解

定理

(1)Theorem on LU Factorization

(2)Cholesky Theorem on LL^t Factorization


背景

考虑线性方程组Ax=b:

\begin{bmatrix} a_{11} &a_{12} &\dots & a_{1n}\\ a_{21} &a_{22} &\dots & a_{2n} \\ \vdots & \vdots & \ddots &\vdots \\ a_{n1} & a_{n2} &\dots & a_{nn} \end{bmatrix} \begin{bmatrix} x_1\\ x_2\\ \vdots\\ x_n\\ \end{bmatrix} = \begin{bmatrix} b_1\\ b_2\\ \vdots\\ b_n\\ \end{bmatrix}

易知,若矩阵A为下三角或上三角矩阵时,容易解出x

如A为下三角矩阵,则通过向前迭代算法(forward substitution)求解:

\bold{input}\ n,(a_{ij}),(b_i) \\ \bold{for}\ i=1\ \bold{to}\ n\ \bold{do} \\ \quad x_i\ \leftarrow \ (b_i-\sum_{j=1}^{i-1}a_{ij}x{j})/a_{ii}\\ \bold{end\ do}\\ \bold{output}\ (x_i)

因此,若A可以分解为下三角矩阵L和上三角矩阵U的乘积:

Ax=LUx=Lz=b

 L=\begin{bmatrix} l_{11} & 0 & \dots & 0\\ l_{21} & l_{22}& \dots &0\\ \vdots& \vdots &\ddots & \vdots\\ l_{n1}& l_{n2} & \dots &l_{nn} \end{bmatrix},\ U=\begin{bmatrix} u_{11} & u_{12} & \dots & u_{1n}\\ 0 & u_{22}& \dots &u_{2n}\\ \vdots& \vdots &\ddots & \vdots\\ 0& 0 & \dots &u_{nn} \end{bmatrix}

通过求解Lz=b,再求解Ux=z,得到方程组的解x,从而线性方程组求解问题化为如何对矩阵A做LU分解的问题。

LU分解(LU-Factorization)

对于一个矩阵A可以有无数种LU分解方式,常见的有三种:

(1)Doolittle分解:L为单位下三角阵,即L对角元皆为1

(2)Crout分解:U为单位上三角阵,即U对角元皆为1

(3)Cholesky分解:U=L的转置,有L,U对角元相等

以下给出Doolittle分解和Cholesky分解算法。

辅助部分

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<iomanip>
using namespace std;
#define N 7//matrix dimension
void Print(double M[N][N]) {//print matrix M
	cout << " ";
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cout << setw(13) << M[i][j];
			if (j == N-1) {
				cout << " " << endl;
				cout << " ";
			}
		}
	}
}
void Multi(double L[N][N], double U[N][N]) {
	double M[N][N] = { 0 };//M=LU
	for (int i = 0; i < N; i++) {
		for (int j = 0; j <N; j++) {
			for (int k = 0; k < N; k++) {
				M[i][j] += L[i][k] * U[k][j];
			}
		}
	}
	cout << " LU" << endl;
	Print(M);
}

Doolittle分解

void DoolittleFactorization(double A[N][N]) {//apply Doolittle factorization on matrix A
	double L[N][N] = { 0 }, U[N][N] = { 0 };
	for (int k = 0; k < N; k++) {
		if (k == 0) {
			for (int j = 0; j < N; j++) {
				U[0][j] = A[0][j];
				L[j][0] = A[j][0] / U[0][0];
			}
		}
		else {
			L[k][k] = 1;
			for (int i = k; i < N; i++) {
				for (int j = 0; j < k; j++) {
					U[k][i] += L[k][j] * U[j][i];
					if (i + 1 < N) {
						L[i + 1][k] += L[i + 1][j] * U[j][k];
					}
				}
				U[k][i] = (A[k][i] - U[k][i]) / L[k][k];
				if (i + 1 < N) {
					L[i + 1][k] = (A[i + 1][k] - L[i + 1][k]) / U[k][k];
				}
				
			}
		}
		
	}
	cout << "  Doolitte Factorization:" << endl;
	cout << " L" << endl;
	Print(L);
	cout << endl;
	cout << " U" << endl;
	Print(U);
	cout << endl;
	Multi(L, U);
	cout << endl;
}

Cholesky分解

void CholeskyFactorization(double A[N][N]) {
	double L[N][N] = { 0 }, U[N][N] = { 0 };
	for (int k = 0; k < N; k++) {
		if (k == 0) {
			L[0][0] = U[0][0] = sqrt(A[0][0]);
			for (int m = 1; m < N; m++) {
				L[m][0] = U[0][m] = A[0][m] / L[0][0];
			}
		}
		else {
			for (int i = k; i < N; i++) {
				for (int j = 0; j < k; j++) {
					U[k][i] += L[k][j] * U[j][i];
				}
				if (i == k) {
					L[i][k] = U[k][i] = sqrt(A[k][i] - U[k][i]);
				}
				else {
					L[i][k] = U[k][i] = (A[k][i] - U[k][i]) / L[k][k];
				}
			}
		}
	}
	cout << "  Cholesky Factorization:" << endl;
	cout << " L" << endl;
	Print(L);
	cout << endl;
	cout << " U" << endl;
	Print(U);
	cout << endl;
	Multi(L, U);
    cout << endl;
}

定理

(1)Theorem on LU Factorization

若n*n阶矩阵A的n个顺序主子式非奇异,则A有LU分解。

(2)Cholesky Theorem on LL^t Factorization

若A 实值,对称,正定,则A有唯一的分解A=LL^t,其中L为对角为正数的下三角矩阵,L^t表示矩阵L的转置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数值分析——LU分解(LU Factorization) 的相关文章

  • 如何使用 C# 打印 pdf

    我在 C 应用程序中使用 进程 打印 pdf 文件 但是我无法获取打印状态 我发现可以通过 System management 和 System printing 与打印机 队列进行交互 我做了很多尝试 但都出错了使用这两个命名空间但无法打
  • 以编程方式 Godaddy 发送的电子邮件不在“已发送邮件”文件夹中 C#.net

    我正在通过以下方式发送电子邮件ASP NET代码使用godaddy邮件服务器 邮件发送成功 但未存储在已发送邮件文件夹中 我正在使用下面的代码 SmtpClient client new SmtpClient client Host smt
  • 在 MVC 类上创建主键字段

    我是 MVC 和 C 新手 我只是偶然发现它并发现它很有趣 我遇到了一个不允许我继续的问题 这是我的代码 using System using System Collections Generic using System Linq usi
  • 此插件导致 Outlook 启动缓慢

    我正在使用 C NET 4 5 开发 Outlook Addin 项目 但部署后 有时 Outlook 会禁用我的插件 并显示此消息 这个插件导致 Outlook 启动缓慢 我不知道我的插件出了什么问题 这只有很少的代码 并且ThisAdd
  • C++:获取注册表值仅给出第一个字符[重复]

    这个问题在这里已经有答案了 我试图从注册表中获取字符串值 但我只得到第一个字母 HKEY hKey char gamePath MAX PATH if RegOpenKeyEx HKEY CURRENT USER L Software Bl
  • 使用 QSet 作为 Qt 地图容器中的键

    我需要一个映射 其中键是唯一的 并且每个键都是一组或自定义 POD 结构 其中包含 3 个数据项 这些值只是指向对象实例的指针 从阅读Qt 的 QMap 与 QHash 的文档 http qt project org doc qt 4 8
  • 禁用除滚动之外的 DataGridView

    我如何配置 datagridview 以便用户只能在行中移动并使用滚动 而没有其他 如果我禁用网格不允许我使用滚动 将您的 datagridview 设置为只读 这将禁用任何编辑 dataGridView1 ReadOnly true 在你
  • 如何在 C++ 的子目录中创建文件?

    这是我的代码 如何在子目录联系人中创建文件 每次创建该文件时 它都会出现在与我的程序相同的目录中 int main ofstream myfile contacts myfile open a myfile close 在构造函数中指定完整
  • 实体框架7审计日志

    我正在将一个旧项目移植到 ASP NET 5 和 Entity Framework 7 我使用数据库优先方法 DNX 脚手架 来创建模型 旧项目基于Entity Framework 4 审计跟踪是通过重写实现的SaveChanges的方法D
  • 使用正则表达式匹配以“Id”结尾的单词?

    如何组合一个正则表达式来匹配以 Id 结尾的单词并进行区分大小写的匹配 试试这个正则表达式 w Id b w 允许前面的单词字符Id和 b确保Id位于单词末尾 b是字边界断言
  • 使用 Microsoft Graph 创建用户

    如何使用 Microsoft graph 创建用户 因为我在保存过程中遇到了权限失败的问题 我确实有几个问题 在图中调用创建用户 API 将在哪里创建用户 是在 Azure AD 还是其他地方 我尝试通过传递 json 和必需的标头来调用创
  • 使用对象列表构建树

    我有一个带有属性 id 和parent id 的对象列表 我想建造一棵树来连接那些孩子和父母 1 个父对象可以有多个子对象 并且有一个对象将成为所有对象的祖先 实现该功能最快的算法是什么 我使用 C 作为编程语言 但其他语言也可以 像这样的
  • 在 C# 中生成随机值

    如何使用以下命令生成随机 Int64 和 UInt64 值RandomC 中的类 这应该可以解决问题 这是一个扩展方法 因此您可以像调用普通方法一样调用它Next or NextDouble上的方法Random目的 public stati
  • IEnumerable.比带中断的 for 循环更快吗?

    我们的代码打开表单时遇到了一些缓慢的情况 这可能是由于for循环与break这需要很长时间才能执行 我把它切换到IEnumerable Any 并看到表格很快打开 我现在试图弄清楚是否单独进行此更改会提高性能 或者是否正在访问Product
  • 为什么我的 ITexthandler 不工作?我正在尝试将 XML 解析为 ITextSharp 文档

    我正在使用 Visual Developer 2010 MVC 3 c 我正在尝试将 XML 解析为 iTextSharp 文档 如下所示 ITextHandler textHandler new ITextHandler doc text
  • 如何使用eclipse构建C++应用程序

    我已经从以下位置下载了 Eclipse Juno for C here http www eclipse org downloads download php file technology epp downloads release ju
  • 检索 Autofac 容器以解析服务

    在 C WindowForms 应用程序中 我启动一个 OWIN WebApp 它创建另一个类 Erp 的单例实例 public partial class Engine Form const string url http 8080 49
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • Intel 和 AMD 处理器有相同的汇编程序吗?

    C语言被用来编写Unix以实现可移植性 使用不同编译器编译的同一个C语言程序会产生不同的机器指令 为什么 Windows 操作系统能够在两者上运行Intel https en wikipedia org wiki Intel and AMD
  • Crypto++ 和压缩 EC 密钥

    如何在 Crypto 中生成压缩的 ECDSA 密钥 AutoSeededRandomPool prng ECDSA

随机推荐

  • 企业数字化转型之道:3L8P转型模型

    作者 韩磊 摘要 数字化转型的本质是 在 数据 算法 定义的世界中 以数据服务的流动 化解复杂系统的不确定性 优化资源配置效率 企业数字化转型的本质则是以需求为中心 以数据为资产 以技术为手段 以人才为依托 快速构建能满足客户需求的 支持业
  • Java IO流

    1File类 java io File类 文件和文件目录路径的抽象表示形式 与平台无关 File 能新建 删除 重命名文件和目录 但 File不能访问文件内容本身 如果需要访问文件内容本身 则需要使用输入 输出流 想要在Java程序中表示一
  • 微信小程序之数据的同步渲染

    微信小程序之数据的同步渲染 结论 微信小程序通过setData方法实现数据的同步渲染 直接修改data无法实现同步渲染 setData工作原理 小程序分为逻辑层和渲染层 而每次逻辑层改变了 要借用Native运行 小程序的渲染层和逻辑层由两
  • ExayExcel 阿里出品的ExayExcel

    1 首先引入依赖
  • cJSON笔记——三种结构的cJSON数组

    最近的项目中 涉及对cJSON库的使用 特别是不同结构的cJOSN数组的运用 在此小结以下 1 指定 路径 文件类型 文件名 读取整个文本 brief param file dir 文件所在的路径 param file name 文件名 p
  • 模型参数量(Parameters)和计算量(FLOPs)获取【使用thop】

    Tips 针对部分开源代码没有提供相关计算网络参数量和计算量的代码 这里给出一个通用的获取网络的参数量和计算量的方法 使用thop即可快速获取 1 模型参数量和计算量 参数量 params 即为网络模型中含有多少个参数 与输入的数据无关 主
  • win11热点提示我们无法设置热点

    问题还原 首先是连接win11的热点时 手机总是显示正在获取IP地址 然后连不上 之前都好好的 也没干过啥 或者选择性失忆 然后一通瞎操作 把电脑IP都给整成自动ip去了 初步估计是点了 网络重置 了如图 公司设置了固定ip 接下来就难受了
  • vue+iview 进行table表格数据的更新显示,局部刷新

    hello 在这个新做了一个网站 想提高一下权重 麻烦看见的给我点一下哦 是吉他乐谱分享的哦 www lsjita com 使用vue iview进行vue后台管理系统 对iview不太熟悉 然后就出现了好多问题 上一个有记录 这个来区分一
  • HaaS Python + AI 隆重登场 使用 ESP32 + 摄像头 机器视觉实现水果识别

    水果识别系统 现在很多农场里边使用摘采机器人识别水果进行水果摘采 盒马超市也使用自动识别称来识别水果种类自动计费 本案例则是使用HaaS Python对摄像头图像进行采集 并调用HaaS云端积木能力对水果进行识别 1 背景知识 水果的种类繁
  • 【AI实战】快速搭建中文 Alpaca 33B 大模型 Chinese-Alpaca-33B

    AI实战 快速搭建中文 Alpaca 33B 大模型 Chinese Alpaca 33B 中文 33B 大模型 Chinese Alpaca 33B 环境配置 搭建过程 1 拉取 chinese alpaca lora 33b 2 合并l
  • 【python学习笔记】seaborn模块

    目录 热力图介绍 seaborn模块绘制热力图 热力图介绍 热力图是一种特殊的图表 它是一种通过对色块着色来显示数据的统计图表 在绘图时 需要指定每个颜色映射的规则 一般以颜色的强度或色调为标准 比如颜色越深的表示数值越大 程度越深 颜色越
  • spark运行报错:(null) entry in command string: null chmod 0644

    在WIndows操作系统中本地运行spark程序 报以下错误 null entry in command string null chmod 0644 后面是目的目录 解决方法 下载hadoop dll文件 并拷贝到c windows sy
  • JS中的call()和apply()方法和区别

    一 方法定义 apply 调用一个对象的一个方法 用另一个对象替换当前对象 例如 B apply A arguments 即A对象应用B对象的方法 call 调用一个对象的一个方法 用另一个对象替换当前对象 例如 B call A args
  • 分析996个词根在各大考纲词汇中的作用(五)总结精选篇

    CET4 CET6 GRE IELTS TOEFL 考研英语总的词汇量为14055 分析词根总数为996 有11544个单词分布在这些词根中 剩下的2511个词汇没有任何词根信息 本文精选5206个跟词根结合最紧密的单词 superword
  • KVM的HVM虚拟机使用非串口方式建立virsh console 连接

    在去年写的文章中 http blog csdn net dobell article details 14442457 写到了怎么利用serial 设备进行console连接 不过比较麻烦 因为1 需要修改虚拟机内部的grub启动选项 2
  • unity学习笔记-有关打包安卓apk的一些注意事项

    unity学习笔记 有关打包安卓apk的一些注意事项 打包到build project的时候报错 报错信息里出现了jdksdk等 打包报错显示andriodfestxml文件版本有问题 有关urp线管环境打包的时候的一些注意事项 在编辑器里
  • 一款开源的文件搜索神器,终于不用记 find 命令了

    Python微信订餐小程序课程视频 https blog csdn net m0 56069948 article details 122285951 Python实战量化交易理财系统 https blog csdn net m0 5606
  • pppd程序的参数——man手册翻译

    文章目录 pppd全称 摘要 描述 常用的选项 ttyname 串口名 speed 波特率 asyncmap map auth call name connect script 连接脚本 crtscts defaultroute defau
  • chatgpt赋能python:Python处理Word文档

    Python处理Word文档 介绍 Microsoft Word是业界最流行的办公文档编辑工具之一 对于文档处理工作 Word是必不可少的工具之一 然而 尽管Word是十分强大的 但在处理大量数据时 手动处理每个文件是费时费力的 幸运的是
  • 数值分析——LU分解(LU Factorization)

    本系列整理自博主21年秋季学期本科课程 数值分析I 的编程作业 内容相对基础 参考书 David Kincaid Ward Cheney Numerical Analysis Mathematics of Scientific Comput