Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методички.C++ / Конспект Лекций - Части 1,2.pdf
Скачиваний:
157
Добавлен:
24.02.2016
Размер:
1.97 Mб
Скачать

 

 

 

Начало

 

 

 

 

 

 

 

 

 

 

1

 

 

 

А

B

C

 

 

 

 

n, A, br

 

 

 

I цикл

2

 

k = 1, n-1

 

 

IV цикл

14

m = k+1, n

 

 

 

 

 

 

 

 

 

 

 

 

3

p = k

максимальногоПоиск ведущегоэлемента

 

15

c = amk /akk

 

II цикл

4

 

6

p = m

 

16 bm = bm - c bk

 

m = k+1, n

 

 

 

нет

5

|apk|<|amk|

 

 

V цикл

17

i = k, n

 

 

 

 

 

 

 

 

 

 

 

 

18ami = ami - c aki

 

 

 

 

да

 

 

 

III цикл

7

 

 

 

 

 

 

19 xn = bn / ann

 

 

 

j = k, n

 

 

VI цикл

20 k = n-1,1,(-1)

 

 

 

8

 

 

 

 

 

r = akj

Перестановка

 

 

 

21 s = 0

 

 

 

 

10 apj = r

 

 

 

 

 

 

 

9 akj = apj

 

 

VII цикл

22

i = k+1, n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

23 s = s + aki xi

 

 

 

11

r = bk

Перестановка

членовсвободных

 

24 xk = (bk - s)/akk

 

 

 

12 bk = bp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

13 bp = r

 

 

 

25

Решение xr

 

 

А

 

B

C

 

 

 

Конец

 

 

 

 

 

 

 

 

 

 

Рис. 8. Блок-схема модифицированного метода Гаусса

13.3. Метод прогонки

Приведение матрицы к верхнему треугольному виду

Обратный ход метода Гаусса

Данный метод является модификацией метода Гаусса для частного случая разреженных систем − систем с матрицей трехдиагонального типа (краевая задача ДУ). Каноническая форма их записи

181

 

 

; a1 = cn = 0,

(13.9)

aixi−1 + bixi + cixi+1 = di; i=1,n

или в развернутом виде

b1x1 + c1x2

a2x1 + b2x2 + c2x3

a3x2 + b3x3 + c3x4

=d1;

=d2;

=d3;

. . .

(13.10)

an−1xn−2 + bn−1xn−1 + cn−1xn= dn−1;

 

anxn−1 + bnxn

= dn .

При этом, как правило, все коэффициенты bi 0.

Метод реализуется в два этапа − прямой и обратный ходы.

Прямой ход. Каждое неизвестное xi выражается через xi+1

 

xi = Ai xi+1 + Bi для i = 1,2, ..., n−1,

(13.11)

посредством прогоночных коэффициентов Ai и Bi. Определим алгоритм их вычисления.

Из первого уравнения системы (13.10) находим x1

x1 =− c1 x2 + d1 . b1 b1

Из уравнения (13.11) при i=1:

A1 =− c1 ; b1

x1 = A1 x2

+ B1 . Следовательно

B =

d1

.

(13.12)

 

1

b

 

 

1

 

 

Из второго уравнения системы (10) определяем x2 через x3, подставляя найденное значение x1

а2 ( A1 x2 + B1) + b2 x2 + c2 x3 = d2 ,

 

откуда

 

c2 x3 +d2 a2 B1

 

 

x2

=

;

(13.13)

 

 

 

a2 A1 +b2

 

и согласно (13.11) при i=2:

A2 =− c2 ; e2

x2 = A2 x3 + B2 , следовательно

B =

d2 a2 B1

, где е2 = а2 А1 + b2 .

 

2

e2

 

 

 

Ориентируясь на соотношения индексов при коэффициентах (13.12) и

(13.13)

можно получить эти соотношения для общего случая

A =−

ci

;

B

=

di ai Bi1

, где еi = аi Аi−1 + bi (i=2,3, ..., n−1) . (13.14)

 

 

i

 

ei

i

 

ei

 

 

 

 

Обратный ход. Из последнего уравнения системы (13.10) с использованием

(13.11)

при i=n−1

 

 

 

 

dn an Bn1

 

 

 

 

 

 

 

 

xn =

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

bn + an An1

182

Далее посредством (13.11) и прогоночных коэффициентов (13.12), (13.13) последовательно вычисляем xn−1, xn−2, ..., x1.

При реализации метода прогонки нужно учитывать, что при условии

| bi | | ai | + | ci | ,

(13.15)

или хотя бы для одного bi имеет место строгое неравенство (13.15), деление на «0» исключается и система имеет единственное решение.

Заметим, что условие (13.15) является достаточным, но не необходимым. Схема алгоритма метода прогонки может иметь вид, представленный на

рис. 9.

Начало

A

