稳定的双共轭梯度法(BiCGSTAB)
系数矩阵非对称时,线性方程组如何求解?-稳定双共轭梯度法(Bicgstab)求解线性方程组
在前面的文章和中表明共轭梯度法是求解对称正定线性方程组的一种有效方法,当针对不同的系数矩阵采用不同的预处理方式时,其可以以较少的迭代次数获得较高精度的解。然而,该方法的一个缺点就是其只能适用于对称正定系数矩阵,当系数矩阵不再是对称正定时,此方法可能失效。以下举例:
上面矩阵A为非对称矩阵,采用共轭梯度法求解过程如下:
该方程组采用共轭梯度法迭代4862次依然未收敛。因此,对于该非对称方程,可以认为,共轭梯度法几乎是失效的。在实际工程中,有限元方法形成的刚度系数以对称正定居多,但是实际上也存在非对称的可能,例如,当材料本构采用摩尔-库伦本构时,其形成的刚度矩阵就有可能会是非对称的,此时如果是使用商业软件,应当在软件中选择非对称求解器。如果是自主编程且采用迭代法求解线性方程组,则需要找到一种适用于非对称矩阵的求解方法。
常见的非对称系数矩阵求解方法主要有:广义最小残差法(GMRES),双共轭梯度法(Bicg)稳定双共轭梯度法(BiCGStab),稳定混合双共轭梯度法(BiCGStab(l)),这些方法相对于常规的共轭梯度法在推导上均增加了一些难度,实际推导往往较为复杂。本文不展开推导,仅对稳定双共轭梯度法(BiCGStab)的伪代码作简要粘贴。BiCGStab法的具体计算过程如下:
program bicgstab_mainimplicit noneinteger,parameter::n=8real(8)::a(n,n),b(n)real(8)::x(n),x0(n)integer::i,jinteger,parameter::m=20real(8)::c(m,m),d(m)real(8)::y(m),y0(m)a=reshape((/6,5,1,2,0,0,2,1, &0,5,1,1,0,0,3,0,& 1,1,623,1,2,0,1001,2, &2,1,1,7,1,2,1,1,&0,0,2,31,6,0,2,1,&0,0,0,2,0,4,1,0,&2,3,1,1,23,1,5,213,&123,0,12,1,1,0,1,3/),(/n,n/))b=(/1,1,1,1,1,1,1,1/)write(*,*)"矩阵A"write(*,"(8f10.4)")(a(i,:),i=1,n)write(*,*)"向量b"write(*,"(f10.4)")bx0=100.0x=0.0call bicgstab(a,b,x,x0,n)end program bicgstab_main
subroutine bicgstab(a,b,x,x0,n)implicit noneinteger,intent(in)::nreal(kind=8),intent(in)::a(n,n),b(n),x0(n)real(kind=8),intent(out)::x(n)real(kind=8)::p0(n),r0(n)real(kind=8)::tol=1.0d-6integer::nmax=1000real(kind=8)::rj(n),pj(n)real(kind=8)::alphajreal(kind=8)::r0_bar(n)real(kind=8)::sj(n)real(kind=8)::xjp1(n),xj(n)real(kind=8)::wjreal(kind=8)::rjp1(n)real(kind=8)::betajinteger::n_iterreal(kind=8)::apj(n),asj(n)r0=b-matmul(a,x0)r0_bar=r0if(abs(dot_product(r0,r0_bar))<tol) thenwrite(*,*)"unvalid r0_bar,select an other!"return endifp0=r0rj=r0pj=p0xj=x0n_iter=0doif(n_iter>nmax) thenwrite(*,*)"exceed max iter!"exitendifalphaj=dot_product(rj,r0_bar)/dot_product(matmul(a,pj),r0_bar)apj=matmul(a,pj)sj=rj-alphaj*apjif(norm2(sj)<tol) thenxjp1=xj+alphaj*pjx=xjp1exitendifasj=matmul(a,sj)wj=dot_product(asj,sj)/(norm2(asj))**2xjp1=xj+alphaj*pj+wj*sjrjp1=sj-wj*asjif(norm2(rjp1)<tol) thenx=xjp1exitendifbetaj=alphaj*dot_product(rjp1,r0_bar)/(wj*dot_product(rj,r0_bar))pj=rjp1+betaj*(pj-wj*apj)xj=xjp1rj=rjp1n_iter=n_iter+1write(*,*)"the",n_iter,"iter!"enddowrite(*,*)"the solution of equation:"write(*,"(es18.8)")xend subroutine bicgstab
依据上述过程编写程序,计算前述非对称矩阵线性方程组求解结果:
采用matlab求解该方程组的解:
通过对比可知11次迭代已经获得即为准确的结果。实际上,对于该方法也可以通过一定的预处理方式,使得其所需要的迭代次数更少。
https://zhuanlan.zhihu.com/p/537095177
而由维基百科
1、未预处理的
2、预处理后的
稳定的双共轭梯度法(BiCGSTAB)相关推荐
- matlab 共轭,求解线性方程组 - 双共轭梯度法
通过为 bicg 提供用来计算 A*x 和 A'*x 的函数句柄(而非系数矩阵 A)来求解线性方程组. 创建一个非对称三对角矩阵.预览该矩阵. A = gallery('wilk',21) + dia ...
- matlab常用函数——方程函数
八.插值函数.线性方程解函数和多项式函数 1)插值函数 interp1q :1维快速线性插值法 yi=interp1q(x,Y,xi) interp1q正常执行条件: (1)x单调递增列向量 (2)Y ...
- MATLAB软件基础学习篇——003
matlab常用函数 (转载) matlab常用函数 第一篇:Matlab软件函数 一.软件操作函数 1)命令窗口函数: clc:清空命令窗口,使用向上箭头翻看命令. open:打开文件,文本文件(* ...
- 【整理】Matlab常用函数
第一篇:Matlab软件函数 一.软件操作函数 1)命令窗口函数: clc:清空命令窗口,使用向上箭头翻看命令. open:打开文件,文本文件(*.doc),可执行文件(*.exe),图形文件(*.f ...
- 阿里用技术帮用户剁手——《尽在双11——阿里巴巴技术演进与超越》
每个互联网从业者都希望用户在自家平台上剁手,但很少有人知道让平台支持用户剁手.拉斯维加斯的快手富翁是低水平的帮用户剁手的方式,剁过两次之后用户就无手可剁了:而阿里的双11购物狂欢节则是高水平的帮用户剁 ...
- 备战双11,送你一份解压壁纸!
朋友们,双11的号角已经吹响,氛围越来越紧张,知道大家最近工作会比较辛苦,OB君特地准备了一些壁纸(欢迎保存/分享),给大家加油打气,缓解压力. 下面,开启 relaxed time~ 遇到故障时间太 ...
- 基于单片机的双足仿生运动机器人的设计
目录 1 概述 1 1.1 研究背景及意义 1 1.2 机器人的应用领域及发展现状 1 1.2.1 应用领域 1 1.2.2 发展现状 1 1.3 双足机器人设计要求 2 1.3.1 硬件部分 2 1 ...
- 《尽在双11——阿里巴巴技术演进与超越》全书精华摘录
"双 11",诞生于杭州,成长于阿里,风行于互联网,成就于新经济,贡献于全世界. 从 2009 年淘宝商城起,双 11 已历经八年.每年的双 11 既是当年的结束,又是走向未来的起 ...
- PIXHAWK2.4.8飞控如果做双罗盘校准
转载自:http://pix.1yuav.com/luo-pan-xiao-zhun.html 校准罗盘成功后,飞控要断电重新连接,这步一定要做. 从3.3.3固件开始,飞控支持使用双罗盘(也就是内置 ...
最新文章
- 将 Shiro 作为应用的权限基础
- php mysql不大小写吗,PHP+MYSQL大小写有关问题
- Jrebel最新激活破解方式
- Spring自动扫描组件
- [转]SQL Server 2000执行计划成本(1/5)
- 动态页面加载速度太慢
- vlan绑定_图文并茂深入了解VLAN工作原理,不能错过干货
- php获取跳转后url,php获取跳转后真实url的方法
- 说明exit()函数作用的程序
- 设计模式笔记十七:迭代器模式
- python分析pcap文件_利用Python库Scapy解析pcap文件的方法
- 物联网核心安全系列——智能汽车安全防护的重要性
- android 单独编译contacts,Android编译全过程
- 集体智慧编程——协同过滤
- 企业办理CMMI认证是怎么收费的?
- cwm oracle,oracle info
- 【DDRNet】DDRNet项目使用单GPU、自己的数据集训练、得到测试图像
- 查看修改qcow2文件
- 如何消除原生Android,如何消除原生Android网络状态上的惊叹号
- 必须注销计算机才能应用这些更改,Win10不用注销电脑就可以实现切换开始菜单/屏幕的方法...