LDL分解并对厄而米特矩阵求逆(python仿真)
1. LDL分解
1.1. 原理
直接参考链接:https://blog.csdn.net/wanghu213/article/details/83963950这里不赘述。
1.2. python仿真
import numpy as np
np.set_printoptions(linewidth=np.inf)M = 4A = np.array([[3, 2+4j, 4+2.5j, 2+7.2j], [2-4j, 4 , 7+0.4j, 22+4j], [4-2.5j, 7-0.4j, 5, 42+0.22j],[2-7.2j, 22-4j, 42-0.22j, 6]])U = np.zeros_like(A)
L = np.zeros_like(A)
D = np.zeros_like(A)for i in range(M):L[i, i] = 1for j in range(M):tmp_sum = 0for m in range(j):tmp_sum += U[j, m] * L[j, m].conj()D[j, j] = A[j, j] - tmp_sumtmp_sum = 0for i in range(j+1, M):tmp_sum = 0for m in range(j):tmp_sum += U[i, m] * L[j, m].conj()U[i, j] = A[i, j] - tmp_sumL[i, j] = U[i, j] / D[j, j]print('L:')
print(L)print('D:')
print(D)print('origin:')
print(A)print('LDLH:')
print(np.dot(L, np.dot(D, L.conj().T)))
结果:
L:
[[ 1. +0.j 0. +0.j 0. +0.j 0. +0.j ][ 0.66666667-1.33333333j 1. +0.j 0. +0.j 0. +0.j ][ 1.33333333-0.83333333j -0.375 +1.525j 1. +0.j 0. +0.j ][ 0.66666667-2.4j -4.15 +0.7j 9.69471154+5.74278846j 1. +0.j ]]
D:
[[ 3. +0.00000000e+00j 0. +0.00000000e+00j 0. +0.00000000e+00j 0. +0.00000000e+00j][ 0. +0.00000000e+00j -2.66666667+0.00000000e+00j 0. +0.00000000e+00j 0. +0.00000000e+00j][ 0. +0.00000000e+00j 0. +0.00000000e+00j 4.16 +0.00000000e+00j 0. +0.00000000e+00j][ 0. +0.00000000e+00j 0. +0.00000000e+00j 0. +0.00000000e+00j -493.56293269+2.84217094e-14j]]
origin:
[[ 3.+0.j 2.+4.j 4.+2.5j 2.+7.2j ][ 2.-4.j 4.+0.j 7.+0.4j 22.+4.j ][ 4.-2.5j 7.-0.4j 5.+0.j 42.+0.22j][ 2.-7.2j 22.-4.j 42.-0.22j 6.+0.j ]]
LDLH:
[[ 3.+0.00000000e+00j 2.+4.00000000e+00j 4.+2.50000000e+00j 2.+7.20000000e+00j][ 2.-4.00000000e+00j 4.+0.00000000e+00j 7.+4.00000000e-01j 22.+4.00000000e+00j][ 4.-2.50000000e+00j 7.-4.00000000e-01j 5.+0.00000000e+00j 42.+2.20000000e-01j][ 2.-7.20000000e+00j 22.-4.00000000e+00j 42.-2.20000000e-01j 6.+2.84217094e-14j]]**加粗样式**
可以看出,原始矩阵和LDLHLDL^HLDLH结果一致。
2. Hermitian矩阵求逆
主要思路是已知:
LDLHA−1=ILDL^HA^{-1}=ILDLHA−1=I; 设DLHA−1=BDL^HA^{-1}=BDLHA−1=B,则LB=ILB=ILB=I; 求解BBB, 其
2.1. 仿真代码
import numpy as np
import time
np.set_printoptions(linewidth=np.inf)
np.set_printoptions(precision=8,suppress=True)M = 4def LDLH(A):U = np.zeros_like(A)L = np.zeros_like(A)D = np.zeros_like(A)for i in range(M):L[i, i] = 1for j in range(M):tmp_sum = 0for m in range(j):tmp_sum += U[j, m] * L[j, m].conj()D[j, j] = A[j, j] - tmp_sumtmp_sum = 0for i in range(j+1, M):tmp_sum = 0for m in range(j):tmp_sum += U[i, m] * L[j, m].conj()U[i, j] = A[i, j] - tmp_sumL[i, j] = U[i, j] / D[j, j]return L, Ddef LDL_solve(L, D):M = L.shape[0]B = np.zeros_like(L)V = np.zeros_like(L)for i in range(M):B[i, i] = 1for j in range(M-1):B[j+1, j] = -L[j+1, j]for i in range(j+2, M):tmp_sum = 0for m in range(j+1, i):tmp_sum += B[m, j] * L[i, m]B[i, j] = -L[i, j] - tmp_sumfor j in range(M):V[M-1, j] = B[M-1, j] / D[M-1, M-1]V[j, M-1] = V[M-1, j].conj()for i in range(M-2, j-1, -1):tmp_sum = 0for m in range(i+1, M):tmp_sum += L[m, i].conj() * V[m, j]V[i, j] = B[i, j] / D[i, i] - tmp_sumV[j, i] = V[i, j].conj()return VA = np.array([[3, 2+4j, 4+2.5j, 2+7.2j], [2-4j, 4 , 7+0.4j, 22+4j], [4-2.5j, 7-0.4j, 5, 42+0.22j],[2-7.2j, 22-4j, 42-0.22j, 6]])V_np = np.linalg.inv(A)L, D = LDLH(A)
V = LDL_solve(L, D)print('v_np - v:')
print(V_np - V)print('AV')
print(np.dot(A, V))
结果:
v_np - v:
[[-0.+0.j 0.-0.j -0.+0.j 0.+0.j][ 0.+0.j -0.-0.j -0.-0.j -0.+0.j][ 0.-0.j -0.+0.j -0.+0.j 0.-0.j][-0.-0.j -0.-0.j 0.+0.j -0.+0.j]]
AV
[[ 1.-0.j 0.+0.j -0.+0.j 0.-0.j][-0.-0.j 1.-0.j 0.+0.j -0.-0.j][-0.-0.j 0.-0.j 1.+0.j -0.-0.j][-0.+0.j 0.-0.j 0.+0.j 1.-0.j]]
可以看出求逆的结果和numpy的计算结果一致,且原始矩阵和求逆矩阵乘积为单位阵。
LDL分解并对厄而米特矩阵求逆(python仿真)相关推荐
- cholesky分解_Time Series Analysis-1.2 LDL分解
最近考完两个小quiz,停了一段时间,今晚抽空继续来分享这门课的笔记. 1.前言 上一期分享了Cholesky分解的基本步骤和伪代码,本期介绍另外一种矩阵分解的方法--LDL分解. 首先补充一下,近几 ...
- LDL分解的Fortran代码
LDL分解的Fortran代码 LDL分解是将一个对称矩阵分解为一个对角矩阵 DDD 和两个互为转置的三角阵 LLL, LTL^TLT 的乘积 A=LDLTA=LDL^TA=LDLT. 具体做法可以看 ...
- matlab hermitian,Hermitian 不定矩阵的分块 LDL 分解
ldl Hermitian 不定矩阵的分块 LDL 分解 语法 L = ldl(A) [L,D] = ldl(A) [L,D,P] = ldl(A) [L,D,p] = ldl(A,'vector') ...
- 米云平台Python调用
米云平台Python调用 https://gitee.com/angel-dream/miyun-platform-python-call 介绍 米云平台Python调用,登录,获取余额,获取手机号, ...
- 稀疏表示与非负矩阵分解(3)矩阵分解基本原理和chirp信号处理的简单python实现
稀疏表示与非负矩阵分解(3)矩阵分解基本原理和chirp信号处理的简单python实现 1. 非负矩阵分解 2. 时频图制作 2.1 时频图的指标与方法比较 2.1.1 时间分辨率和频域分辨率 2.1 ...
- 矩阵分解---LDL分解
若一个矩阵A是正定的,那么该矩阵也可以唯一分解为 其中L是对角元素都为1的下三角矩阵,D是对角元素都为正数的对角矩阵.还是以三维矩阵进行简单说明 接着按照Cholesky分解推导的思路可以得到下面两个 ...
- 整数分解为若干项之和python_SVD奇异值分解及Python实例
1. 普通方阵的矩阵分解(EVD) 我们知道如果一个矩阵 A 是方阵,即行列维度相同(mxm),一般来说可以对 A 进行特征分解: 其中,U 的列向量是 A 的特征向量,Λ 是对角矩阵,Λ 对角元素是 ...
- 光学仿真案例(4) 基于纳米微粒激发平面波的米氏散射FDTD仿真模拟
目录 案例内容 案例获取 案例内容 本案例展示了一个基于纳米粒子激发平面波的米氏散射仿真模型(mie scattering),计算其散射和吸收截面.局域场增强和远场散射分布,同时将截面和远场结果与解析 ...
- 图像分解python_将图像等分为两部分python open
您可以将图像的顶部和底部水平裁剪到中间. 打开图像.import cv2 import numpy as np image = cv2.imread('images/blobs1.png') cv2. ...
最新文章
- Java_中快速获取系统时间
- CISSP的成长之路(二):为什么要获得CISSP认证
- Zookeeper 典型应用场景介绍
- 从代理机制到Spring AOP,这篇给你安排的明明白白的
- php 没有libmysql.dll,PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰
- java.util.Properties类的介绍-配置文件的读写【-Z-】
- Error--解决使用Application Loader提交ipa包审核时的报错:ERROR ITMS-90168: The binary you uploaded was invalid....
- (转)Page.ClientScript.RegisterStartupScript 与Page.ClientScript.RegisterClientScriptBlock 之间的区别...
- 全国计算机等级考试3月份报名时间,2021年3月全国计算机等级考试报名时间公布...
- MySQL中explain用法含义说明
- 麦乐积分:积分兑换系统对于积分运营的重要性
- 英伟达RTX 4070最新测评来了!光追效果更棒,但仅限于2k游戏
- 【HGNN】北邮循序渐进研究HGNN
- 计算机教师结构化方式面试,市计算机:17名学生通过全国教师资格证结构化面试...
- 【Linux】E: Release file for http://ports.ubuntu.comxxxxxxxxxxxxxInRelease is not valid关于时间设置的问题解决
- 腾讯王巨宏:“未来+教育”,以智能技术助力人才培养新模式
- python制作会动的表情包_利用python图片生成,需10几行代码,生成的动态表情包(小黄鸭)...
- 百度短网址开始收费了,这是真的吗?
- python中使用gdal,osgeo
- MTK平台设置不同的预览Size