Автор работы: Пользователь скрыл имя, 14 Октября 2013 в 13:17, курсовая работа
В данной курсовой работе описывается метод решения краевой задачи линейного дифференциального уравнения второго порядка с использованием конечно-разностных уравнений, а также метод прогонки, использующийся для решения «трехчленной системы» линейных алгебраических уравнений, полученной при применении конечно-разностных уравнений.
Аннотация……………………………………………………………………………………………….…3
1.Обзор литературы…………………………………...………………………………...………………...4
1.1 Общая постановка краевой задачи………………..……………………………...………………4
1.2 Метод конечных разностей……..……………………………………...………………………….6
1.3 Метод прогонки………………… …... ……………...…………………………………………...9
2. Разработка блок – схемы…………………………...…………………………………………………16
2.1 Алгоритм…………………………………………………………...……………………………..16
2.2 Блок – схема………………………………………………………..…………………………….17
3. Отладка программы……………………………..………………………………………………….....18
3.1 Код программы………………………………………………………...…………………………18
3.2 Решение контрольного примера……………………………………….……………………….. 20
3.3 Результат программы…………………………………………………….……………………….21
Список литературы………………………………………………………………………………………22
Отсюда согласно условиям (2), получим
Линейная система (10), (12) состоит из n+1 уравнений первой степени относительно неизвестных y0, у1 ,... , уп. Для решения этой системы воспользуемся методом прогонки. Разрешая уравнение (10) относительно yi ,будем иметь:
Предположим, что с помощью полной системы (10), (12) из уравнения (13) исключена неизвестная уi-1. Тогда это уравнение примет вид
где сi, di (i= 1,2,..., п - 1) — некоторые коэффициенты. Отсюда
yi-1= ci-1(di-1 — yi)
Подставляя это выражение в уравнение (10), получим
и, следовательно
Приравнивая левые части формулы (14) и (15) и сравнивая коэффициенты при yi+1 и свободные члены, получим для определения сi и di рекуррентные формулы:
Определим теперь с0 и d0. Из первого краевого условия (5) получаем
С другой стороны, из формулы (14) при i=0 имеем
Приравнивая левые части двух последних выражений и сравнивая коэффициенты при y1 и свободные члены, находим
На основании формул (16), (18) последовательно определяются коэффициенты ci , di (i = 1, 2 ,…,n-1) до cn-1 и dn-1 включительно (прямой ход).
Обратный ход начинается с определения уп. Используя второе краевое условие (12) и формулу (14) при i=n-1, получим систему двух уравнений
Решим ее относительно уп :
Теперь по формуле (14) последовательно находим yn-1 , yn-2, yn-3, …,y0.
Для контроля можно проверить выполнение первого краевого условия. Вычисления удобно расположить в виде таблицы 1.
Таблица
1
i |
0 |
1 |
2 |
… |
n-2 |
n-1 |
n |
ci |
c0 (18) |
c1 |
c2 |
… |
cn-2 |
cn-1 |
|
di |
d0 (18) |
d1 |
d2 |
… |
dn-2 |
dn-1 |
|
xi |
x0=a |
x1 |
x2 |
… |
xn-2 |
xn-1 |
xn=b |
yi |
y0 |
y1 |
y2 |
… |
yn-2 |
yn-1 |
yn (20) |
Замечание. Для простейших краевых условий у(а)=А, у(b) = В формулы для с0, d0, у0 и уn упрощаются. А именно, полагая α0 = 1, α1=0 и β0 = 1, β1 = 0, из формул (18) будем иметь: с0= 0, d0 = ∞, c0d0 = A.
Отсюда
Причем
Заметим, что метод прогонки обладает устойчивым вычислительным алгоритмом , т. е. ошибки округления не вызывают неограниченного возрастания погрешности решения.
Пример 1. Методом прогонки решить краевую задачу
Решение. Примем h = 0,1 и от уравнения (23) и краевых условий (24) перейдем к соответствующим конечно-разностным уравнениям
y0=0, y10=0.
где mi=-2-h2, ni=1, . Cогласно формулам (21) имеем
c1 = - 0,498, d1= - 0,001. Формулы (16) в нашем случае дают
Найденные значения сi и di (i = 1, 2, ... , 9) записываем в первых двух строках таблицы 62. Затем, используя формулу (14) и известное значение y10 = 0, вычисляем y9, y8, …, y1.
Для сравнения в последней строке таблицы 2 даны значения точного
решения
Таблица 2 Решение краевой задачи (23) — (24) методом прогонки
i |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
ci |
0 |
-0,498 |
-0,662 |
-0,878 |
-0,890 |
-0,900 |
-0,908 |
-0,915 |
-0,921 |
-0,926 |
|
di |
0,001 |
0,002 |
0,004 |
0,008 |
0,012 |
0,016 |
0,022 |
0,028 |
0,035 |
||
yi |
0 |
-0,025 |
-0,049 |
-0,072 |
-0,078 |
-0,081 |
-0,078 |
-0,070 |
-0,055 |
-0,032 |
0 |
0 |
-0,015 |
-0,029 |
-0,041 |
-0,050 |
-0,057 |
-0,058 |
-0,054 |
-0,044 |
-0,026 |
0 |
При требовании повышенной точности приходится применять более громоздкие приемы или вводить соответствующие поправки. В частности, этот метод дает более точные результаты, если при переходе от краевых условий (2) к конечно-разностным соотношениям воспользоваться трехчленными формулами для производных в точках х = а и х =b
Тогда из краевых условий (2) будем иметь
(27)
Для вычисления с0 и d0 берем первое краевое условие (27) и уравнение
взятое из системы (3) при i=1.
Исключая у2 из этих двух уравнений, находим
где . С другой стороны, из формулы (14) при i = 0 имеем
y0=c0(d0-y1).
Сравнивая последнее равенство с (28), получаем
По известным значениям с0 и d0 последовательно определяются коэффициенты ci , di (i = 0, 1, …, п—1) до сп-1 и dn-1 включительно (см. формулы (16)).
Обратный ход начинается с определения уп.
Используя второе краевое условие (27) и формулы (14), взятые при
i=n - 2 и i=n-1, получим систему трех уравнений
Решая эту систему относительно уп, будем иметь
Теперь по формулам (14) последовательно находим yn-1, yп-2,…,y0
Вычисления и в этом случае располагаем в виде таблицы 1. [1]
2.1Алгоритм
1)Вывод на экран исходных данных и вычисление шага;
2)Получение системы при помощи конечно-разностных уравнений и вывод этой системы на экран;
3)Осуществление метода прогонки;
4)Вывод конечного решения системы на экран;
2.2Блок – схема
Рис 6. Блок-схема программы
3.1Код программы
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
const n=9; // количество отрезков разбиения (отсчет начинается с нуля)
const a=0.7; // начало отрезка
const b=1; // конец отрезка
const k0=1; // α0 формула (2)
const k1=0; //α1 формула (2)
const k2=0.5; // А формула (2)
const q0=2; // β0 формула (2)
const q1=3; // β1 формула (2)
const q2=1.2; // B формула (2)
var h:real;
var c:array[0..n] of real;
var d:array[0..n] of real;
var x:array[0..n] of real;
var y:array[0..n] of real;
var m:array[0..n] of real;
var l:array[0..n] of real;
var fi:array[0..n] of real;
var i:integer;
function p(x:real):real;
begin
p:=1/x; // p(x) формула (1)
end;
function q(x:real):real;
begin
q:=2; // q(x) формула (1)
end;
function f(x:real):real;
begin
f:=x; // f(x) формула (1)
end;
begin
h:=(b-a)/n; // вычисление шага
writeln('Differencial`noie uravnenie imeet vid: y"+p(x)*y`+q(x)*y=f(x)'); // вывод начальных условий на экран
writeln('p(x) = 1/x , q(x)=2, f(x)=x');
writeln;
writeln('',k0,'*y(',a:2:1,') + ',k1,'*y`(',a:2:1,') = ',k2:1:1);
writeln('',q0,'*y(',b,') + ',q1,'*y`(',b,') = ',q2:1:1);
writeln;
writeln('*********************
// Получение системы конечно-
for i:=0 to n do
begin
x[i]:=a+i*h; // разбиение [a;b] на отрезки длиной h
fi[i]:=f(x[i])/(1+p(x[i])*h/2)
l[i]:=(1-p(x[i])*h/2)/(1+p(x[
m[i]:=(-1)*(2-q(x[i])*h*h)/(1+
end;
writeln('Sistema imeet vid:');
for i:=1 to (n-1) do writeln('y[',i+1,'] + (',m[i]:2:4,')*y[',i,'] + ',l[i]:2:4,'*y[',i-1,'] = ',fi[i]*h*h:2:4);
writeln('',k0,'*y[0] + ',(k1/h):2:2,'*(y[1]-y[0]) = ',k2:1:1);
writeln('',q0,'*y[0] + (',(q1/-h):2:2,')*(y[',n-1,'] - y[',n,']) = ',q2:1:1);
writeln;
// прямой ход
if ((k0*h-k1)<>0) then c[0]:=k1/(k0*h-k1)
else c[0]:=0;
if (k1<>0) then d[0]:= k2*h/k1
else d[0]:=0;
for i:=1 to (n-1) do
begin
c[i]:=1/(m[i]- l[i]*c[i-1]);
d[i]:=fi[i]*h*h - l[i]*c[i-1]*d[i-1];
if (k1=0) then d[1]:=fi[1]*h*h - l[1]*k2/k0;