平方域上的波动方程

这个例子说明了如何用solvepde函数。

标准的二阶波动方程是

* 2 u * t 2 - * · * u = 0

若要在“工具箱”形式中表示此属性,请注意solvepde功能解决了表单的问题

* 2 u * t 2 - * · ( c * u ) + 一个 u = f

所以标准的波动方程有系数 = 1 , c = 1 , 一个 = 0 , f = 0

c = 1;= 0;f = 0;m = 1;

在平方域上解决问题。的squareg函数描述了这个几何图形。创建一个模型对象和包括几何图形。绘制几何图形并查看边缘标签。

numberOfPDE = 1;模型= createpde (numberOfPDE);geometryFromEdges(模型、@squareg);pdegplot(模型,“EdgeLabels”,“上”);ylim ([-1.1 - 1.1]);轴平等的标题“显示边缘标签的几何图形”;包含xylabely

指定PDE系数。

specifyCoefficients(模型,“米”米,' d '0,“c”c“一个”一个,“f”f);

在左侧(边缘4)和右侧(边缘2)设置零狄利克雷边界条件,在顶部(边缘1)和底部(边缘3)设置零诺伊曼边界条件。

applyBoundaryCondition(模型,“边界条件”,“边缘”(2、4),“u”,0);applyBoundaryCondition(模型,“纽曼”,“边缘”3 ([1]),‘g’,0);

创建并查看问题的有限元网格。

generateMesh(模型);图pdemesh(模型);ylim ([-1.1 - 1.1]);轴平等的包含xylabely

设定以下初始条件:

  • u ( x , 0 ) = 反正切 ( 因为 ( π x 2 ) )

  • * u * t | t = 0 = 3. ( π x ) 经验值 ( ( π y 2 ) )

u0 = @(location) atan(cos(pi/2*location.x));ut0 = @(location) 3*sin(pi*location.x).*exp(sin(pi/2*location.y));setInitialConditions(模型、情况ut0);

这种选择避免了把能量投入到较高的振动模式,并允许一个合理的时间步长。

指定解乘以从0到5的31个等距点。

n = 31;tlist = linspace (0 5 n);

设置SolverOptions.ReportStatistics模型“上”

model.SolverOptions。ReportStatistics =“上”;结果= solvepde(模型、tlist);
459成功步骤39次失败尝试998次函数计算1偏导数115 LU分解线性系统的997个解金宝搏官方网站
u = result.NodalSolution;

创建一个动画来可视化所有时间步骤的解决方案。保持一个固定的垂直比例尺,首先计算的最大值和最小值u在任何时候,并缩放所有的图来使用它们 z 设在限制。

图umax = max(max(u));umin = min (min (u));i = 1:n pdeplot(模型,“XYData”u(:,我),“ZData”u(:,我),“ZStyle”,“连续”,“网”,“关闭”,“XYGrid”,“上”,“ColorBar”,“关闭”);轴([-1 -1 -1 -1 umin umax]);caxis ([umin umax]);包含xylabelyzlabeluM (i) = getframe;结束

要播放动画,使用电影(M)命令。