PLU-分解以及求逆矩阵
PLU-分解
PLU-分解是对LU分解的一种改进,其增加了选主元的操作增加了计算的稳定性,及在第i次循环中将
j=where(max(∣A[i:n,i]∣))j=where(\max(|A[i:n,i]|))j=where(max(∣A[i:n,i]∣)) 行和第i行进行交换来比避免对角元素出现0的情况,计算结果
PA=LUPA=LUPA=LU
P为置换矩阵,L为下三角矩阵,U为上三角矩阵。选主元操作在计算过程中以一个一维数组保存代替n×nn\times nn×n的矩阵,以下为此算法的Fortran代码,a为输入矩阵,l,u,p分别为下三角,上三角,置换矩阵,n为矩阵大小,当erro为0时计算失败,成功则为1
subroutine plu_decompose(a,l,u,p,n,erro)real,intent(inout)::a(n,n)real,intent(out)::l(n,n),u(n,n),p(n,n)integer,intent(in)::ninteger::pi(n)integer,intent(out)::errointeger::i,j,k,maxp,temppreal::maxdo i=1,npi(i)=iend dodo i=1,n-1max=a(i,i)maxp=ido j=i+1,nif (abs(a(j,i))>max) thenmax=abs(a(j,i))maxp=jend ifend doif (max+1.0==1.0) thenerro=0stopend ifif (maxp/=i) thentempp=pi(i)pi(i)=pi(maxp);pi(maxp)=temppa(i:maxp:maxp-i,:)=a(maxp:i:i-maxp,:)end ifdo j=i+1,na(j,i)=a(j,i)/a(i,i)end dodo j=i+1,ndo k=i+1,na(j,k)=a(j,k)-a(j,i)*a(i,k)end doend doend dodo i=1,np(i,i)=0l(i,i)=1u(i,i)=a(i,i)do j=1,i-1p(i,j)=0p(j,i)=0l(i,j)=a(i,j)l(j,i)=0u(j,i)=a(j,i)u(i,j)=0end doend dodo i=1,np(i,pi(i))=1end do
end subroutine
再通过解线性方程组可以得到矩阵 AAA 的逆,代码如下,其中第一次得到的矩阵为一个下三角阵,这样可以节省一半的计算量
subroutine reverse(a,b,n,erro)implicit nonereal,intent(inout)::a(n,n)real,intent(out)::b(n,n)real::l(n,n),u(n,n),p(n,n),c(n,n),tempinteger::n,errointeger::i,j,kcall plu_decompose(a,l,u,p,n,erro)if (erro==0) thenreturnend ifdo i=1,ndo j=1,i-1c(j,i)=0.0end dodo j=i,ntemp=0do k=1,j-1temp=temp+l(j,k)*c(k,i)end doif (i==j)thenc(j,i)=(1.0-temp)/l(j,j)elsec(j,i)=(0.0-temp)/l(j,j)end ifend doend dodo i=1,ndo j=n,1,-1temp=0do k=n,j+1,-1temp=temp+b(k,i)*u(j,k)end dob(j,i)=(c(j,i)-temp)/u(j,j)end doend dob=matmul(b,p)
end subroutine
测试代码如下
program mainimplicit nonereal::a(4,4),a_(4,4)real::l(4,4)real::w(4,4)integer :: i,jinteger:: udata((A(i,j),i=1,4),j=1,4)/ 2,0,2,0.6,3,3,4,-2,5,5,4,2,-1,-2,3.4,-1 /data((a_(i,j),i=1,4),j=1,4)/ 2,0,2,0.6,3,3,4,-2,5,5,4,2,-1,-2,3.4,-1 /a=transpose(a)a_=transpose(a_)do i=1,4print *,a(i,:)end docall reverse(a,l,4,u)w=matmul(a_,l)print *,''do i=1,4print *,w(i,:)end dopause
end program main
PLU-分解以及求逆矩阵相关推荐
- Python解决矩阵的PLU分解及求矩阵的逆
Python解决矩阵的PLU分解及求矩阵的逆 关于PLU的分解基础知识就不叙述了,可以自己去看矩阵分析的书,大体上和高斯消去法差不多. PLU分解被经常用在Ax=bAx=bAx=b的求解上 在这里xx ...
- matlab求逆矩阵_MPU6050姿态解算2-欧拉角amp;旋转矩阵
1 IMU姿态解算 IMU,即惯性测量单元,一般包含三轴陀螺仪与三轴加速度计.之前的文章 码农爱学习:MPU6050姿态解算方式1-DMPzhuanlan.zhihu.com 已将对MPU6050这 ...
- 机器学习常见求逆矩阵的方法
机器学习的常见求解逆矩阵的方法 高斯消元法 LU分解法 SVD分解法 QR分解法 高斯消元法 高斯消元法是最经典也是最广为人知的一种矩阵求逆方法,但是在现实应用中很少用到高斯消元法来进行矩阵的逆矩阵的 ...
- 求逆矩阵计算机方法,求逆矩阵的快速方法(用于编程).pdf
求逆矩阵的快速方法(用于编程) ? ? 1 2 2 2 Ρ Ρ Ρ Ρ Ρ ? Α Α Α Α Α Α 3 Α Β Β Β 3 Α Β Α Β Α Β Α Β Β Β Β 第 20 卷第 1 期 大 ...
- python C++ 求逆矩阵库
python求逆矩阵库 https://numpy.org/ C++求逆矩阵库 http://eigen.tuxfamily.org/index.php?title=Main_Page
- 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)...
4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 290 Solved: 148 [Submit][Stat ...
- 变换例题_用初等变换求逆矩阵的小小解释
在我们学习逆矩阵的过程中,肯定会遇到这样一种求逆矩阵的方法: 若A是一个n阶可逆矩阵, (虚竖线打不出,凑合着看吧!)这一过程中经历了一系列初等行变换,并且我们下结论说: 中的 就是A的逆矩阵! 按逻 ...
- 求逆矩阵计算器_991CN的矩阵运算
昨天的推文中说了一道二端口的题目,虚线中的大二端口由两个小二端口级联而成,在计算过程中,我们需要使用到矩阵的运算,昨天讲题的时候说会说一下用计算器进行矩阵运算,今天我们就来说一下. 其实在算电路的时候 ...
- numpy求逆矩阵_线性代数精华2——逆矩阵的推导过程
点击上方蓝字,和我一起学技术. 上一讲当中我们复习了行列式的内容,行列式只是开胃小菜,线性代数的大头还是矩阵. 矩阵的定义很简单,就是若干个数按照顺序排列在一起的数表.比如m * n个数,排成一个m ...
- 选主元的高斯-约旦(Gauss-Jordan)消元法解线性方程组/求逆矩阵
选主元的高斯-约当(Gauss-Jordan)消元法在很多地方都会用到,例如求一个矩阵的逆矩阵.解线性方程组(插一句:LM算法求解的一个步骤),等等.它的速度不是最快的,但是它非常稳定(来自网上的定义 ...
最新文章
- android c聊天功能,Android实现简单C/S聊天室应用
- HDU6964 I love counting (字典树+莫队)
- AngularJS快速入门
- 1.10 梯度消失与梯度爆炸-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
- jmeter学习笔记(十三)debug调试工具
- 计算机丢失qt5sql.ll,电脑中提示丢失Qt5core.dll文件的解决方法
- centos7: ifconfig出现command not found解决办法
- Cisco网络防火墙配置方法
- 前端学习(3211):react中类中方法的this指向三
- 微型计算机出版时间,《微型计算机技术》低价购书_陈慈发 主编_计算机与互联网_孔网...
- 《复联4》天价票被叫停了?电影局出手了 院线:确实收到口头通知
- 电脑配置知识_高品质全铝迷你电脑主机推荐 适合家用/办公/游戏的锐龙APU电脑配置...
- C++包含头文件尖括号和双引号的区别
- 正定矩阵与半正定矩阵定义性质与理解
- 计算机视觉硕士课程南京大学,南京大学计算机系研究生课程文库
- 2019JAVA面试题精粹附答案
- linux压缩一个tar.xz文件,Linux下解压tar.xz格式压缩文件
- SpringSecurity的注解实现方式:@Secured,@PreAuthorize,@PostAuthorize
- Unity 3d 中Debug.Log和Print的区别。
- AVD安装XPOSED环境