- •Решение задачи с помощью явной разностной схемы
- •2.1 Аппроксимация дифференциального уравнения
- •2.2 Аппроксимация 1-го начального условия.
- •2.3 Аппроксимация 1-го граничного условия.
- •2.4 Аппроксимация 2-го начального условия.
- •Аппроксимация 2-го граничного условия .
- •Решение задачи с помощью неявной разностной схемы
- •3.1 Аппроксимация дифференциального уравнения
- •3.2 Аппроксимация 1-го начального условия
- •3.3 Аппроксимация 1-го граничного условия
- •3.4 Аппроксимация 2-го начального условия
- •Аппроксимация 2-го граничного условия
- •3.6 Вычисления прогоночных коэффициентов
3.4 Аппроксимация 2-го начального условия
Для более точного аппроксимирования 2-го начального условия разложим u(x,T )
в окрестности точки (x,0) по формуле Тейлора и используя 1-ое и 2-ое начальное условия перейдем к конечным разностям:
Эта формула отличается от аналогичной для явной схемы тем ,что аппроксимация разностной производной второго порядка по х производится на первом слое ,а не на нулевом . Запишем (5) к виду удобному для применения метода прогонки:
-
Аппроксимация 2-го граничного условия
3.6 Вычисления прогоночных коэффициентов
Сначала найдем u(i,j) на слое j=1. Определим прогоночные коэффициенты.
Учитывая 1-ое граничное условие и уравнение (6) получаем:
Теперь вычислим граничные прогоночные коэффициенты
Методом прогонки находим u(i,1) где i=1...m ;
Теперь зная значения j=0,1 находим u(i,j ) где j=2...n.
Используя уравнение (2) находим прогоночные коэффициенты:
Теперь вычислим граничные прогоночные коэффициенты
Методом прогонки находим u(i,j) где i=1...m ,j=2..n ;
Текст программы в среде Matlab приведен в приложении (стр. ). Поверхность функции являющейся решением нашего дифференциального уравнения изображена в приложении (стр. ).
ПРИЛОЖЕНИЕ
Программа для численного решения задачи на ПК в среде MATLAB.
% YAV
% Решение краевой задачи с применением ЯВНОЙ разностной схемы.
t=input('Введите шаг по оси времени:');
while ((t<0.012) | (t>0.5))
t=input('Введите шаг по оси времени [0.012;0.5]:');,end;
h=input('Введите шаг по оси стержня:');
while ((h<0.012) | (h>0.5))
h=input('Введите шаг по оси стержня [0.012;0.5]:');,end;
M=floor(1/h);,N=floor(1/t);,h=1/M;,t=1/N;
if t>h,clc,for i=1:10,disp(' ');,end;
disp(' ВОЗМОЖНА НЕУСТОЙЧИВОСТЬ!!!');
disp(' (не выполнено условие устойчивости Куранта-Леви:t<=h)!!!');
pause,end;,g=(t/h)^2;
U=zeros(M+1,N+1);
for j=0:N,U(M+1,j+1)=j*t;,end;
for i=1:(M-1),U(i+1,2)=t+5*t^2/(1+(i*h)^2);,end;
U(1,2)=(t+5*t^2+g*U(2,2))/(1+g*(1+h));
for j=1:(N-1)
for i=1:(M-1)
U(i+1,j+2)=2*(1-g)*U(i+1,j+1)+g*(U(i,j+1)+U(i+2,j+1))-U(i+1,j)+t^2*10/(1+(i*h)^2+(j*t)^2);
end;
f=2*U(1,j+1)-U(1,j)+t^2*10/(1+((j+1)*t)^2);
U(1,j+2)=(f+2*g*U(2,j+2))/(1+2*g*(1+h));
end;
mesh(U);,clc
% NEYAV
% Решение краевой задачи с применением НЕЯВНОЙ разностной схемы
%------------- определение числа разбиений по осям x, t ---------------
M=20; N=50;
%--- определение шагов сетки по оси x или t
h=1/M; t=1/N;
%-------------- определение рабочих констант ---------------------------
u=zeros(M+1,N+1);
h2=h^2; t2=t^2; g2=t2/h2;
%------------- заполнение матрицы U(x,t) 1-ым начальным условием ----
for i=0:M, u(i+1,1)=0; end
%-----------------------------------------------------------------------
A=zeros(M,1);C=zeros(M+1,1);B=A;A1=A;F=C;B1=C;
%------------ этап заполнения матрицы U(x,t) 2-ым начальным условием ----
%------------1) Определение прогоночных коэффициентов-------------------
for i=1:M-1, A(i)=g2/2; B(i+1)=g2/2; C(i+1)=1+g2;
F(i+1)=t+5*t2/(1+h2*i^2);
end;
%------------2) Определение граничных прогоночных коэффициентов---------
A(M)=0; B(1)=1; C(1)=1+h; C(M+1)=1;
F(1)=0; F(M+1)=t;
%------------ определение U(i,1) методом прогонки ---------------
A1(1)=B(1)/C(1); B1(1)=F(1)/C(1);
for i=2:M
A1(i)=B(i)/(C(i)-A(i-1)*A1(i-1));
B1(i)=(F(i)+A(i-1)*B1(i-1))/(C(i)-A(i-1)*A1(i-1));
end;
B1(M+1)=(F(M+1)+A(M)*B1(M))/(C(M+1)-A(M)*A1(M));
u(M+1,2)=B1(M+1);
for i=M:-1:1,
u(i,2)=A1(i)*u(i+1,2)+B1(i);
end;
%------------ этап заполнения матрицы U(x,t) ---------------------------
%------------1) Определение прогоночных коэффициентов-------------------
for i=1:M-1, A(i)=g2; B(i+1)=g2; C(i+1)=1+2*g2; end
%------------2) Определение граничных прогоночных коэффициентов---------
A(M)=0; B(1)=1; C(1)=1+h; C(M+1)=1;
%------------ определение U(i,j) методом прогонки ---------------
A1(1)=B(1)/C(1);
for i=2:M,
A1(i)=B(i)/(C(i)-A(i-1)*A1(i-1));
end;
for j=2:N,
F(1)=0;
for i=1:M-1,
F(i+1)=2*u(i+1,j)-u(i+1,j-1)+10*t2/(1+h2*i^2+t2*j^2);
end;
F(M+1)=j*t;
B1(1)=F(1)/C(1);
for i=2:M,
B1(i)=(F(i)+A(i-1)*B1(i-1))/(C(i)-A(i-1)*A1(i-1));
end;
B1(M+1)=(F(M+1)+A(M)*B1(M))/(C(M+1)-A(M)*A1(M));
u(M+1,j+1)=B1(M+1);
for i=M:-1:1,
u(i,j+1)=A1(i)*u(i+1,j+1)+B1(i);
end;
end;
contour(u,15);pause;
for j=0:N,
i=1:1:M;
u1=u(i,j+1);
plot(i,u1),pause;
end
mesh(u);pause;clc
Результаты решения.
Пример решения по явной схеме при h=0.05 =0.02: (рис. 1)
Максимальное значение решения: 3.8182.
Примеры неустойчивых решений по явной схеме, когда не выполняется условие устойчивости Куранта-Леви.
При небольшом различии шагов имеем слабые искажения (см. рис. 3 при h=0.047 =0.05 с максимальным значением 4.3836). При мелкой сетке даже небольшое несоответствие шагов условию устойчивости приводит к большим искажениям (см. рис. 4 при h=0.012 =0.0121 с максимальным значением 5203.6). При большом несоответствие шагов получаем сильные искажения: в отдельных точках имеют место сильные скачки, больше истинных значений на несколько порядков. В связи с этим на графиках всё остальное решение представляется плоскостью (см. рис. 5 при h=0.04 =0.05 с максимальным значением 8.0561).
(рис. 2)
(рис. 3)
(рис. 4)
Пример решения по явной схеме при h==0.05 с приведением таблицы значений: