【我发送了同名西瓜视频(西瓜视频),但本文只是视频中的Markdown文件的内容,不包括视频中的说明】
如果和我一样想在windows10上安装FEniCS,建议使用windows10wsl2Ubuntu。
FEniCS入门讲解(求解泊松方程)
FEniCS是一个基于有限元法求解偏微分方程的开源计算平台。泊松方程将泊松方程转换为(弱)变分形式求解微分方程的边值问题(一维泊松方程) )二维泊松方程ParaView )求解
泊松方程
的第一个例子自然会求解有名的泊松方程。
将泊松方程转化成(弱)变分形式
首先,对泊松方程的两边乘以测试函数,然后积分到整个区域。这里需要说明启发式函数和测试函数的概念。
测试函数,定义:
函数,定义:
然后,变换上面的变分方程式
左侧为双线性形式,右侧为线性形式:
于是得到标准的变分问题:求,满足
这就是与前面的泊松问题等价的变分问题。
求解微分方程边值问题(1维泊松方程)
做好了之前的准备,可以写代码求解了。第一步:创建用于解析域的网格并定义函数空间
从域导入*
# #单元数
nel=20
# #左右端点
xmin=0
xmax=1
# #启发式/测试函数的多项式阶
p=2
# #创建网格
mesh=间隔mesh (nel,xmin,xmax ) )。
# #使用连续Galerkin定义函数空间
# #各单元上的p次(拉格朗日)函数
v=函数空间(mesh,' CG ',p )步骤2 :定义提供的表达式
u0=常数(0) ) )。
f=恒定(-1 ) ) )。
g=常数(1)阶Dirichlet边界条件的建立与应用
(Dirichlet边界的定义(x=0() ) () ) () ) () ) ) ) ) ) )。
defDirichlet_boundary(x,on_boundary ) :
返回边界数据库(x0)域深度
将Dirichlet条件应用于# # #点x=0
BC=直接广播(v,u0,直接广播)步骤4 :定义变量问题
u=三重函数(v ) ) )
v=测试函数(v ) )
a=inner (等级(v (u ),等级) v ) *dx
L=f*v*dx g*v*ds步骤5 :求解并绘图
# #求解
u=函数(v )
解决(a==l,u,bc ) ) ) ) ) ) ) ) ) )。
# #绘图
plot(u )
求解2维泊松方程
(1个单位矩阵(Dirichlet边界) Neumann边界)法线指南数)源项)也同样地分为5个阶段进行求解从域导入*
第一步:创建用于解析域的网格并定义函数空间
mesh=unitsquaremesh (32,32 ) ) )。
v=函数空间(消息,'洛杉矶格兰',1 ) )。
步骤2 :定义提供的公式
u0=恒定(0.0) (等于) ) (等于) ) ) ) ) ) ) )。
f=表达式(' 10 *表达式(-(点) x [0]-0.5,2 )点) x [1]-0.5,2 ) )/0.02 ),深度=2) )。
g=表达式(sin )5*x[0];深度=2() ) ) ) ) ) ) ) ) ) )到) ) ) ) ) ) )但) ) ) ) ) ) ) ) ) ) ) ) ) )
步骤3(Dirichlet )边界条件的建立和应用
德国边界(x ) :
returnx [0]域名_博锐1.0 -域名_博锐
BC=直径广播(v,u0,边界) ) ) ) ) ) ) ) ) ) ) ) ) )。
步骤4 :定义变分问题
u=三重函数(v ) ) )
v=测试函数(v ) )
a=inner (地(v (u ),地) v ) *dx
L=f*v*dx g*v*ds
步骤5 :解决并绘图
u=函数(v )
解决(a==l,u,bc ) ) ) ) ) ) ) ) ) )。
plot(u )
ParaView中查看解
#以VTK格式保存解文件=文件(poisson.PVD ) ) )。
文件u【结束】