exponenta event banner

evaluateGradient

Оцените градиенты решений для УЧП в произвольных точках

Синтаксис

[gradx,grady] = evaluateGradient(results,xq,yq)
[gradx,grady,gradz] = evaluateGradient(results,xq,yq,zq)
[___] = evaluateGradient(results,querypoints)
[___] = evaluateGradient(___,iU)
[___] = evaluateGradient(___,iT)

Описание

пример

[gradx,grady] = evaluateGradient(results,xq,yq) возвращает интерполированные значения градиентов решения для УЧП results в 2D точках, заданных в xq и yq.

пример

[gradx,grady,gradz] = evaluateGradient(results,xq,yq,zq) возвращает интерполированные градиенты в 3-D точках, заданных в xq, yq и zq.

пример

[___] = evaluateGradient(results,querypoints) возвращает интерполированные значения градиентов в точках, заданных в querypoints.

пример

[___] = evaluateGradient(___,iU) возвращает интерполированные значения градиентов для системы уравнений для индексов уравнения (компоненты) iU. При решении системы эллиптических УЧП задайте iU после входных параметров в любом из предыдущих синтаксисов.

Первая размерность gradx, grady, и, в 3-D случае, gradz соответствует точкам запроса. Второе измерение соответствует индексам уравнения iU.

пример

[___] = evaluateGradient(___,iT) возвращает интерполированные значения градиентов для зависящего от времени уравнения или системы зависящих от времени уравнений во времена iT. При оценке градиента для зависящего от времени УЧП задайте iT после входных параметров в любом из предыдущих синтаксисов. Для системы зависящих от времени уравнений задайте и индексы времени iT и индексы уравнения (компоненты) iU.

Первая размерность gradx, grady, и, в 3-D случае, gradz соответствует точкам запроса. Для одного зависящего от времени УЧП второе измерение соответствует тактам iT. Для системы зависящих от времени УЧП второе измерение соответствует индексам уравнения iU, и третья размерность соответствует тактам iT.

Примеры

свернуть все

Оцените градиенты решения скалярной эллиптической проблемы вдоль строки. Постройте график результатов.

Создайте решение проблемы -Δu=1 на L-образной мембране с нулем граничные условия Дирихле.

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

Оцените градиенты решения вдоль прямой линии от (x,y)=(-1,-1) до (1,1). Постройте результаты как график полей градиента при помощи quiver.

xq = linspace(-1,1,101);
yq = xq;
[gradx,grady] = evaluateGradient(results,xq,yq);

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

quiver(xq,yq,gradx,grady)
xlabel('x')
ylabel('y')

Вычислите градиенты на среднее выходное время Броуновской частицы из области, которая содержит абсорбирующий (Escape) контуры и отражающиеся контуры. Используйте уравнение Пуассона с постоянными коэффициентами и 3-D прямоугольной геометрией блока, чтобы смоделировать эту проблему.

Создайте решение для этой проблемы.

model = createpde;
importGeometry(model,'Block.stl');
applyBoundaryCondition(model,'dirichlet','Face',[1,2,5],'u',0);
specifyCoefficients(model,'m',0,...
                          'd',0,...
                          'c',1,...
                          'a',0,...
                          'f',2);
generateMesh(model);
results = solvepde(model);

Создайте сетку и интерполируйте градиенты решения сетки.

[X,Y,Z] = meshgrid(1:16:100,1:6:20,1:7:50);
[gradx,grady,gradz] = evaluateGradient(results,X,Y,Z);

Измените градиенты к форме сетки и постройте градиенты.

gradx = reshape(gradx,size(X));
grady = reshape(grady,size(Y));
gradz = reshape(gradz,size(Z));

quiver3(X,Y,Z,gradx,grady,gradz)
axis equal
xlabel('x')
ylabel('y')
zlabel('z')

Решите скалярную эллиптическую проблему и интерполируйте градиенты решения плотной сетки. Используйте матрицу запроса, чтобы задать сетку.

Создайте решение проблемы -Δu=1 на L-образной мембране с нулем граничные условия Дирихле.

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

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

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

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

Увеличьте масштаб конкретной части графика видеть больше деталей. Например, ограничьте область значений графического вывода 0,2 в каждом направлении.

axis([-0.2 0.2 -0.2 0.2])

Оцените градиенты решения двухкомпонентной эллиптической системы и постройте результаты.

Создайте модель PDE для двух компонентов.

model = createpde(2);

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

