Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
42
Добавлен:
02.05.2014
Размер:
141.31 Кб
Скачать

Министерство образования Российской Федерации

Уфимский Государственный Авиационный Технический Университет

Лабораторная работа 4

РЕШЕНИЕ КРАЕВОЙ ЗАДАЧИ ДЛЯ ЛИНЕЙНОГО ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ ВТОРОГО ПОРЯДКА МЕТОДОМ ПРОГОНКИ

Выполнила студентка

группы ВМ-226 т:

Курамшина А.Р.

Проверил

преподаватель:

Шерыхалина Н.М.

Уфа 2006

1 Краткая теория:

Пусть на отрезке [a,b] требуется найти решение дифференциального уравнения

, (1)

удовлетворяющее следующим краевым условиям:

, , (2)

Численное решение задачи состоит в нахождении приближённых значений y0, y1, …, yn искомого решения y(x) в точках x0, x1, …, xn. Точки x0, x1, …, xn называются узлами сетки. Используем равномерную сетку, образованную системой равноотстоящих узлов i=0, 1, 2, …, n. При этом x0=a, xn=b, h=(b-a)/n. Величина h – шаг сетки. Пусть p(xi)=pi, q(xi)=qi, f(xi)=fi, y(xi)=yi, y(xi)=yi, y(xi)=yi. Аппроксимируем y(xi) и y(xi) в каждом внутреннем узле центральными разностными производными

и на концах отрезка – односторонними производными

Используя эти формулы, получаем разностную аппроксимацию исходной задачи (1) – (2):

(3)

Чтобы найти приближённые значения y0, y1, …, yn искомого решения, необходимо решить систему n+1 линейных уравнений (2) с n+1 неизвестными. Эту систему можно решить одним из стандартных методов решения линейных систем. Однако матрица системы (3) трёхдиагональная, поэтому для её решения применим специальный метод, называемый методом прогонки.

Перепишем систему (3) следующим образом:

(4)

где b0=c1hc2, g0=c2, j0=hc, ji=fih2, ai=1–(1/2)pih, bi=qih2–2, i=1+(1/2)pih, i=1, 2, …, n–1, an=–d2, bn=hd1+d2, jn=hd.

Будем искать решение системы (4) в виде

. (5)

тогда для ui и vi получаем следующие рекуррентные формулы:

.

Чтобы сделать схему счёта однородной, положим a0=0, gn=0. Прямой ход прогонки состоит в последовательном вычислении коэффициентов ui и vi, исходя из значений

v0=–g0/b0, u0=j0/b0.

При обратном ходе прогонки по формуле (5) последовательно определяются величины yn, yn-1, …, y0. Так как gn=0, то vn=0 и yn=un, т.е. в прямом ходе прогонки вычисляются величины vn, un и приближённое значение решения yn на правом конце отрезка. Остальные величины yn-1, yn-2, …, y0 вычисляются в обратном ходе прогонки по рекуррентной формуле (5). Таким образом, метод прогонки позволяет найти точное решение системы (3).

Погрешность решения краевой задачи (1)–(2) определяется только погрешностью разностной аппроксимации O(hk) исходной задачи системой (3). Порядок аппроксимации k равен 2, если с2=d2=0, или 1 в противном случае. Так как h=(b-a)/n, то выбирая n достаточно большим, можно добиться уменьшения погрешности ценой увеличения объёма вычислений при решении системы (3).

При практической оценке погрешности найденного решения обычно используют правило Рунге. Если y(xi) – точное значение решения в узле xi, а yi и – приближённые значения решения в том же узле, полученные соответственно с шагом h и h/2, то оценка погрешности решения yi определяется формулой

, .

Задание:

На отрезке [a,b] решить методом прогонки линейную краевую задачу

Здесь

p(x)

Q(x)

a

b

c

d

a1

a2

b

0

0,8

-0,5

0,5

2

0

6


Листинг программы:

#include <iostream.h>

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#include <windows.h>

#include <iomanip.h>

void main()

