Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Prozorov_Vych_math_SLAU

.pdf
Скачиваний:
26
Добавлен:
13.02.2015
Размер:
497.57 Кб
Скачать

21

Еще один пример нормы

k a k1= ja1j + ja2j + ja3j:

(1.2.3)

Все эти нормы встроены в язык Octave: команда norm(a; p). Норма позволяет ввести расстояние между векторами, то есть сравнивать векторы. Рас-

стояние между двумя векторами (метрика) вводится так:

 

½(a; b) =k a ¡ b k :

(1.2.4)

§ 1.3. Обусловленность СЛАУ

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

точно, а вектор правых частей задан с погрешностью

 

 

 

 

b

 

 

b

 

b:

 

 

 

 

 

 

 

 

e =

 

+ ¢

 

 

 

 

 

 

 

Погрешность правой части сказывается на решении

 

 

 

 

x = x + ¢x:

 

 

 

 

 

Связь между относительной

погрешностью правой части и решения задается

 

e

 

 

 

 

 

 

 

 

 

 

 

числом обусловленности матрицы cond(A):

 

 

 

 

 

cond(A) = sup

k ¢x k

:

k ¢b k

:

(1.3.1)

k x k

k b k

 

 

 

 

¢b

 

 

 

 

Теперь выполняется

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k ¢x k

·

cond(A)

k ¢b k

:

 

(1.3.2)

k x k

 

 

 

 

 

 

k b k

 

Таким образом, число обусловленности показывает во сколько раз относительная погрешность правой части может возрасти в решении.

Пример 1.3.1. Рассмотрим следующую матрицу

22

octave:1> a a =

2.6313e-05 2.6399e+03 5.5784e+03

5.7701e-05 2.3510e-05 9.1372e-05

4.3202e-05 2.6872e+03 -1.9127e+03

Выберем вектор точное решение:

octave:2>x=[1;1;1] x =

1

1

1

Подбираем по точному решению правую часть.

octave:3>b=a*x

b=

8.21834184454532e+03

1.72583201686432e-04

7.74500326991914e+02

Решаем систему встроенным методом Гаусса.

octave:4>x=a \ b x =

1

1

1

octave:5>b1=b b1 =

8.21834184454532e+03

23

1.72583201686432e-04

7.74500326991914e+02

возмущаем правую часть

octave:6>b1(1)=b1(1)+0.001 b1 =

8.21834284454532e+03

1.72583201686432e-04

7.74500326991914e+02

Находим измененное решение.

octave:7>x1=a\b1 x1 =

0.999999748769187

1.000000095445405

1.000000134093709

Кажется, что изменение первой компоненты вектора b влечет за собой небольшое изменение решения (решение почти 1). На самом деле нужно вычислять именно относительные погрешности, что и показывает дальнейшее.

Изменим теперь вторую компоненту вектора b.

octave:8> b1(2)=b1(2)+0.001 b1 =

8.21834284454532e+03

1.17258320168643e-03

7.74500326991914e+02

octave:9> x1=a\b1

24

x1 =

18.330643871686586

0.999999843500222

1.000000171576927

Считаем абсолютную погрешность решения

octave:10>norm(x-x1);

относительную

octave:11>otnX=norm(x-x1)/norm(x);

то же самое для правой части

octave:12>norm(b-b1); otnB=norm(b-b1)/norm(b);

теперь их отношение

octave:13>otnX/otnB ans = 58404095.6051131

Во столько раз относительная погрешность правой части возросла в решении. Число обусловленности данной матрицы, вычисленнное стандартной функцией, равно,

octave:14>cond(a) ans = 1.0760e+08

с другой стороны, определитель этой матрицы равен

octave:15>det(a) ans = 1156.3.

25

Глава 2. Итерационные методы решения СЛАУ

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

§ 2.1. Метод простых итераций

Допустим, что СЛАУ записана в форме

x = Bx + c;

(2.1.1)

то есть из системы, записанной в виде Ax = b, каким-то образом выделен вектор неизвестных x в левой части. Задав начальное приближение x0, можно по формулам (2.1.1) вычислить следующее x1 и так далее. Общая формула

 

 

xn+1 = Bxn + c:

(2.1.2)

Рассмотрим два простых примера

 

 

 

 

Пример 2.1.1. Сделать несколько итераций для системы

 

 

8x1 = 2:1x1 + 1:2x2 ¡ 3:4

(2.1.3)

 

:

= x

+ 0:2x

 

+ 2:8:

 

 

>x

2

 

 

< 2

¡ 1

 

 

 

Запишем данные в

программу

 

 

 

 

>

 

 

 

 

 

octave:1> B=[2.1 1.2; -1 0.2]

B=

2.10000 1.20000

-1.00000 0.20000

26

octave:2> с=[-3.4 2.8] c =

-3.4000 2.8000

Теперь проведем вычисления, используя две переменные x0 текущий вектор, x_next следующий. В качестве начального вектора возьмем вектор правых частей c.

