Prozorov_Vych_math_SLAU
.pdf21
Еще один пример нормы
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