{

int n,i,k;

float h,c1,c2,c,d1,d2,d,fx,a,b,k1,k2,m,H,runge;

float p[9999],q[9999],betta[9999],gamma[9999],fi[9999],alfa[9999];

float y[9999],u[9999],v[9999],x[9999],Y[9999];

c1=d1=1.0;

c2=d2=1.0;

fx=0.0;

cout<<"Vvedite kraia otrezka [a,b] i 4islo uzlov n"<<endl;

cout<<endl<<"a=";

cin>>a;

cout<<endl<<"b=";

cin>>b;

cout<<endl<<"n=";

cin>>n; cout<<endl<<"A tak ge parametri c,d,k1,k2,m"<<endl;

cin>>c>>d>>k1>>k2>>m;

x[0]=a;

h=(b-a)/n;

betta[0]=c1*h-c2;

gamma[0]=c2;

fi[0]=h*c;

alfa[0]=0;

for(i=1;i<n;i++)

{

x[i]=x[i-1]+h;

p[i]=(k1+k2*x[i])/(x[i]*x[i]-1);

q[i]=m/sqrt(1-x[i]*x[i]);

fi[i]=fx*h*h;

alfa[i]=1-(1/2)*p[i];

betta[i]=q[i]*h*h-2;

gamma[i]=1+(1/2)*p[i]*h;

}

alfa[n]=-d2;

betta[n]=h*d1+d2;

fi[n]=h*d;

v[0]=gamma[0]/betta[0];

u[0]=fi[0]/betta[0];

for(i=1;i<n;i++)

{

v[i]=-gamma[i]/(betta[i]+alfa[i]*v[i-1]);

u[i]=(fi[i]-alfa[i]*u[i-1])/(betta[i]+alfa[i]*v[i-1]);

}

y[n]=u[n];

for(i=n-1;i>0;i--)

y[i]=u[i]+v[i]*y[i+1];

cout<<" i"<<" x "<<" y"<<endl;

for(i=0;i<n;i++)

{

cout.width(4);

cout<<i;

cout.width(5);

cout<<x[i];

cout.width(14);

cout<<y[i]<<endl;

}

H=(b-a)/(2*n);

betta[0]=c1*H-c2;

gamma[0]=c2;

fi[0]=H*c;

alfa[0]=0;

k=2*n;

for(i=1;i<k;i++)

{

x[i]=x[i-1]+H;

p[i]=(k1+k2*x[i])/(x[i]*x[i]-1);

q[i]=m/sqrt(1-x[i]*x[i]);

fi[i]=fx*H*H;

alfa[i]=1-(1/2)*p[i];

betta[i]=q[i]*H*H-2;

gamma[i]=1+(1/2)*p[i]*H;

}

alfa[k]=-d2;

betta[k]=H*d1+d2;

fi[k]=H*d;

v[0]=gamma[0]/betta[0];

u[0]=fi[0]/betta[0];

for(i=1;i<k;i++)

{

v[i]=-gamma[i]/(betta[i]+alfa[i]*v[i-1]);

u[i]=(fi[i]-alfa[i]*u[i-1])/(betta[i]+alfa[i]*v[i-1]);

}

Y[k]=u[k];

for(i=2*n-1;i>0;i--)

Y[i]=u[i]+v[i]*Y[i+1];

cout<<" i"<<" x "<<" Y"<<endl;

for(i=0;i<k;i++)

{

cout.width(4);

cout<<i;

cout.width(5);

cout<<x[i];

cout.width(14);

cout<<Y[i]<<endl;

}

cout<<"pogre6nost' po pravily runge:"<<endl;

for(i=0;i<n;i++)

{

runge=(Y[2*i]-y[i]);

cout<<runge<<endl;

}

system("PAUSE");

}

результаты выполнения программы:

Vvedite kraia otrezka [a,b] i 4islo uzlov n

a=0

b=0.8

n=10

A tak ge parametri c,d,k1,k2,m

-0.5

0.5

2

0

6

i x y

0 0 -1.07374e+008

1 0.08 -1.17093e+007

2 0.16 -3.56949e+007

3 0.24 -5.8292e+007

4 0.32 -7.85832e+007

5 0.4 -9.56894e+007

6 0.48 -1.08786e+008

7 0.56 -1.17122e+008

8 0.64 -1.20028e+008

9 0.72 -1.16936e+008

i x Y

0 0 -1.07374e+008

1 0.04 -6.11385e+006

2 0.08 -1.85376e+007

3 0.12 -3.07827e+007

4 0.16 -4.27302e+007

5 0.2 -5.42622e+007

6 0.24 -6.52625e+007

7 0.28 -7.56174e+007

8 0.32 -8.52161e+007

9 0.36 -9.39513e+007

10 0.4 -1.0172e+008

11 0.44 -1.08423e+008

12 0.48 -1.13967e+008

13 0.52 -1.18264e+008

14 0.56 -1.21231e+008

15 0.6 -1.22794e+008

16 0.64 -1.22884e+008

17 0.68 -1.21438e+008

18 0.72 -1.18402e+008

19 0.76 -1.13728e+008

pogre6nost' po pravily runge:

0

-6.82829e+006

-7.03533e+006

-6.97049e+006

-6.63286e+006

-6.03042e+006

-5.18041e+006

-4.10966e+006

-2.85524e+006

-1.46519e+006

Для продолжения нажмите любую клавишу . . .

Соседние файлы в папке Лабораторные работы1