Doolittle三角矩阵分解

2024-02-12 21:30
文章标签 矩阵 分解 三角 doolittle

本文主要是介绍Doolittle三角矩阵分解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有关Doolittle三角矩阵分解的思路和代码实现。

什么是Doolittle分解

首先对一个行列式不为零的矩阵来说,一定可以通过初等行变换 将 该矩阵转化成一个初等矩阵和一个上三角矩阵相乘的形式。
A = L ⋅ U A=L\cdot U A=LU
此时如果L 是一个单位下三角矩阵 ,表明矩阵A 可以进行Doolittle 分解 ,当然,Doolittle分解的三角形 并不唯一;
设矩阵D是 可逆对角矩阵,则有
D ⋅ D − 1 = E D \cdot D^{-1}=E DD1=E,故
A = L ⋅ D ⋅ D − 1 ⋅ U A=L\cdot D \cdot D^{-1} \cdot U A=LDD1U
同时,又可变化为

A = ( L ⋅ D ) ⋅ ( D − 1 ⋅ U ) A=(L\cdot D )\cdot( D^{-1} \cdot U) A=(LD)(D1U)
就相当于,又产生了一组 L 和 U。
Doolittle 分解唯一的充要条件是 N-1 阶顺序主子式大于零,如果在n-1阶子式中有不为零的项,可通过初等行变换,消除这种现象。

使用程序进行矩阵分解。

首先将一个矩阵分解为两个矩阵的乘积可以通过待定系数法 进行实现,矩阵如下所示。

{ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 } = { 1 0 0 l 21 1 0 l 31 l 32 1 } ⋅ { r 11 r 12 r 13 0 r 22 r 23 0 0 r 33 } \left\{ \begin{matrix} a_{11}& a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{matrix} \right\} =\left\{ \begin{matrix} 1& 0 & 0 \\ l_{21} & 1 & 0 \\ l_{31} & l_{32} & 1 \end{matrix} \right\} \cdot \left\{ \begin{matrix} r_{11}& r_{12} & r_{13} \\ 0 & r_{22} & r_{23} \\ 0 & 0 & r_{33} \end{matrix} \right\} a11a21a31a12a22a32a13a23a33=1l21l3101l32001r1100r12r220r13r23r33
容易求得 矩阵L的第一列和矩阵U的第一行比较容易计算,即 满足如下公式