R1 = [3,4,-0.3,0.3,0.3,-0.3,-0.3,-0.3,0.3,0.3]';
C1 = [1,0,0,0.1]';
C1 = [C1;zeros(length(R1)-length(C1),1)];
geom = [R1,C1];
ns = (char('R1','C1'))';
sf = 'R1 - C1';
g = decsg(geom,sf,ns);

Включайте геометрию в модель и просмотрите геометрию.

geometryFromEdges(model,g);
pdegplot(model,'EdgeLabels','on')
axis equal
axis([-0.4,0.4,-0.4,0.4])

Установите граничные условия и коэффициенты.

specifyCoefficients(model,'m',0,...
                          'd',0,...
                          'c',1,...
                          'a',0,...
                          'f',[2; -2]);

applyBoundaryCondition(model,'dirichlet','Edge',3,'u',[-1,1]);
applyBoundaryCondition(model,'dirichlet','Edge',1,'u',[1,-1]);
applyBoundaryCondition(model,'neumann','Edge',[2,4:8],'g',[0,0]);

Создайте mesh и решите проблему.

generateMesh(model,'Hmax',0.1);
results = solvepde(model);

Интерполируйте градиенты решения сетки от-0.3 до 0,3 в каждом направлении для каждого из этих двух компонентов.

v = linspace(-0.3,0.3,15);
[X,Y] = meshgrid(v);

[gradx,grady] = evaluateGradient(results,X,Y,[1,2]);

Постройте градиенты для первого компонента.

figure
gradx1 = gradx(:,1);
grady1 = grady(:,1);
quiver(X(:),Y(:),gradx1,grady1)
title('Component 1')
axis equal
xlim([-0.3,0.3])

Постройте градиенты для второго компонента.

figure
gradx2 = gradx(:,2);
grady2 = grady(:,2);
quiver(X(:),Y(:),gradx2,grady2)
title('Component 2')
axis equal
xlim([-0.3,0.3])

Решите систему гиперболических УЧП и оцените градиенты.

Импортируйте геометрию плиты для 3-D проблемы с тремя компонентами решения. Постройте геометрию.

model = createpde(3);
importGeometry(model,'Plate10x10x1.stl');
pdegplot(model,'FaceLabels','on','FaceAlpha',0.5)

Граница множества обусловливает таким образом, которые стоят 2, фиксируется (нулевое отклонение в любом направлении), и поверхность 5 имеет загрузку 1e3 в положительном z - направление. Эта загрузка заставляет плиту изгибаться вверх. Установите начальное условие, что решение является нулем, и его производная относительно времени является также нулем.

applyBoundaryCondition(model,'dirichlet','Face',2,'u',[0,0,0]);
applyBoundaryCondition(model,'neumann','Face',5,'g',[0,0,1e3]);
setInitialConditions(model,0,0);

Создайте коэффициенты УЧП для уравнений линейной эластичности. Установите свойства материала быть подобными тем из стали. Смотрите 3-D Линейные уравнения Эластичности в Форме Тулбокса.

E = 200e9;
nu = 0.3;
specifyCoefficients(model,'m',1,...
                          'd',0,...
                          'c',elasticityC3D(E,nu),...
                          'a',0,...
                          'f',[0;0;0]);

Сгенерируйте mesh, установку Hmax к 1.

generateMesh(model,'Hmax',1);

Решите проблему в течение многих времен 0 через 5e-3 на шагах 1e-4. Вам придется ожидать несколько минут решения.

tlist = 0:5e-4:5e-3;
results = solvepde(model,tlist);

Оцените градиенты решения в фиксированном x - и z - координирует в центрах их областей значений, 5 и 0.5 соответственно. Оцените для y от 0 до 10 на шагах 0,2. Получите только 3 компонента, z - компонент.

yy = 0:0.2:10;
zz = 0.5*ones(size(yy));
xx = 10*zz;
component = 3;
[gradx,grady,gradz] = evaluateGradient(results,xx,yy,zz,component,1:length(tlist));

Три проекции градиентов решения 51 1 51 массивом. Используйте squeeze, чтобы удалить одноэлементную размерность. Удаление одноэлементной размерности преобразовывает эти массивы к 51 51 матрицам, который упрощает индексацию в них.

gradx = squeeze(gradx);
grady = squeeze(grady);
gradz = squeeze(gradz);

Постройте интерполированный компонент градиента grady вдоль оси y для следующих шести значений от временного интервала tlist.

figure
t = [1:2:11];
for i = t
  p(i) = plot(yy,grady(:,i),'DisplayName', strcat('t=', num2str(tlist(i))));
  hold on
end
legend(p(t))
xlabel('y')
ylabel('grady')
ylim([-5e-6, 20e-6])

Входные параметры

свернуть все

