在Matlab中求解PDE系统:网格上的导数

时间:2015-05-12 11:14:35

标签: matlab mesh pde

我正在使用MatLab来解决耦合偏微分方程系统pdenonlin

我为几何体创建了一个网格物体(一个中间有圆孔的方形盒子),然后将其细化直到我:

[p,e,t] = initmesh('DefectGeom2');
[p,e,t] = refinemesh('DefectGeom2',p,e,t);

我解决了系统问题

% SOLUTION:
u = pdenonlin(b_s,p,e,t,c_s,a_s,f_s);

% EXTRACT different functions from the full solutions (systems):
np = size(p,2); % number of node points
uk = reshape(u,np,[]); % each uk column has one component of u

因此,我现在拥有uk(在我的情况下为3)解决方案。

现在我想计算这种近似解的积分和导数。我尝试使用tri2grid

插值到统一网格
x=linspace(-1,1,Npts);
y=x;

psi=tri2grid(p,t,uk(:,3),x,y);
theta=tri2grid(p,t,uk(:,1),x,y);
theta_y=derivative(theta,1,2);
psi_x=derivative(psi,1,1);

并计算:

pressure = trapz(x,psi_x-cos(2*theta).*theta_y+sin(2*theta));

但这给了我一个很差的近似值,我猜是因为网格是均匀的,而网格在中心圆周围更细,而在其他地方更粗糙。

有没有办法可以使用MatLab内置函数来计算pdenonlin解的导数而不在统一网格上用tri2grid进行残余插值?

1 个答案:

答案 0 :(得分:0)

pde工具箱中有一个pdeInterpolant类可能很有用。使用meshToPet从网格生成输入参数,然后evaluate查询插值。

您可以在查询插值时指定不同的网格,因此如果在此阶段使用更精细的网格,则无需更改原始网格即可获得更好的结果。