Установите начальные условия для модели с мелким mesh с помощью решения грубой сетки из предыдущего анализа.
Создайте модель УЧП и включите геометрию встроенной функции squareg
.
model = createpde; geometryFromEdges(model,@squareg);
Задайте коэффициенты, примените граничные условия и установите начальные условия.
specifyCoefficients(model,'m',0,'d',1,'c',5,'a',0,'f',0.1); applyBoundaryCondition(model,'dirichlet','Edge',1,'u',1); setInitialConditions(model,10);
Сгенерируйте сравнительно грубый mesh с целевой максимальной длиной ребра элемента 0,1.
generateMesh(model,'Hmax',0.1);
Решить модель для всего временного интервала от 0 до 0,02 секунд.
tlist = linspace(0,2E-2,20); Rtotal = solvepde(model,tlist);
Интерполируйте решение в источник на протяжении всего временного интервала.
singleSpanSol = Rtotal.interpolateSolution(0,0,1:numel(tlist));
Теперь решите модель для первой половины временного интервала. Вы будете использовать это решение как начальное условие при решении модели с более мелким mesh для второй половины временного интервала.
tlist1 = linspace(0,1E-2,10); R1 = solvepde(model,tlist1);
Создайте интерполяцию, чтобы интерполировать начальное условие.
x = model.Mesh.Nodes(1,:)'; y = model.Mesh.Nodes(2,:)'; interpolant = scatteredInterpolant(x,y,R1.NodalSolution(:,end));
Сгенерируйте более мелкий mesh путем установки целевой максимальной длины ребра элемента равной 0,05.
generateMesh(model,'Hmax',0.05);
Используйте результаты модели грубого mesh в качестве начального условия для модели с более мелким mesh. Для определения icFcn
функция, см. Функция начальных условий.
setInitialConditions(model,@(region) icFcn(region,interpolant));
Решить модель для второй половины временного интервала.
tlist2 = linspace(1E-2,2E-2,10); R2 = solvepde(model,tlist2);
Интерполируйте решения в источник для первой и второй половин временного интервала.
multispanSol1 = R1.interpolateSolution(0,0,1:numel(tlist1)); multispanSol2 = R2.interpolateSolution(0,0,1:numel(tlist2));
Постройте график всех трех решений в источник.
figure plot(tlist,singleSpanSol) hold on plot(tlist1, multispanSol1,'r*') plot(tlist2, multispanSol2,'ko') legend('Overall solution','Coarse mesh solution', 'Fine mesh solution')
function u0 = icFcn(region,interpolant) u0 = interpolant(region.x',region.y'); end