Условие задачи:
(1)
Граничные условия:
(2)
(3)
Начальные условия:
(4)
(5)
Нужно решить методом конечных разностей.
, а также шаги по пространственной и временной координатам взять произвольные. Также надо сравнить на графиках полученное решение с
, эта функция является решением уравнения.
Я вроде как решил, но графики совсем разные получаются, ошибку не могу никак найти.
Решал с помощью неявной конечно-разностной схемы.
Шаг по каждой из переменных взял 0.157,
. Ввёл сетку:
Обозначил за
значение
. Значения
вычисляются из (4),
равны:
1, 0.84419, 0.6948, 0.55639, 0.43184, 0.32265, 0.2293, 0.15144, 0.088178, 0.03825, 0.0001
из (5). Чтобы найти значение функции на следующих временных слоях, надо аппроксимировать значения производных в уравнении (1), здесь h_x и h_t - это шаги по переменным, равные 0.157:
(6)
Уравнения (2)-(3) подставляются значениями сетки очевидно, тогда
.
Тогда относительно переменных
на каждом временном слое, начиная с k=2, получаем трёхдиагональную СЛАУ, которую можно решить методом прогонки. Коэффициенты уравнений для временного слоя k:
- эти коэффициенты очевидно вытекают из (2)-(3).
Остальные коэффициенты берём из (6):
Итоговые результаты вычисления (
находится в j-той строке и k-том столбце):
В то время как решение уравнения такое:
Как видно, совсем не то, что надо
И ещё видно, что моё решение сильно возрастает с увеличением t.
Код GNU/Octave (свободный аналог Matlab) для решения уравнения:
Код:
nx=11; % количество шагов по Ox
nt=11; % количество шагов по Ot
hx=0.157; % шаг по Ox
ht=0.157; % шаг по Ot
disp('начальное условие');
for x=1:nx;
u(x,1)=u(x,2)=exp(-(x-1)*hx)*cos((x-1)*hx); % начальное условие
disp('x');
disp(x);
disp('u(x,1)');
disp(u(x,1));
end;
disp('граничные условия');
for t=3:nt;
fl(t)=cos(2*(t-1)*ht); % левое граничное условие
fr(t)=0; % правое граничное условие
end;
disp('левое граничное условие');
disp(fl);
disp('правое граничное условие');
disp(fr);
for t=3:nt;
% нахождение коэффициентов a, b, c, d для прогонки
a(1)=c(1)=a(nx)=c(nx)=0;
b(1)=b(nx)=1;
d(1)=fl(t);
d(nx)=fr(t);
for i=2:nx-1;
a(i)=1/hx^2;
b(i)=-2/hx^2-2/hx-2-1/ht^2;
c(i)=1/hx^2+2/hx;
d(i)=(-2*u(i,t-1)-u(i,t-2))/ht^2;
end;
pa(1)=-c(1)/b(1); % коэффициент прогонки A
pb(1)=d(1)/b(1); % коэффициент прогонки B
% нахождение остальных коэффициентов прогонки
disp('a');
disp(a);
disp('b');
disp(b);
disp('c');
disp(c);
disp('d');
disp(d);
for i=2:nx;
pa(i)=-c(i)/(b(i)+a(i)*pa(i-1));
pb(i)=(d(i)-a(i)*pb(i-1))/(b(i)+a(i)*pa(i-1));
end;
disp('pa');
disp(pa);
disp('pb');
disp(pb);
% обратный шаг: нахождение u(x,t)
u(nx,t)=pb(nx);
for i=1:nx-1;
u(nx-i,t)=pa(nx-i)*u(nx-i+1,t)+pb(nx-i);
end;
prov(1)=d(1)-b(1)*u(1,t)-c(1)*u(2,t);
prov(nx)=d(nx)-a(nx)*u(nx-1,t)-b(nx)*u(nx,t);
for i=2:nx-1;
prov(i)=d(i)-a(i)*u(i-1,t)-b(i)*u(i,t)-c(i)*u(i+1,t);
end;
disp('prov');
disp(prov);
end;
for t=1:nt;
for x=1:nx;
g(x,t)=exp(-(x-1)*hx)*cos((x-1)*hx)*cos(2*(t-1)*ht);
end;
end;
disp(g);