octave:3> x0=c x0 =

-3.4000 2.8000

octave:4> x_next=B*x0+c x0 =

-7.1800 6.7600

octave:5>x0=x_next;

octave:6> x_next=B*x0+c x_next =

-10.366 11.332

Следующие итерации

octave:7> x0=x_next;

octave:8> x_next=B*x0+c x_next =

-11.570

15.432

27

octave:9> x0=x_next;

octave:10> x_next=B*x0+c x_next =

-9.1785 17.4567

Точное решение системы (2.1.3) вектор [2; 1]. Видно, что итерационный метод к нему не сходится.

Рассмотрим еще один пример.

Пример 2.1.2.

8x1 = 0:5x1

 

 

 

 

 

+ 0:1x2

+ 0:4

(2.1.4)

 

>

 

 

 

 

 

 

 

 

:

 

= 0:3x

 

+ 0:4x

 

+ 0:3:

 

 

>x

2

1

2

 

 

<

 

 

 

 

octave:1> B=[0.5 0.1; 0.3 0.4] B =

0.50000 0.10000

0.30000 0.40000

octave:2> c=[0.4; 0.3] c =

0.40000

0.30000

octave:3> x0=c x0 =

0.40000

0.30000

Приведем последующие итерации x=0.400000 0.300000

28

x=0.630000 0.540000 x= 0.769000 0.705000 x=0.855000 0.812700 x= 0.908770 0.881580 x=0.942543 0.925263 x= 0.963798 0.952868 x=0.977186 0.970287 x= 0.985622 0.981270 x= 0.990938 0.988195

В этом случае метод сходится (точное решение [1; 1]). Достигнутую после 10 итераций точность можно грубо оценить количеством цифр после запятой, которые различаются в двух последних итерациях. Видно, что точность найденного решения порядка 0:01.

§ 2.2. Метод Якоби

Систему, записанную в виде Ax = b, приводим к виду (2.1.1) так: первое уравнение системы разрешаем относительно переменной x1, второе относительно переменной x2 и т. д. Покажем эти вычисления на примере.

Пример 2.2.1. Решить систему

8

>

>>2x1 + 0:5x2 + 1:2x3 = 1;

>

<

>0:6x1 + 2x2 + x3 = 2;

>

>

>

:0:5x1 + 0:5x2 + 2:5x3 = 5:

Преобразуем в систему

8x1n+1 = ¡0:25x2n ¡ 0:6x3n + 0:5;

>xn+1

= 0:3xn

 

0:5xn + 1;

>

2

¡

1

¡

3

>

 

 

 

>

 

 

 

 

 

<

 

= ¡0:2x1n

¡ 0:2x2n + 1:

>x3n+1

>

 

 

 

 

 

>

>

:

29

§ 2.3. Метод Зейделя

Отличается от предыдущего метода тем, что, вычисляя, как в методе Якоби x1, подставляем его во второе уравнение, находим x2 , подставляем x1,x2 в

третье и т. д. Матричная запись

8x1n+1 = ¡0:25x2n ¡ 0:6x3n + 0:5;

>xn+1

= 0:3xn+1

 

0:5xn + 1;

>

2

¡

1

¡

3

>

 

 

 

>

 

 

 

 

 

<

 

= ¡0:2x1n+1

¡ 0:2x2n+1 + 1:

>x3n+1

>

 

 

 

 

 

>

 

 

 

 

 

>

:

Жирным шрифтом выделены те слагаемые, которые отличают методы Зейделя и Якоби.

Вычислим несколько итераций по методу Якоби

octave:1> B=[0 -0.25 -0.6; 0.3 0 -0.5;0.2 0.2 0 ];

octave:2> c=[0.5;1;1];

octave:3> x0=c;

octave:4> x_next=B*x0+c; pogr=norm(x0-x_next) pogr = 0.96695

Величина pogr показывает точность, достигнутую после каждой итерации

octave:5> x0=x_next x0 =

-0.35000 0.65000 1.30000

octave:6> x_next=B*x0+c; pogr=norm(x0-x_next) pogr = 0.47977

30

octave:7> x0=x_next x0 =

-0.44250 0.24500 1.06000

Воспользуемся теперь формулами Зейделя

octave:8> x0=c;

octave:9>x_next=x0;

octave:10>for i=1:3 x_next(i)=B(i,:)*x_next+c(i); endfor; pogr=norm(x0-x_next)

pogr = 1.0434

octave:11>x0=x_next x0 =

-0.35000 0.39500 1.00900

Обратите внимание на то, что вместо обычного матричного умножения x_next = B ¤ x_next + c в методе Зейделя используется цикл, в силу того, что вектор x_next должен вычисляться постепенно: сначала его первая компонента, которая затем используется для вычисления x_next(2) и так далее.

octave:12> for i=1:3 x_next(i)=B(i,:)*x_next+c(i); endfor; pogr=norm(x0-x_next)

pogr = 0.15551

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]