Лабараторная работа 6. Численное решение краевой задачи для обыкновенных дифференциальных уравнений
Цель работы: изучение разностных методов решения краевой задачи для обыкновенных дифференциальных уравнений, практическое решение уравнений на ЭВМ.
Описание метода конечных разностей для решения дифференциального уравнения с указанными краевыми условиями.
Рассмотрим линейное дифференциальное уравнение с двухточечными краевыми условиями.
где p(x), q(x), f(x) - непрерывны на отрезке [a,b]. Один из самых простых способов решения задачи является сведение ее к системе конечно-разностных уравнений. Для этого необходимо разбить отрезок [a,b] на n равных частей длины h, где h=(b-a)/n. Точками разбиения абсциссы будут xi=x0+ih, где x0=a, xn=b.
Значение функции y(x) в точках xi и ее производных обозначим соответственно y(xi)=yi, y'(xi)=y'i, y''(xi)=y''i.
Введем следующие обозначения: pi=p(xi), qi=q(xi), fi=f(xi).
Заменим производные центрально-разностными отношениями. Для внутренних точек отрезка [a,b], будем иметь:
y'i= (yi+1-yi-1)/2h;
y"i=(yi+1-2yi+yi-1)/h2 ; i=1,2,..n-1.
Можно представить краевую задачу в виде:
(yi+1-2yi+yi-1) / h2 +pi((yi+1-yi) / 2h)+qiyi=fi, где i=1,...,n-1;
α1y0+ α2 ((y1-y0) / h) = A;
β1yn+ β2 ((yn-yn-1) / h) = B.
Таким образом, получили систему n+1 линейных уравнений с n+1 неизвестными y0, y1,...,yn, решение которой позволяют найти значение искомой функции y(x) в точках x0, x1...,xn.
Система является трех диагональной и для ее решения используется метод прогонки. В ходе прямого хода определяем прогоночные коэффициенты αk и βk. В ходе обратного хода определяем все неизвестные последовательно, начиная с yn.
Блок-схема алгоритма программы решения краевой задачи методом прогонки.
При запуске программы требуется ввод дифференциального уравнения, краевых условий, интервала.
Алгоритм вычисления значений функции заключается в следующем:
- Находим значения прогоночных коэффициентов:
a[1]:=- StrToFloat(StringGrid2.Cells[1,0])/StrToFloat(StringGrid2.Cells[0,0]));
b[1] := StrToFloat(StringGrid2.Cells[6,0])/StrToFloat(StringGrid2.Cells[0,0]);
a[i] := - (StrToFloat(StringGrid2.Cells[i,i-1])/(StrToFloat(StringGrid2.Cells[i-1,i-1])+StrToFloat(StringGrid2.Cells[i-2,i-1])*a[i-1]));
b[i] := (StrToFloat(StringGrid2.Cells[6,i-1])-StrToFloat(StringGrid2.Cells[i-2,i-1])*b[i-1])/(StrToFloat(StringGrid2.Cells[i-1,i-1])+StrToFloat(StringGrid2.Cells[i-2,i-1])*a[i-1]);
- Определяем значения неизвестных y[i]:
y[n] := a[n]*y[n+1] + b[n];
Вариант 10.
Дано:
QUOTE – дифференциальное уравнение
QUOTE ; QUOTE – краевые условия
[0;0.5] – интервал
Ответ: y(0) = 1; y(0.1) = -1.447; y(0.2) = 0.075; y(0.3) = 1.471; y(0.4) = 1.326; y(0.5) = 1.279.