0.前言
有限差分法是一种数值计算方法,用于求解偏微分方程。其基本思想是将连续的偏微分方程离散化,转化为离散的代数方程组,然后通过求解这个代数方程组来得到数值解。
在有限差分法中,我们将求解区域划分为一系列网格点和区域,然后在每个网格点处近似表示原方程的导数,这样就可以得到一个离散的方程组。具体地说,我们可以使用中心差分法、前向差分法或后向差分法来近似表示导数。然后,我们将这些差分方程组合起来,得到一个方程组,可以使用常见的迭代法等求解方程组。例如一维问题的差分方法如下:
中心差分法:对于函数f(x),在x点处的导数可以用以下公式计算:
f'(x) = (f(x+h) - f(x-h)) / (2h) ,其中h是一个足够小的数,通常取0.001或0.0001等。
前向差分法:对于函数f(x),在x点处的导数可以用以下公式计算:
f'(x) = (f(x+h) - f(x)) / h
后向差分法:对于函数f(x),在x点处的导数可以用以下公式计算:
f'(x) = (f(x) - f(x-h)) / h
01.基本步骤
-
写出描述问题的微分方程
-
离散化求解区域,将问题转化为有限维
-
用差分形式代替偏导数,即改写微分方程为线性方程
-
求解线性方程组
-
可视化和后处理
02.必须考虑的其它问题
-
求解方法是否合理
-
求得的近似解精度如何
-
求解的收敛速度
03.案例—泊松方程
1.描述问题的微分方程
ps: 拉普拉斯算子作用u,是将u从d维向量空间映射到实数空间
2.离散化求解区域
PS: 中心为(0,0)
ps: 边界的红点处U=0
3.用差分形式代替偏导数,即改写微分方程为线性方程
ps: 该公式也叫中心差商
代入微分方程后得下图
依次遍历所有点,一一代入上式中,例如下图所示,把1节点代入差分方程,一共有五项,分别对应一节点左右前后和自身,得到下图第一个方程。
4.求解线性方程组
本案例中的f理解成体力,注意的是,与有限元把不同的地方是,有限差分法是基于对原求解方程的高度近似(纯数学的方式,差商代替导数),没有事先用到假设插值解的形式,即先求离散点的解,后用假设解函数(由离散点的解插值得到);而有限元是先对原求解方程的解,给出一个假设的插值解函数,再来根据一些原理(基于最小势能原理,虚功原理,加权残值法等)求出离散点的解,最后再用到假设解函数。但是本质上二者都是对微分方程的改造。还有就是差分法不用将外部作用转化为节点处的作用(作用未必是力)
04.代码分享
最后分享一些学习之余收集的代码和资料,有些算法我目前也不太熟悉,等以后有机会再讲解代码,这里有需要的同学可以公众号回复泊松方程即可获取。最后强调下,我写的大部分内容旨在分享方法和思路,通过认识了解这些方法更好的使用相关软件或者为开发打基础,不是每个人都有编程的必要,满足好奇心或者广泛学习都是有意义的,知道自己对什么感兴趣,打算做什么。欢迎大家一起学习交流,我的兴趣爱好是数值计算和机器学习,会持续更新相关笔记,不当之处,欢迎指出。获取更多资料和学习交流欢迎大家关注公众号冬生亦东生,分享旨在本人复习和交流