exponenta event banner

Постройте 2D решения и их градиенты

Постройте решения без явной интерполяции

Чтобы быстро визуализировать 2D скалярное решение для УЧП, используйте функцию pdeplot. Эта функция позволяет вам построить решение, явным образом не интерполируя решение. Например, решите скалярную эллиптическую проблему -u=1 на L-образной мембране с нулем граничные условия Дирихле и график решение.

Создайте модель PDE, 2D геометрию и mesh. Задайте граничные условия и коэффициенты. Решите проблему УЧП.

model = createpde;
geometryFromEdges(model,@lshapeg);
applyBoundaryCondition(model,'dirichlet','edge',1:model.Geometry.NumEdges,'u',0);
c = 1;
a = 0;
f = 1;
specifyCoefficients(model,'m',0,'d',0,'c',c,'a',a,'f',f);
generateMesh(model);

results = solvepde(model);

Используйте pdeplot, чтобы построить решение.

u = results.NodalSolution;
pdeplot(model,'XYData',u,'ZData',u,'Mesh','on')
xlabel('x')
ylabel('y')

Чтобы получить более сглаженную поверхность решения, задайте максимальный размер треугольников mesh при помощи аргумента Hmax. Затем решите проблему УЧП с помощью этой новой mesh и постройте решение снова.

generateMesh(model,'Hmax',0.05);
results = solvepde(model);
u = results.NodalSolution;

pdeplot(model,'XYData',u,'ZData',u,'Mesh','on')
xlabel('x')
ylabel('y')

Интерполируйте и постройте решения и градиенты

Также можно интерполировать решение и, в случае необходимости, его градиент на отдельных шагах, и затем построить результаты при помощи функций MATLAB™, таких как surf, mesh, quiver, и так далее. Например, решите ту же скалярную эллиптическую проблему -Δu=1 на L-образной мембране с нулем граничные условия Дирихле. Интерполируйте решение и его градиент, и затем постройте результаты.

Создайте модель PDE, 2D геометрию и mesh. Задайте граничные условия и коэффициенты. Решите проблему УЧП.

model = createpde;
geometryFromEdges(model,@lshapeg);
applyBoundaryCondition(model,'dirichlet','edge',1:model.Geometry.NumEdges,'u',0);
c = 1;
a = 0;
f = 1;
specifyCoefficients(model,'m',0,'d',0,'c',c,'a',a,'f',f);
generateMesh(model,'Hmax',0.05);
results = solvepde(model);

Интерполируйте решение и его градиенты к плотной сетке от-1 до 1 в каждом направлении.

v = linspace(-1,1,101);
[X,Y] = meshgrid(v);
querypoints = [X(:),Y(:)]';
uintrp = interpolateSolution(results,querypoints);

Постройте получившееся решение на mesh.

uintrp = reshape(uintrp,size(X));
mesh(X,Y,uintrp)
xlabel('x')
ylabel('y')

Интерполируйте градиенты решения сетки от-1 до 1 в каждом направлении. Постройте результат с помощью quiver.

[gradx,grady] = evaluateGradient(results,querypoints);
figure
quiver(X(:),Y(:),gradx,grady)
xlabel('x')
ylabel('y')

Увеличьте масштаб, чтобы видеть больше деталей. Например, ограничьте область значений [-0.2,0.2] в каждом направлении.

axis([-0.2 0.2 -0.2 0.2])

Постройте решение и градиенты на той же области значений.

figure
h1 = meshc(X,Y,uintrp);
set(h1,'FaceColor','g','EdgeColor','b')
xlabel('x')
ylabel('y')
alpha(0.5)
hold on

Z = -0.05*ones(size(X));
gradz = zeros(size(gradx));

h2 = quiver3(X(:),Y(:),Z(:),gradx,grady,gradz);
set(h2,'Color','r')
axis([-0.2,0.2,-0.2,0.2])

Срез решения строит вдоль строки x = y.

figure
mesh(X,Y,uintrp)
xlabel('x')
ylabel('y')
alpha(0.25)
hold on

z = linspace(0,0.15,101);
Z = meshgrid(z);
surf(X,X,Z')

view([-20 -45 15])
colormap winter

Постройте интерполированное решение вдоль строки.

figure
xq = v;
yq = v;
uintrp = interpolateSolution(results,xq,yq);

plot3(xq,yq,uintrp)
grid on
xlabel('x')
ylabel('y')

Интерполируйте градиенты решения вдоль той же строки и добавьте их в график решения.

[gradx,grady] = evaluateGradient(results,xq,yq);

gradx = reshape(gradx,size(xq));
grady = reshape(grady,size(yq));

hold on
quiver(xq,yq,gradx,grady)
view([-20 -45 75])