fenics 笔记 1 -- Possion Problem
1 - 问题域为 \(\Omega\)
2 - 方程及其变分形式
\[\begin{aligned}
-\nabla^2 u(\boldsymbol{x}) &= f(\boldsymbol{x}), \quad &\boldsymbol{x} \in \Omega \\
u(\boldsymbol{x}) &= u_D(\boldsymbol{x}), \quad & \boldsymbol{x} \in \partial\Omega
\end{aligned}\]
其中,\(u = u(\boldsymbol{x})\) 是未知函数,\(f = f(\boldsymbol{x})\) 则是已知/给定的(函数)值,\(u_D(\boldsymbol{x})\) 是边界上的值(边界条件),也是已知给定的(函数)值
试函数及其积分:
\[-\int_{\Omega}(\nabla^2 u) v dx = \int_{\Omega} f v dx
\]
变分形式:
由 \(\nabla(f\cdot g) = \nabla f \cdot \nabla g\) 可得:(设\(f=\nabla u\) and \(g=v\))
\[\nabla(\nabla u \cdot v) = (\nabla^2u)\cdot v + \nabla u \cdot \nabla v
\]
那么
\[-\int_{\Omega}(\nabla^2 u)vdx = \int_{\Omega} \nabla u \cdot \nabla v dx - \int_{\Omega} \nabla(\nabla u \cdot v) dx
\]
其中,上式右侧第二项,可通过高斯定理进行化简为:
\[\int_{\Omega} \nabla(\nabla u \cdot v) dx = \int_{\partial\Omega} \nabla u \cdot v \cdot n ds
\]
由于 \(v\) 在边界\(\partial\Omega\) 上为 0,因此,上式的值为零。那么,前一个积分公式为:
\[-\int_{\Omega}(\nabla^2 u)vdx = \int_{\Omega} \nabla u \cdot \nabla v dx
\]
最终得到变分形式:
\[\int_{\Omega} \nabla u \cdot \nabla v dx = \int_{\Omega} f v dx
\]
从编程实现的角度讲,分四个步骤:
1 - 定义问题域
# create mesh and define function space
mesh = UnitSquareMesh(8, 8)
V = FunctionSpace(mesh, 'P', 1)
2 - 定义边界条件
# define boundary condition
u_D = Expression("1 + x[0]*x[0] + 2*x[1]*x[1]", 2)
def boundary(x, on_boundary):
return on_boundary
bc = DirchletBC(V, u_D, boundary)
3 - 定义问题
# define variational problem
u = TrialFunction(V)
v = TestFunction(V)
f = Constant(-6.0)
a = dot(grad(u), grad(v))*dx
L = f*v*dx
4 - 求解问题
# compute solution
u_s = Function(V)
solve(a == L, u_s, bc)
# plot solution
plto(u_s)