Этот пример показывает, как решить нелинейную систему PDE из двух уравнений с перекрестными связями между этими двумя компонентами. Система является системой Шнакенберга
с установившимся решением и . Начальные условия являются небольшим возмущением установившегося решения.
Сначала создайте модель PDE для системы двух уравнений.
model = createpde(2);
Создайте кубическую геометрию и присвойте ее модели.
gm = multicuboid(1,1,1); model.Geometry = gm;
Сгенерируйте mesh с помощью линейного геометрического порядка для сохранения памяти.
generateMesh(model,'GeometricOrder','linear');
Определите параметры системы.
D1 = 0.05; D2 = 1; kappa = 100; a = 0.2; b = 0.8;
На основе этих параметров задайте коэффициенты УЧП в формате тулбокса.
d = [1;1]; c = [D1;D2]; f = @(region,state) [kappa*(a - state.u(1,:) + ... state.u(1,:).^2.*state.u(2,:)); kappa*(b - state.u(1,:).^2.*state.u(2,:)) ]; specifyCoefficients(model,'m',0,'d',d,'c',c,'a',0,'f',f);
Установите начальные условия. Первый компонент является небольшим возмущением установившегося решения . Второй компонент является установившимся решением .
icFcn = @(region) [a + b + 10^(-3)*exp(-100*((region.x - 1/3).^2 ... + (region.y - 1/2).^2)); ... (b/(a + b)^2)*ones(size(region.x))]; setInitialConditions(model,icFcn);
Решите систему в течение времени от 0 до 2 секунд.
tlist = linspace(0,2,10); results = solvepde(model,tlist);
Постройте график первого компонента решения на последнем временном шаге.
pdeplot3D(model,'ColorMapData',results.NodalSolution(:,1,end));
Теперь возобновите анализ и решите задачу за время от 2 до 5 секунд. Уменьшите величину ранее полученного решения на время 2 секунды до 10% от исходного значения.
u2 = results.NodalSolution(:,:,end); newResults = createPDEResults(model,u2(:)*0.1);
Использование newResults
в качестве начального условия для последующего анализа.
setInitialConditions(model,newResults);
Решите систему в течение времени от 2 до 5 секунд.
tlist = linspace(2,5,10); results25 = solvepde(model,tlist);
Постройте график первого компонента решения на последнем временном шаге.
figure
pdeplot3D(model,'ColorMapData',results25.NodalSolution(:,1,end));
Кроме того, можно записать функцию, которая использует результаты, возвращенные решателем, и вычисляет начальные условия на основе результатов предыдущего анализа.
NewIC = @(location) computeNewIC(results)
NewIC = function_handle with value:
@(location)computeNewIC(results)
Удалите предыдущие начальные условия.
delete(model.InitialConditions);
Установите начальные условия с помощью функции NewIC
.
setInitialConditions(model,NewIC)
ans = GeometricInitialConditions with properties: RegionType: 'cell' RegionID: 1 InitialValue: @(location)computeNewIC(results) InitialDerivative: []
Решите систему в течение времени от 2 до 5 секунд.
results25f = solvepde(model,tlist);
Постройте график первого компонента решения на последнем временном шаге.
figure
pdeplot3D(model,'ColorMapData',results25f.NodalSolution(:,1,end));
function newU0 = computeNewIC(resultsObject) newU0 = 0.1*resultsObject.NodalSolution(:,:,end).'; end