n,ar,br,cr,dr

xn = (dn - an Bn-1)/

 

(bn + an An-1)

A1 = -c1/b1

i = n-1, 1,(-1)

 

 

 

B1 = d1/b1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

xi = Ai xi+1 +Bi

 

 

 

 

 

 

 

 

 

 

 

 

i = 2,

n-1, 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

z = bi + ai Ai-1

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

Решение x

 

 

 

 

 

 

 

 

 

 

Ai = -ci/z

 

 

 

 

Конец

 

 

 

 

 

 

 

 

 

 

 

 

Bi = (di - ai Bi-1)/z

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A

Рис. 9. Блок-схема метода прогонки

13.4. Метод квадратного корня

Данный метод используется для решения линейной системы

A x =

 

,

(13.16)

b

у которой матрица А симметрическая, т.е. АТ = А,

aij = aji (i=j=1,...,n).

Решение системы (13.16) осуществляется в два этапа.

Прямой ход. Преобразование матрицы А и представление ее в виде произ-

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

 

А = S Т S,

(13.17)

где

 

183

 

s11 s12 Ls1n

 

S =

0

s22 Ls2n

;

 

 

L

 

 

0

0 Lsnn

 

Перемножая SТ и S, и приравнивая лы для определения sij :

s

=

a

, s

=a

11

 

11

1 j

1 j

 

 

 

i1

 

sii

=

aii ski2 ,

 

 

 

k=1

 

 

 

i1

 

 

 

 

 

 

 

aij ski skj

sij

=

 

k=1

,

 

sii

 

 

 

 

 

=0,

 

 

sij

 

 

 

s11

0

L 0

 

ST =

s21

s22

L 0

.

 

 

L

 

 

 

sn1

sn2

Lsnn

 

матрице А, получим следующие форму-

/ s11 , ( j >1); (1i n);

(13.18)

(i < j); (i > j).

После нахождения матрицы S системы (13.16) заменяем двумя ей эквивалентными системами с треугольными матрицами (13.17)

ST y =

 

,

S x = y .

b

Обратный ход. Записываем системы (13.19) в развернутом виде:

s

y

=b

 

;

 

 

 

 

 

 

 

 

 

11

1

1

 

 

 

 

 

 

 

 

 

 

s

y

+s

22

y

2

=b ;

 

 

 

 

12

1

 

 

 

2

 

 

 

 

 

 

 

 

L

 

 

 

 

 

 

 

 

 

+s2n y2 +...+snn yn =bn ;

s1n y1

s

x

+s

 

 

x

2

+...+s

x

n

= y ;

 

11

1

12

 

 

 

1n

 

1

 

 

 

s22 x2 +L+ s2n xn = y2 ;

 

 

 

 

 

 

 

 

 

 

 

L

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

snn xn = yn .

 

 

 

 

 

 

 

 

 

 

 

Используя (13.20) и (13.21) последовательно находим

 

 

b1

 

 

i1

 

y1

=

,

 

yi =(bi ski yk ) / sii ;

(i >1);

 

 

 

 

s11

k=1

 

 

 

 

yn

 

n

 

 

xn =

,

xi =( yi sik xk ) / sii ;

(i < n).

 

 

 

 

 

snn

k=i+1

 

(13.19)

(13.20)

(13.21)

(13.22)

Метод квадратных корней дает большой выигрыш во времени по сравнению с рассмотренными ранее прямыми методами, так как, во-первых, существенно уменьшает число операций умножения и деления, во-вторых, позволяет накапливать сумму произведений без записи промежуточных результатов.

184

Машинная реализация метода предусматривает его следующую трактовку. Исходная матрица А системы (13.16) представляется в виде произведения трех матриц

A = S Т D S ,

где D − диагональная матрица с элементами dii = ±1; S − верхняя треугольная (sik = 0, если i > k , причем sii > 0); S T − транспонированная нижняя треугольная.

Требование выполнения условия sii > 0 необходимо для полной определенности разложения, определяющее введение диагональной матрицы D с элемента-

ми di = ±1.

Матрицу S можно по аналогии с числами трактовать как корень квадратный из матрицы А, отсюда и название метода.

Итак, если S и D известны, то решение исходной системы A xr=ST D S xr=b сводится к последовательному решению трех систем − двух треугольных и одной диагональной:

r

r

r

ST zr=b;

D yr=zr;

S xr= yr.

(13.23)

=S x .

 

 

 

 

Здесь z

=D S x;

y

 

 

 

 

Нахождение элементов матрицы S (извлечение корня из А) осуществляется

по рекуррентным формулам:

 

 

 

 

 

 

dk

 

k1

 

 

 

 

 

= sign akk di sik2 ;

 

 

 

 

 

 

i=1

 

 

 

 

 

 

 

k1

 

 

 

 

 

skk =

akk di sik2 ;

 

