在Julia环境中,使用FenicsPy.jl调用FEniCS
库,求解偏微分方程。
纳维-斯托克斯方程组
纳维-斯托克斯方程:
\[
\color{red}{\frac{\partial \boldsymbol{u}}{\partial t}+(\boldsymbol{u} \cdot \nabla)\boldsymbol{u}=\frac{1}{\rho}\nabla\cdot \boldsymbol{\sigma}+\boldsymbol{f}}
\]
其中,张量
\(\boldsymbol{\sigma}\)
是应力张量
, 取决于具体流体的特性假设,比如:牛顿流体
。
连续性方程:
\[
\frac{\partial \rho}{\partial t}+\nabla \cdot (\rho \boldsymbol{u})=0
\]
...
概要
-
系统平台: Win10_64 + WSL2 + Ubuntu
-
目标:Python3.7+Julia1.5.3+JupyterLab+MatplotLib+SymPy+SciPy+FEniCS2019
-
以Julia作为我主要的使用语言,确保能调用Python的库
-
目前FEniCS不支持Windows,所以我选择 Win10+WSL+Ubuntu
-
目前FEniCS2019有问题(至少存在折磨我的问题),所以我选择FEniCS2018
-
FEniCS2019的问题已经解决,所以我还是选择FEniCS2019(详细见后)。
...
在Julia环境中,使用FenicsPy.jl调用FEniCS
库,求解偏微分方程。
以泊松方程(第一边界条件)为例
\[
-\Delta u = f \qquad \boldsymbol{x} \in \Omega \\ u|_{\partial \Omega} =g
\]
范例而已, 本例提供的套路是通用的,大不了多看看文档。
关键的地方,我特意列出相关链接。
本文采用软件包: FEniCS。
...
上一篇笔记,讨论了一个单独的三角单元
。 本篇讨论,如何将任意给定平面区域刨分成三角单元序列
。
本文用到了 python库scipy.spatial.Delaunay
参考文献: https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.Delaunay.html
...
本文是有限元法基础之一:三角单元。
用
\(\color{red}{红色}\)
标注的公式,都给了完整的符号推导(基于Julia)。
参考文献: 微分方程数值解法(第4版)-李荣华&刘播-高等教育出版社-2009
...
有限元法可归结为如下几个步骤:
- 转换成变分问题(应该会用到边界条件)
2)对解域进行刨分(可以是不均匀)
3)构造基函数(本篇采用基于线性插值的基函数)
4)推导出有限元方程
5)求解有限元方程
6)收敛性和误差估计
...
# 奇怪:这个库必须放在最前面才能一次加载成功
using Plots
gr()
# 解决Colab不显示输出数学公式的问题
using Markdown: MD, LaTeX
function latex(expr)
expr |> sympy.latex |> LaTeX
end;
...
# 奇怪:这个库必须放在最前面才能一次加载成功
using Plots
gr()
Plots.GRBackend()
...
# 奇怪:这个库必须放在最前面才能一次加载成功
using Plots
# gr()
pyplot()
using SciPy
using LinearAlgebra
Plots.GRBackend()
...
Julia
,对数学符号真太友好了。
前面的笔记中,我曾穿插了些相关的符号计算,本文作为一个汇总,并且未来的一些有特点的代码,我也将汇总于此,用作备忘。
用Julia
进行张量符号计算的关键:1)先要写出(多重)数组友好的公式,然后用Julia
实现之; 2)使用了SymPy
,外加Julia
本身的语法优势。
我曾想过将代码封装成函数,但发现直接用代码似乎更好。首先代码不复杂,其次, 暴露代码细节还能和数学公式相互对照,不容易出错。 有种“所见即所得”的感觉。
...