这个例子展示了如何数值求解泊松方程,比较数值解和精确解,并细化网格直到解接近。金宝搏官方网站
在具有零狄利克雷边界条件的单位圆盘上的泊松方程可以写成 在 , 在 ,在那里 为单位磁盘。准确的解是
对于大多数偏微分方程,精确的解是未知的。然而,单位圆盘上的泊松方程有一个已知的、精确的解,您可以使用它来查看在细化网格时误差是如何减小的。
创建PDE模型并包含几何图形。
模型= createpde ();geometryFromEdges(模型、@circleg);
绘制几何图形并显示边界条件定义中使用的边缘标签。
图pdegplot(模型,“EdgeLabels”,“上”);轴平等的
在所有边上指定零狄利克雷边界条件。
applyBoundaryCondition(模型,“边界条件”,...“边缘”1: model.Geometry.NumEdges,...“u”, 0);
指定系数。
specifyCoefficients(模型,“米”0,' d '0,“c”, 1“一个”0,“f”1);
创建一个最大元素尺寸为0.1的网格。
hmax = 0.1;generateMesh(模型,“Hmax”, hmax);图pdemesh(模型);轴平等的
解偏微分方程并画出解。
结果= solvepde(模型);u = results.NodalSolution;pdeplot(模型,“XYData”u)标题(的数值解);包含(“x”) ylabel (“y”)
将此结果与精确解析解进行比较,并绘制误差曲线。
p = model.Mesh.Nodes;Exact = (1 - p(1,:)。: ^ 2 - p(2)。^ 2)/ 4;pdeplot(模型,“XYData”,u - exact')“错误”);包含(“x”) ylabel (“y”)
求解方程,在每次迭代中细化网格,并将结果与精确解进行比较。每次细分都将Hmax
价值。细化网格,直到误差向量无穷大范数小于
.
hmax = 0.1;错误= [];呃= 1;而犯错> 5 e -%运行直到错误<= 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];保存err的历史hmax = hmax / 2;结束
绘制每个迭代的错误向量的无限范数。误差值在每次迭代中减小。
情节(错误,“处方”,“MarkerSize”12);甘氨胆酸ax =;斧子。XTick = 1:元素个数(错误);标题(“历史错误”);包含(“迭代”);ylabel (错误的标准);
绘制最终的网格及其对应的解。
图pdemesh(模型);轴平等的
图pdeplot(模型,“XYData”u)标题(的数值解);包含(“x”) ylabel (“y”)
将结果与精确解析解进行比较,并绘制误差曲线。
p = model.Mesh.Nodes;Exact = (1 - p(1,:)。: ^ 2 - p(2)。^ 2)/ 4;pdeplot(模型,“XYData”,u - exact')“错误”);包含(“x”) ylabel (“y”)