数值计算方法 matlab用二分法或简单迭代法求_数值分析笔记3

写一下解线性方程组的迭代方法。首先可以分为两类方法,第一类是将矩阵A 分裂成N-P,然后将原方程写成x = Gx+d的形式。OK,这实际上是一个求不动点的问题,初始化一个x,然后不断迭代。第一类方法里又有几种差不多的方法,包括jacobi迭代法、gauss-seidel迭代法以及逐次超松弛迭代法SOR。其中前两种都是将A 分裂为D+L+U,即对角矩阵和主对角线元素为0的上三角阵和下三角阵,只不过jacobi是将N选为D,而gauss-seidel是将N选为D+L。具体到操作时,也就是jacobi法中没有用到当前迭代步中已经更新完的值,而gauss-seidel中用到了。

ef387b315326a8937b7702a1588f30b2.png

Jacobi法

49af2a22a56a1feeba04bc6325e0c801.png

Gauss-seidel法

SOR方法实际上是高斯赛德尔方法的一种改进版本,当松弛因子为1时,也就退化成了高斯赛德尔法。理论上前两种方法是非常慢的,SOR可以通过改变松弛因子大大提高计算效率,但是目前如何选择松弛因子仍然没有定论,只能试。

第一类方法可以称之为静态的方法。第二类的方法采用了完全不同的思想。大致是将解矩阵方程转化成求解泛函极值的二次规划问题。有一个前提条件是A 必须是对称正定矩阵。很“巧合”的是残差就是负梯度方向,而负梯度方向正是函数局部下降最快的方向,因此每一次迭代也就是在当前的方向上走一小步,然后更新一下残差,也就更新了方向。这就是梯度下降法。有点像瞎子下山,永远走最陡的地方。机器学习和深度学习中最小化代价函数用的也是梯度下降法,这就与CFD产生了数学基础上的交汇。但是细究一下,还是很不一样的。说到底,深度学习是最优化,而CFD是在解方程。深度学习里有SGD和BGD,这是因为有样本和代价函数的概念,而CFD里应该是完全没有的,没有啥需要优化的。CFD里的残差在深度学习里也没有对应的概念。言归正传,梯度下降法也叫最速下降法,但实际上不是最快的,尤其是当A的特征值相差很大时,收敛很慢。所以要进行改进。共轭梯度法是更好更常用的方法,它的基本思想是找到一组A共轭的向量作为搜索方向,每次迭代找到沿每个方向上的最小值。这一组向量可以通过当前梯度方向和上一次的搜索方向得到。实际上是一个施密特正交化的过程。共轭梯度法是一个庞大的门类,下面还有许多子方法。提一下预条件技术,这是为了解决病态线性方程组,减小原矩阵A 的条件数,所以在原方程的左右两边乘上M-1。据我所知,openfoam里用的是PCG和PBiCG,即共轭梯度和双向共轭梯度加了预条件。Fluent里用的是AMG,代数多重网格方法,一种据说非常强大的黑科技,具体算法还需要再学习一下。

今天才意识到研一上学期法国老头的仿真与优化的课实际上前半程讲的是数值分析和最优化,后半程讲的是有限元方法。两次大作业一次是神经网络,一次是血液流动传热仿真。总算是明白为啥这课是叫这名字了欸~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值