Добрый день, уважаемые форумчане. Я никак не могу разобраться с тем, как задать граничные условия для простого уравнения теплопроводности. Заданная задача в приложенном файле.
У меня есть файл, где определяются граничные условия, но не могу понять как там определить их через время.
файл, где решается уравнение:
Код:
%решаем следующую задачу средствами MatLab PDE toolbox
%du/dt=(alpha^2)*(d2u/dx2) – параболическое уравнение
% u(x,0)=fi(x), 0<=x<=1 – начальное условие, любая функция заданная пользователем
% u(0,t)=0, u(1,t)=0, 0<=t<=t_max – граничные условия
echo off;
syms fi x;
%Начальное распределение температуры, задаётся пользователем:
fi=x*(x-1);
%Коэффициент alpha, задаётся пользователем:
alpha=0.1;
%Максимальное время, задаётся пользователем:
t_max=1;
%Количество интервалов по координате, задаётся пользователем:
n_razb_x=100;
%Генерация сетки:
[p,e,t]=poimesh('squareg',n_razb_x,1);
%Преобразование сетки из [-1,1] в [0,1] по x и по y:
p(1,:)=(p(1,:)+1)/2;
p(2,:)=(p(2,:)+1)/2;
%Количество узлов сетки:
np=size(p,2);
%Инициализация массива начальных значений в узлах сетки:
u0=zeros(np,1);
%Подстановка начальных значений в узлы сетки:
u0(:,1)=subs(fi,x,p(1,:));
%Массив значений времени:
tlist=0:t_max;
%Решение параболического уравнения:
u=parabolic(u0,tlist,'bn',p,e,t,alpha^2,0,0,1);
%Задаём координатную сетку:
[X,T]=meshgrid(linspace(0,1,n_razb_x+1),tlist);
%Инициализируем матрицу значений функции (матрицу графика):
u2=zeros(size(T,1),size(X,2));
%Заполняем матрицу значений функции, учитывая то,
%каким образом данные хранятся в u.
for xx=1:1:size(u2,2)
for tt=1:1:size(u2,1)
u2(tt,xx)=u(xx,tt);
%берём нужное значение из u и ставим его в нужное место матрицы графика.
end; end;
%Рисуем:
surf(X,T,u2)
файл, где задаются граничные условия:
Код:
% задание граничных условий для нашей задачи – хранятся в файле bn.m
function [q,g,h,r]=pdebound(p,e,u,time)
%Определение числа рёбер в границе:
nb=size(e,2);
%Инициализация массивов:
q=zeros(1,nb);
g=zeros(1,nb);
h=zeros(1,2*nb);
r=zeros(1,2*nb);
for i=1:1:nb
%Из всех рёбер в границе выбираем только те, которые
%лежат на границе стержня (x=0 или x=1):
if ((p(1,e(1,i))==0) && (p(1,e(2,i))==0)) || ((p(1,e(1,i))==1) && (p(1,e(2,i))==1))
%Для этих рёбер задаём условие Дирихле u=0 (hu=r => h=const, r=0)
%понятно, что здесь нужно задавать условия, но он не принимает функции
h(1,i)=1;
h(1,nb+i)=1;
end; end;
Подскажите, пожалуйста, каким образом задать граничные условия через время.
http://www.cyberforum.ru/attachments/328061d1384173730