主要内容

单位圆盘上的泊松方程

这个例子展示了如何数值求解泊松方程,比较数值解和精确解,并细化网格,直到解接近。

狄利克雷边界条件为零的单位圆盘上的泊松方程可以写成 - Δ u 1 Ω u 0 δ Ω ,在那里 Ω 是单元磁盘。确切的解是

u x y 1 - x 2 - y 2 4

对于大多数偏微分方程,确切的解是未知的。然而,单位圆盘上的泊松方程有一个已知的精确解,您可以使用它来查看当您细化网格时,误差是如何减小的。

问题定义

创建PDE模型并包含几何图形。

模型= createpde();geometryFromEdges(模型、@circleg);

绘制几何图形并显示边缘标签,以便在边界条件定义中使用。

图pdegplot(模型,“EdgeLabels”“上”);轴平等的

图中包含一个axes对象。axis对象包含5个类型为line、text的对象。

在所有边上指定零狄利克雷边界条件。

applyBoundaryCondition(模型,“边界条件”...“边缘”1: model.Geometry.NumEdges,...“u”, 0);

指定系数。

specifyCoefficients(模型,“m”0,“d”0,“c”,1,“一个”0,“f”1);

粗网格的解法与误差

创建一个目标最大元素尺寸为0.1的网格。

Hmax = 0.1;generateMesh(模型,“Hmax”, hmax);图pdemesh(模型);轴平等的

图中包含一个axes对象。坐标轴对象包含两个line类型的对象。

解PDE并绘制解。

结果= solvepde(模型);u = results.NodalSolution;pdeplot(模型,“XYData”u)标题(“数值解”);包含(“x”) ylabel (“y”

图中包含一个axes对象。标题为Numerical Solution的axis对象包含一个patch类型的对象。

将所得结果与精确解析解进行比较,并绘制误差图。

p = model.Mesh.Nodes;Exact = (1 - p(1,:)。^2 - p(2,:).^2)/4;pdeplot(模型,“XYData”,u -精确的')标题(“错误”);包含(“x”) ylabel (“y”

图中包含一个axes对象。标题为Error的axes对象包含一个类型为patch的对象。

精化网格的解与误差

在每次迭代中细化网格的同时求解方程,并将结果与精确解进行比较。每次细化一半Hmax价值。细化网格,直到误差向量的无穷范数小于 5 10 - 7

Hmax = 0.1;错误= [];Err = 1;额,5e-7%运行直到错误<= 5e-7generateMesh(模型,“Hmax”, hmax);%细化网格结果= solvepde(模型);u = results.NodalSolution;p = model.Mesh.Nodes;Exact = (1 - p(1,:)。^2 - p(2,:).^2)/4;Err = norm(u - exact',inf);%与精确解比较错误= [Error err];保留错误的历史Hmax = Hmax /2;结束

绘制每次迭代的误差向量的无穷范数。误差的值在每一次迭代中都在减小。

情节(错误,“处方”“MarkerSize”12);Ax = gca;斧子。XTick = 1:数值(错误);标题(“历史错误”);包含(“迭代”);ylabel (“误差准则”);

图中包含一个axes对象。标题为Error History的axes对象包含一个类型为line的对象。

绘制最终网格及其对应解。

图pdemesh(模型);轴平等的

图中包含一个axes对象。坐标轴对象包含两个line类型的对象。

图pdeplot(模型,“XYData”u)标题(“数值解”);包含(“x”) ylabel (“y”

图中包含一个axes对象。标题为Numerical Solution的axis对象包含一个patch类型的对象。

将结果与精确解析解进行比较,并绘制误差曲线。

p = model.Mesh.Nodes;Exact = (1 - p(1,:)。^2 - p(2,:).^2)/4;pdeplot(模型,“XYData”,u -精确的')标题(“错误”);包含(“x”) ylabel (“y”

图中包含一个axes对象。标题为Error的axes对象包含一个类型为patch的对象。

Baidu
map