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)
posted @ 2020-12-18 12:22  wghou09  阅读(180)  评论(0编辑  收藏  举报