此示例演示如何数值求解泊松方程,将数值解与精确解进行比较,并细化网格,直到解接近。金宝搏官方网站
具有零Dirichlet边界条件的单位圆盘上的泊松方程可以写成 在里面 , 在 哪里 是单位磁盘。精确解为
对于大多数偏微分方程,精确解是未知的。但是,单位圆盘上的泊松方程有一个已知的精确解,您可以使用它来查看在细化网格时误差是如何减小的。
创建PDE模型并包含几何图形。
model=createpde();geometryFromEdges(model,@circleg);
打印几何图形并显示边界条件定义中使用的边标签。
图pdegplot(模型,“EdgeLabels”,“开”);轴线相同的
在所有边上指定零Dirichlet边界条件。
applyBoundaryCondition(模型,“迪里克莱”,“边缘”1: model.Geometry.NumEdges,“你”, 0);
指定系数。
特定系数(型号,“米”,0,“d”,0,“c”1.“a”,0,“f”,1);
创建一个最大元素尺寸为0.1的网格。
hmax=0.1;生成网格(模型,“Hmax”,hmax);图pdemesh(模型);轴相同的
解偏微分方程并画出解。
结果=解算PDE(模型);u=结果。节点解算;pdeplot(模型,“XYData”(u)标题(“数值解”);xlabel(“x”) ylabel (“是的”)
将该结果与精确的解析解进行比较,并绘制误差图。
p=model.Mesh.Nodes;精确=(1-p(1,:).^2-p(2,:).^2)/4;pdeplot(model,“XYData”,u-确切名称(“错误”);xlabel(“x”) ylabel (“是的”)
求解方程,同时在每次迭代中细化网格,并将结果与精确解进行比较。每次细化将最大波高
优化网格,直到误差向量的无穷范数小于
.
hmax=0.1;error=[];err=1;虽然误差>5e-7%运行直到错误<=5e-7generateMesh(模型,“Hmax”,hmax);%细化网格结果=解算PDE(模型);u=结果.NodalSolution;p=模型.Mesh.Nodes;精确=(1-p(1,:).^2-p(2,:).^2)/4;错误=范数(u-精确');%与精确解比较错误=[error err];%记录错误的历史hmax=hmax/2;终止
绘制每次迭代的误差向量的无穷范数。误差值在每次迭代中减小。
绘图(错误,“rx”,“MarkerSize”12);甘氨胆酸ax =;斧子。XTick = 1:元素个数(错误);标题(“错误历史记录”);xlabel(“迭代”);伊莱贝尔(“错误标准”);
绘制最终网格及其相应的解决方案。
图pdemesh(型号);轴相同的
图pdeplot(型号,“XYData”(u)标题(“数值解”);xlabel(“x”) ylabel (“是的”)
将结果与精确的解析解进行比较,并绘制误差图。
p=model.Mesh.Nodes;精确=(1-p(1,:).^2-p(2,:).^2)/4;pdeplot(model,“XYData”,u-确切名称(“错误”);xlabel(“x”) ylabel (“是的”)