{ r 1 , j = a 1 , j j ⊂ { 1 , 2 , 3... n } l i , 1 = a i , 1 a 1 , 1 j \begin{cases} r_{1 ,j} =a_{1,j} & j \subset \{1,2,3...n\} \\ l_{i,1}= \frac{a_{i,1}}{a_{1,1}} & j \end{cases} {r1,j=a1,jli,1=a1,1ai,1j{1,2,3...n}j
同时此公式可以作为矩阵的初始化 使用。
下面开始计算非特殊位置
{ r i , j = a i , j − ∑ m = 1 i − 1 l i , m ⋅ r m , j i ⊂ { 2 , 3 , . . n } , j ⊂ { i , i + 1... n } l j , i = a j , i − ∑ m = 1 i − 1 l j , m ⋅ r m , i i ⊂ { 2 , 3 , . . n − 1 } , j ⊂ { i + 1... n } \begin{cases} r_{i,j}=a_{i,j}-\sum_{m=1}^{i-1}l_{i,m}\cdot r_{m,j} &i \subset\{2,3,..n\},j \subset\{i,i+1...n\}\\ \\ l_{j,i}=a_{j,i}-\sum_{m=1}^{i-1}l_{j,m}\cdot r_{m,i} &i \subset\{2,3,..n-1\},j \subset\{i+1...n\}\\ \end{cases} ri,j=ai,jm=1i1li,mrm,jlj,i=aj,im=1i1lj,mrm,ii{2,3,..n},j{i,i+1...n}i{2,3,..n1},j{i+1...n}
经过分析可知 ,求元素l或r的任意元素,只和其所在行列的上层元素有关,如
将l和u矩阵合并在一起,就会有如下结果
{ r 11 r 12 r 13 l 21 r 22 r 23 l 31 l 32 r 33 } \left\{ \begin{matrix} r_{11}& r_{12} & r_{13} \\ l_{21} & r_{22} & r_{23} \\ l_{31} & l_{32} & r_{33} \end{matrix} \right\} r11l21l31r12r22l32r13r23r33
如果求 r 22 r_{22} r22 就需要知道 r 12 r_{12} r12 l 21 l_{21} l21的值,即
在这里插入图片描述所以说,我们可以用迭代的方式求出两个矩阵的所有元素。

同时,i和j,k的元素有重叠的部分,可以放在一个for循环之下执行。
{ i ⊂ { 2 , 3 , . . n } j ⊂ { i , i + 1... n } \begin{cases} i \subset\{2,3,..n\}\\j \subset\{i,i+1...n\} \end{cases} {i{2,3,..n}j{i,i+1...n}
{ i ⊂ { 2 , 3 , . . n − 1 } , j ⊂ { i + 1... n } \begin{cases} i \subset\{2,3,..n-1\},\\j \subset\{i+1...n\} \end{cases} {i{2,3,..n1},j{i+1...n}

取重合部分 , i ⊂ [ 2 , 3 , . . n − 1 ] , j ⊂ [ i + 1 , i + 2..... n ] i\subset[2,3,..n-1],j\subset[i+1,i+2.....n] i[2,3,..n1],j[i+1,i+2.....n] 进行大循环,同时我们可以使用if 判断 来去除一些元素

#初始化 第一行 和第一列
lu[0]=A[0]
for i in range(1,n):# n 是矩阵的阶数lu[i][0]=A[i][0]/A[0][0]
# 初始化结束,求其他数值
for  i in range(1,n):for j in range(i,n):lu[i][j]=A[i][j]-sum([lu[i][k]*lu[k][j] for k in range(0,i)])if i< n-1 and j!=i:# 通过判断排除 这里是由ij 代替了klu[j][i]=(A[j][i]-sum([lu[j][k]*lu[k][i] for k in range(0,i)]))/lu[i][i]

完整代码

# Doolittle.py
A=[[2,2,-5],[1,-3,1],[1,5,2]]
A=[[2,-1,0,1],[1,3,0,1],[0,1,-1,2],[1,0,0,1]]
n=len(A)
# //创建一个和矩阵A同阶的矩阵
lu=[[0 for i in range(n)] for j in range(n)]
# 初始化
lu[0]=A[0]
for i in range(1,n):lu[i][0]=A[i][0]/A[0][0]
# 初始化结束
for  i in range(1,n):for j in range(i,n):lu[i][j]=A[i][j]-sum([lu[i][k]*lu[k][j] for k in range(0,i)])if i< 4-1 and j!=i:lu[j][i]=(A[j][i]-sum([lu[j][k]*lu[k][i] for k in range(0,i)]))/lu[i][i]#将大矩阵可视化分解
L=[[0 for i in range(n)] for j in range(n)]
U=[[0 for i in range(n)] for j in range(n)]
for  i in range(0,n):for j in range(0,n):if i==j:L[i][j]=1U[i][j]=lu[i][j]if i>j:L[i][j]=lu[i][j]else:U[i][j]=lu[i][j]
print("原矩阵")
print("\n".join(["".join(str(i)) for i in A]))
print("矩阵L")
print("\n".join(["".join(str(i)) for i in L]))
print("矩阵U")
print("\n".join(["".join(str(i)) for i in U]))
测试用例
原矩阵
[2, 2, -5]
[1, -3, 1]
[1, 5, 2]
矩阵L
[1, 0, 0]
[0.5, 1, 0]
[0.5, -1.0, 1]
矩阵U
[2, 2, -5]
[0, -4.0, 3.5]
[0, 0, 8.0]
原矩阵
[2, -1, 0, 1]
[1, 3, 0, 1]
[0, 1, -1, 2]
[1, 0, 0, 1]
矩阵L
[1, 0, 0, 0]
[0.5, 1, 0, 0]
[0.0, 0.2857142857142857, 1, 0]
[0.5, 0.14285714285714285, -0.0, 1]
矩阵U
[2, -1, 0, 1]
[0, 3.5, 0.0, 0.5]
[0, 0, -1.0, 1.8571428571428572]
[0, 0, 0, 0.4285714285714286]

这篇关于Doolittle三角矩阵分解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/703648

相关文章

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

线性代数|机器学习-P35距离矩阵和普鲁克问题

文章目录 1. 距离矩阵2. 正交普鲁克问题3. 实例说明 1. 距离矩阵 假设有三个点 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​,三个点距离如下: ∣ ∣ x 1 − x 2 ∣ ∣ 2 = 1 , ∣ ∣ x 2 − x 3 ∣ ∣ 2 = 1 , ∣ ∣ x 1 − x 3 ∣ ∣ 2 = 6 \begin{equation} ||x

【线性代数】正定矩阵,二次型函数

本文主要介绍正定矩阵,二次型函数,及其相关的解析证明过程和各个过程的可视化几何解释(深蓝色字体)。 非常喜欢清华大学张颢老师说过的一段话:如果你不能用可视化的方式看到事情的结果,那么你就很难对这个事情有认知,认知就是直觉,解析的东西可以让你理解,但未必能让你形成直觉,因为他太反直觉了。 正定矩阵 定义 给定一个大小为 n×n 的实对称矩阵 A ,若对于任意长度为 n 的非零向量 ,有 恒成

python科学计算:NumPy 线性代数与矩阵操作

1 NumPy 中的矩阵与数组 在 NumPy 中,矩阵实际上是一种特殊的二维数组,因此几乎所有数组的操作都可以应用到矩阵上。不过,矩阵运算与一般的数组运算存在一定的区别,尤其是在点积、乘法等操作中。 1.1 创建矩阵 矩阵可以通过 NumPy 的 array() 函数创建。矩阵的形状可以通过 shape 属性来访问。 import numpy as np# 创建一个 2x3 矩阵mat

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩 目录 前言 一、特征值分解 二、应用特征值分解对图片进行压缩 三、矩阵的奇异值分解 四、应用奇异值分解对图片进行压缩 五、MATLAB仿真代码 前言         学习了特征值分解和奇异值分解相关知识,发现其可以用于图片压缩,但网上没有找到相应代码,本文在学习了之后编写出了图片压缩的代码,发现奇异值分

【UVA】10003-Cutting Sticks(动态规划、矩阵链乘)

一道动态规划题,不过似乎可以用回溯水过去,回溯的话效率很烂的。 13988658 10003 Cutting Sticks Accepted C++ 1.882 2014-08-04 09:26:49 AC代码: #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include

算法练习题17——leetcode54螺旋矩阵

题目描述 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。  代码 import java.util.*;class Solution {public List<Integer> spiralOrder(int[][] matrix) {// 用于存储螺旋顺序遍历的结果List<Integer> result = new ArrayList

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相似对角化5.2 已知两个矩阵相似,求某个矩阵中的未知参数5.3 相似时,求可逆矩阵P,使

最大子矩阵和问题归纳总结

一,最大子矩阵问题: 给定一个n*n(0< n <=100)的矩阵,请找到此矩阵的一个子矩阵,并且此子矩阵的各个元素的和最大,输出这个最大的值。 Example: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其中左上角的子矩阵: 9 2 -4 1 -1 8 此子矩阵的值为9+2+(-4)+1+(-1)+8=15。 二,分析 子矩阵是在矩阵