В этом примере показано, как записывать функции для спецификации непостоянного граничного условия.
Во всех спецификациях используется одна и та же геометрия, представляющая собой прямоугольник с круглым отверстием.
% Rectangle is code 3, 4 sides, followed by x-coordinates and then y-coordinates R1 = [3,4,-1,1,1,-1,-.4,-.4,.4,.4]'; % Circle is code 1, center (.5,0), radius .2 C1 = [1,.5,0,.2]'; % Pad C1 with zeros to enable concatenation with R1 C1 = [C1;zeros(length(R1)-length(C1),1)]; geom = [R1,C1]; % Names for the two geometric objects ns = (char('R1','C1'))'; % Set formula sf = 'R1-C1'; % Create geometry g = decsg(geom,sf,ns); % Create geometry model model = createpde; % Include the geometry in the model and view the geometry geometryFromEdges(model,g); pdegplot(model,'EdgeLabels','on') xlim([-1.1 1.1]) axis equal

Кромка 3 имеет условия Дирихле со значением 32.
Кромка 1 имеет условия Дирихле со значением 72.
Кромки 2 и 4 имеют условия Дирихле, которые линейно интерполируются между кромками 1 и 3.
Круговые кромки (5-8) имеют условия Неймана с q = 0, g = -1.
applyBoundaryCondition(model,'dirichlet','Edge',3,'u',32); applyBoundaryCondition(model,'dirichlet','Edge',1,'u',72); applyBoundaryCondition(model,'neumann','Edge',5:8,'g',-1); % q = 0 by default
Ребрам 2 и 4 нужны функции, которые выполняют линейную интерполяцию. Каждое ребро может использовать ту же функцию, которая возвращает значение + 20x.
Эту простую интерполяцию можно реализовать в анонимной функции.
myufunction = @(location,state)52 + 20*location.x;
Включите функцию для кромок 2 и 4. Чтобы ускорить решатель, разрешите векторизированную оценку.
applyBoundaryCondition(model,'dirichlet','Edge',[2,4],... 'u',myufunction,... 'Vectorized','on');
Решите эллиптический PDE с помощью этих граничных условий, используя параметры c = 1, a = 0, и | f = 10 |. Поскольку более короткая прямоугольная сторона имеет длину 0,8, чтобы гарантировать, что сетка не слишком грубая, выберите максимальный размер сетки.Hmax = 0.1.
specifyCoefficients(model,'m',0,'d',0,'c',1,'a',0,'f',10); generateMesh(model,'Hmax',0.1); results = solvepde(model); u = results.NodalSolution; pdeplot(model,'XYData',u)

Предположим, что система имеет N = 2.
Кромка 3 имеет условия Дирихле со значениями [32,72].
Кромка 1 имеет условия Дирихле со значениями [72,32].
Кромки 2 и 4 имеют условия Дирихле, которые интерполируются между условиями на кромках 1 и 3 и включают синусоидальное изменение.
Круговые кромки (кромки 5-8) имеют q = 0 и g = -10.
model = createpde(2); geometryFromEdges(model,g); applyBoundaryCondition(model,'dirichlet','Edge',3,'u',[32,72]); applyBoundaryCondition(model,'dirichlet','Edge',1,'u',[72,32]); applyBoundaryCondition(model,'neumann','Edge',5:8,'g',[-10,-10]);
Первая составляющая рёбер 2 и 4 удовлетворяет уравнению 10sin (securityx3).
Вторая составляющая удовлетворяет securityx3).
Запись файла функции myufun.m , которая включает эти уравнения в синтаксис, описанный в разделе Некондиционные граничные условия.
function bcMatrix = myufun(location,state)
bcMatrix = [52 + 20*location.x + 10*sin(pi*(location.x.^3));
52 - 20*location.x - 10*sin(pi*(location.x.^3))]; % OK to vectorize
end
Включите эту функцию в граничное условие кромки 2 и кромки 4.
applyBoundaryCondition(model,'dirichlet','Edge',[2,4],... 'u',@myufun,... 'Vectorized','on');
Решите эллиптический PDE с этими граничными условиями, с параметрами c = 1, a = 0, и f = (10,-10). Поскольку более короткая прямоугольная сторона имеет длину 0,8, чтобы гарантировать, что сетка не слишком грубая, выберите максимальный размер сетки. Hmax = 0.1.
specifyCoefficients(model,'m',0,'d',0,'c',1,'a',0,'f',[10;-10]); generateMesh(model,'Hmax',0.1); results = solvepde(model); u = results.NodalSolution; subplot(1,2,1) pdeplot(model,'XYData',u(:,1),'ZData',u(:,1),'ColorBar','off') view(-9,24) subplot(1,2,2) pdeplot(model,'XYData',u(:,2),'ZData',u(:,2),'ColorBar','off') view(-9,24)
