我正在使用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
进行残余插值?
答案 0 :(得分:0)
pde工具箱中有一个pdeInterpolant
类可能很有用。使用meshToPet
从网格生成输入参数,然后evaluate
查询插值。
您可以在查询插值时指定不同的网格,因此如果在此阶段使用更精细的网格,则无需更改原始网格即可获得更好的结果。