Постановка задачи
Задание: получить приблизительное решение данной краевой задачи уравнения в частных производных математической физики методом сеток.
(1)
0< x,y<1 (2).
Данное уравнение является уравнением гиперболического типа и физически отражает процесс колебания струны. Искомое решение U=U(x,y) - вертикальное отклонение струны в точке х в момент времени y.
Данная краевая задача состоит в нахождении функции U=U(x,y), удовлетворяющей уравнению (1), а также заданным начальным и граничным условиям (2).
Граничное условие первого рода U=U(1,y) определяет закон движения правого конца струны. Для левого конца в качестве граничного условия задано так называемое условие «упругого конца» (граничное условие третьего рода):
Ux (0,y)=U(0,y) .
Начальные условия U(x,0)=0 и Uy(x,0)=1 задают начальную форму струны и распределение скоростей в начальный момент времени.
Функция f(x,y) имеет смысл плотности внешней силы, рассчитанной на единицу длины.
РЕШЕНИЕ ЗАДАЧИ С ПОМОЩЬЮ НЕЯВНОЙ РАЗНОСТНОЙ СХЕМЫ
Рассмотрим снова нашу краевую задачу . Для аппроксимации уравнения используем Т-образный пятиточечный шаблон . Уравнение аппроксимируется следующими уравнениями :
1. Аппроксимация дифференциального уравнения
Обозначим g=/h и запишем (1) к виду удобному для применения метода прогонки:
2. Аппроксимация 1-го начального условия
(3)
3. Аппроксимация 2-го начального условия
Для более точного аппроксимирования 2-го начального условия разложим u(x,y )
в окрестности точки (x,0) по формуле Тейлора и используя 1-ое и 2-ое начальное условия перейдем к конечным разностям:
Запишем (4) к виду удобному для применения метода прогонки:
4. Аппроксимация 2-го граничного условия
5. Аппроксимация 1-го граничного условия
в узле(0,1):
(5) при i=0 будет:
исключая фиктивный узел, получим:
(7)
при j2, в узле (0,j):
(2):,тогда:
(8)
6. Вычисления прогоночных коэффициентов
Сначала найдем u(i,j) на слое j=1. Определим прогоночные коэффициенты.
Обозначим , тогда, используя (7),(5) и (6) получим систему:
получим прогоночные коэффициенты:
Теперь вычислим граничные прогоночные коэффициенты:
Методом прогонки находим u(i,1) где i=1...m ;
Теперь зная значения j=0,1 находим u(i,j ) где j=2...n.
Теперь вычислим граничные прогоночные коэффициенты:
Методом прогонки находим u(i,j) где i=1...m ,j=2..n ;
Текст программы в среде Matlab приведен в приложении (стр. 4).
ПРИЛОЖЕНИЕ
Программа для численного решения задачи на ПК в среде MATLAB.
% NEYAV
% Решение краевой задачи с применением НЕЯВНОЙ разностной схемы
%------------- ОПРЕДЕЛЕНИЕ ЧИСЛА РАЗБИЕНИЙ ПО ОСЯМ x,y---------------
M=10; N=10;
%---ОПРЕДЕЛЕНИЕ ШАГОВ СЕТКИ:a=b/c,ГДЕ b-ПРЕДЕЛ ВЫЧИСЛЕНИЙ ПО ОСИ x ИЛИ y
h=1/M; t=1/N;
%--------------ОПРЕДЕЛЕНИЕ РАБОЧИХ КОНСТАНТ ---------------------------
u=zeros(M+1,N+1);
h2=h^2; t2=t^2; g2=t2/h2;
%------------- ЗАПОЛНЕНИЕ МАТРИЦЫ U(x,y) 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,y) 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)=g2; C(1)=1+h*g2+g2; C(M+1)=1;
F(1)=t+5*t2; F(M+1)=t;
%------------ ОПРЕДЕЛЕНИЕ U(i,2) МЕТОДОМ ПРОГОНКИ---------------
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,y) ---------------------------
%------------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)=2*g2; C(1)=1+2*h*g2+2*g2; F(1)=t2*(t+5*t2);
C(M+1)=1;
%------------ ОПРЕДЕЛЕНИЕ U(i,j) МЕТОДОМ ПРОГОНКИ---------------
A1(1)=B(1)/C(1); B1(1)=F(1)/C(1);
for j=2:N+1,
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;
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;
F(M+1)=j*t;
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+1;
u1=u(i,j+1)
plot(i,u1),pause;
hold on
end;hold off
mesh(u);
Результаты программы при шаге 0.1:
Значения U(x,y)
Столбцы с 0-го по 5-ый: