背景

通常数值解微分方程、微分方程组(常微分、偏微分方程),人们言必称“Matlab”,COMSOL,实际上,微分方程求解有两大强手被人忽视:(1)符号求解独孤求败:Maple; (2)数值求解Mathematica更为好用而且强大。

拿个例子来练习和学习偏微分方程求解solver的用法。这里先看看Mathematica的有限元方法数值求解“波动方程”类型的偏微分方程的初边值问题。

问题

学软件最方便的是看文档,大部分情况下,没有比软件自带文档更权威的教材了。我这个例子是从文档偷出来的。

偏微分方程



∂2u(x,y,t)∂t2=∂2u(x,y,t)∂x2+∂2u(x,y,t)∂y2(1)

求解所在的区间

求解该函数u所在的xoy平面上的区域为非普通矩形的不规则区域(差分法常用的矩形网格无法使用):

波动方程有限差分python 波动方程有限元_Mathematica

初边值条件

未知函数u(x,y,t)二阶,而且有三个变量,经验判断初边值条件要有“四个”;左边界、右边界,0阶和一阶初值条件。

第一类边界条件,内边界和外边界上函数值都为0,


u(x,y,t)|(x,y)∈∂=0(2)


用代码表示为:

DirichletCondition[u[x,y,t]==0,True]

这个实际包含了内部的圆和外部的圆两个边界条件,“一个顶两个”;

一阶和0阶初始条件:


u(x,y,0)=e−5((x−0.2)2+y2)(3)



∂u(x,y,0t)∂t|t=0=0(4)

求解利用FEM包载入即可。

波动方程解一个周期的可视化

波动方程有限差分python 波动方程有限元_波动方程有限差分python_02

求解的方法和代码还可以参考这里

跟COMSOL的对比

COMSOL是Matlab中pdetool相关代码至少早期版本的实际开发者。所以,使用Matlab的pdetool的图形用户界面时,会发现跟COMSOL中“数学形式的PDE”的Physics部分的界面非常类似、简直就是雷同。

不过我用COMSOL求解同一问题,发现效果很不理想,难道因为我是新手,COMSOL就特别歧视我吗?

波动方程有限差分python 波动方程有限元_波动方程有限差分python_03

我开始怀疑COMSOL计算的精度是不是总是这么低,总能导致一些因为误差而产生的虚假的波动?

波动方程有限差分python 波动方程有限元_偏微分方程_04

波动方程有限差分python 波动方程有限元_Mathematica_05