Решение для УЧП, заданное как объект StationaryResults или объект TimeDependentResults. Создайте results с помощью solvepde или createPDEResults.

Пример: results = solvepde(model)

x- точки запроса, заданные как действительный массив. evaluateGradient оценивает градиенты решения в 2D точках координаты, которые что [xq(i),yq(i)] или в 3-D координате указывает [xq(i),yq(i),zq(i)]. Так xq, yq, и (если есть) zq должен иметь то же количество записей.

evaluateGradient преобразовывает точки запроса в вектор-столбцы xq(:), yq(:), и (если есть) zq(:). Для одного стационарного УЧП результат состоит из вектор-столбцов, одного размера. Чтобы гарантировать, что размерности компонентов градиента сопоставимы с размерностями точек исходного запроса, используйте reshape. Например, используйте gradx = reshape(gradx,size(xq)).

Для зависящего от времени УЧП или системы УЧП, первая размерность полученных массивов соответствует пространственным точкам, заданным вектор-столбцами xq(:), yq(:), и (если есть) zq(:).

Типы данных: double

y- точки запроса, заданные как действительный массив. evaluateGradient оценивает градиенты решения в 2D точках координаты, которые что [xq(i),yq(i)] или в 3-D координате указывает [xq(i),yq(i),zq(i)]. Так xq, yq, и (если есть) zq должен иметь то же количество записей.

evaluateGradient преобразовывает точки запроса в вектор-столбцы xq(:), yq(:), и (если есть) zq(:). Для одного стационарного УЧП результат состоит из вектор-столбцов, одного размера. Чтобы гарантировать, что размерности компонентов градиента сопоставимы с размерностями точек исходного запроса, используйте reshape. Например, используйте grady = reshape(grady,size(yq)).

Для зависящего от времени УЧП или системы УЧП, первая размерность полученных массивов соответствует пространственным точкам, заданным вектор-столбцами xq(:), yq(:), и (если есть) zq(:).

Типы данных: double

z- точки запроса, заданные как действительный массив. evaluateGradient оценивает градиенты решения в 3-D точках координаты [xq(i),yq(i),zq(i)]. Так xq, yq и zq должны иметь то же количество записей.

evaluateGradient преобразовывает точки запроса в вектор-столбцы xq(:), yq(:), и (если есть) zq(:). Для одного стационарного УЧП результат состоит из вектор-столбцов, одного размера. Чтобы гарантировать, что размерности компонентов градиента сопоставимы с размерностями точек исходного запроса, используйте reshape. Например, используйте gradz = reshape(gradz,size(zq)).

Для зависящего от времени УЧП или системы УЧП, первая размерность полученных массивов соответствует пространственным точкам, заданным вектор-столбцами xq(:), yq(:), и (если есть) zq(:).

Типы данных: double

Точки запроса, заданные как действительная матрица или с двумя строками для 2D геометрии или с тремя строками для 3-D геометрии. evaluateGradient оценивает градиенты решения в точках координаты querypoints(:,i), таким образом, каждый столбец querypoints содержит точно одну 2D или 3-D точку запроса.

Пример: Для 2D геометрии, querypoints = [0.5,0.5,0.75,0.75; 1,2,0,0.5]

Типы данных: double

Индексы уравнения, заданные как вектор положительных целых чисел. Каждая запись в iU задает индекс уравнения.

Пример: iU = [1,5] задает индексы для первых и пятых уравнений.

Типы данных: double

Индексы времени, заданные как вектор положительных целых чисел. Каждая запись в iT задает индекс времени.

Пример: iT = 1:5:21 задает каждый пятый такт до 21.

Типы данных: double

Выходные аргументы

свернуть все

x- градиента, возвращенного как массив. Для точек запроса, которые являются вне геометрии, gradx = NaN. Для получения информации о размере gradx смотрите Размерности Решений, Градиентов и Потоков.

y- градиента, возвращенного как массив. Для точек запроса, которые являются вне геометрии, grady = NaN. Для получения информации о размере grady смотрите Размерности Решений, Градиентов и Потоков.

z- градиента, возвращенного как массив. Для точек запроса, которые являются вне геометрии, gradz = NaN. Для получения информации о размере gradz смотрите Размерности Решений, Градиентов и Потоков.

Советы

Объект results содержит решение и его градиент, вычисленный в узлах треугольной или четырехгранной mesh. Можно получить доступ к решению и трем компонентам градиента в узлах при помощи записи через точку.

interpolateSolution и evaluateGradient позволяют вам интерполировать решение и его градиент к пользовательской сетке, например, заданный meshgrid.

Введенный в R2016a