(13.24)

 

 

 

 

 

i=1

 

 

 

 

 

skj

 

k1

 

 

 

 

 

= akj di sik sij / (skk dk ) ;

 

 

 

 

 

 

i=1

 

 

k = 1, 2, ..., n;

j = k+1, k+2, ..., n.

 

В этих формулах сначала полагаем k = 1 и последовательно вычисляем

 

d1 = sign (a11);

s11 = |a11 |

и все элементы первой строки матрицы S (s1j, j>1), затем полагаем k = 2, вычисля-

ем s22 и вторую строку матрицы s1j для j>2 и т.д.

Решение систем (13.23) ввиду треугольности матрицы S осуществляется по формулам, аналогичным обратному ходу метода Гаусса:

 

 

b1

 

 

i1

y1 =

 

 

,

yi =(bi dk ski yk ) / (sii di ( ); i =2,3,...,n;

s11d1

 

 

,

k=1

xn = yn

xi =( yi sik xk ) / sii ; i = n 1,n 2,...,1.

 

 

 

 

 

 

n

 

 

snn

 

 

 

k=i+1

Метод квадратного корня почти вдвое эффективнее метода Гаусса, т.к. полезно использует симметричность матрицы.

Схема алгоритма метода квадратного корня представлена на рис. 10 [4].

185

Проиллюстрируем метод квадратного корня, решая систему трех уравне-

ний:

x1 +x2 +x3 = 3;

1 1 1

 

br

3

x1 +2x2 +2x3 = 5;

A = 1

2

2

,

= 5 .

x +2x

 

+3x

 

= 6;

 

2

 

 

 

 

 

2

3

1

3

 

 

6

1

 

 

 

 

 

 

 

 

 

Нетрудно проверить, что матрица А есть произведение двух треугольных матриц (здесь dii = 1):

 

 

 

 

 

 

 

1 1 1 1 0 0 1 1 1

 

 

 

 

 

 

A = 1 2 2

= 1 1 0

 

× 0 1 1

=

ST S .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 2 3 1 1 1 0 0 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Исходную систему запишем в виде

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 0 0

 

1 1 1

 

x

 

 

 

3

 

 

 

S

T

 

 

r

=

 

 

 

×

 

 

 

 

 

 

 

×

 

1

 

=

 

 

 

 

 

 

S x

1 1 0

0 1 1

 

x2

5 .

 

 

 

 

 

 

 

 

 

 

 

 

1 1 1

 

0 0 1

 

x

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

Обозначим

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 1 1

 

x

 

 

 

y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

=

 

0 1 1

 

×

 

1

 

=

 

1

 

.

 

 

 

 

 

 

 

 

 

 

 

 

S x

 

 

 

x

2

 

 

y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0 1

 

x

3

 

 

y

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Тогда для вектора yr получим систему ST yr = b :

 

 

 

 

 

 

 

1 0 0

 

 

y

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

0

 

×

 

1

 

=

 

 

,

откуда

 

 

 

y1 = 3;

 

y2 = 2;

y3 = 1.

1

 

y2

 

5

 

 

 

 

1 1 1

 

 

 

y

3

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Зная yr, решаем систему S x = y :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 1 1

 

 

x1

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

1

1

 

×

x

2

 

=

2

,

откуда

 

 

 

х1 = 1;

 

х2 = 1;

х1 = 1.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0 1

 

 

x

3

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

186

 

Начало

 

 

1

 

 

 

 

 

n, A, br

 

2

k = 1, n

 

 

 

3

 

 

= akk

 

 

 

 

 

 

 

4

 

k 1

 

нет

 

 

 

 

 

 

 

5

 

 

да

 

i = 1, k-1

 

 

 

6

 

=

- di

s2ik

7 dk

= sign(

)

 

8

s

 

= |

|

 

 

ik

 

 

 

9

j = k+1, n

 

 

 

10

 

= akj

 

 

 

 

 

 

 

11

 

k 1

 

нет

 

 

 

 

 

 

 

12

 

 

да

 

i = 1, k-1

 

 

 

13

=

- di

sik

sij

 

14

=

 

/ (skk dk)

skj

 

 

 

A

 

15 y1 = b1 / ( s11 b1)

16

i = 2, n

 

 

17

= bi

 

 

 

 

18

k = 1, i-1

 

 

 

19

=

- dk yk

ski

20 yi = / (skk dk)

21 xn = yn / snn

22 i = n-1,1,(-1)

 

 

23

= yi

 

 

 

 

24

k = i+1, n

 

25

= - xk sik

 

 

 

 

 

 

 

 

26

 

 

 

 

 

x =

/ s

 

 

 

 

 

 

 

 

i

ii

 

 

 

 

 

 

 

27 Решение xr

Конец

A

Рис. 10. Блок-схема метода квадратного корня

187

Соседние файлы в папке методички.C++