Реферат: То схо­ди­мость ите­ра­ци­он­ного про­цесса может быть зна­чи­тельно уве­ли­че­на, если использовать сле­­ду­ю­­щий алгоритм


§ 3. Методы решения систем линейных и нелинейных уравнений

accel1:=x-f/d1-der2(x)*f*f/(2*d1 3)

end.

Метод Эйткена - Стеффенсона. Если функция F(x) не­­пре­рывна и трижды непрерывно диф­фе­рен­ци­руема на от­рез­ке [a, b], причем |F'(x)| < 1, то схо­ди­мость ите­ра­ци­он­ного про­цесса может быть зна­чи­тельно уве­ли­че­на, если использовать сле­­ду­ю­­щий алгоритм. На каж­дом ша­ге вы­чис­ле­ния про­­во­дятся в три этапа: на­хо­дим , затем на ос­но­ве рас­считываем и далее по трем зна­че­ни­ям хn ,, оп­ре­де­ляем при­бли­же­ние по сле­ду­ю­­щей фор­муле:

. (1.21)

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

­це­дуре-функ­ции accel2. Зна­че­ние и тип па­рамет­ров яс­ны из тек­с­та про­це­ду­ры-функ­ции accel2, ко­то­рая, в свою оче­редь, об­ра­ща­ет­ся к функции, воз­вра­ща­ю­щей зна­че­ние F(x).

Function accel2(x:real) : real;

var f1,f2 : real;

begin

{ ** func вычисляет значение функции в точке x **}

f1:=func(x);

f2:=func(f1);

accel2:=(x*f2-f1*f1)/(f2-2*f1+x)

end; { *** accel2 ***} .

Сравнительные расчеты, выполненные с ис­поль­­зо­ва­ни­­ем процедур accel1, accel2 (по формулам 1.20 и 1.21) и newt, ре­а­ли­з­у­ющей метод Ньютона (1.19), по­­ка­зали, что при ис­поль­зовании "ускоряющих" про­цедур для не­ко­то­рых функ­ций удается до­бить­ся ускорения схо­ди­мости в 3 - 5 раз.



^ § 3. МЕТОДЫ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ И НЕЛИНЕЙНЫХ УРАВНЕНИЙ



Система m линейных алгебраических ура­в­не­ний с n не­известными в общем виде может быть за­­­писана сле­ду­ющим образом:

(1.22)

или в матричном виде AX = B, где A - прямоу­голь­­­ная мат­рица размерности m´n, X - век­тор n-го по­ряд­ка, B - век­тор m-го порядка. Ре­ше­нием сис­­темы (1.22) на­зы­ва­ет­ся такая упо­­ря­до­ченная со­­во­куп­ность чисел которая об­ра­ща­ет все уравнения сис­­те­мы в вер­ные ра­­вен­ства. Две системы называются эк­­ви­ва­лентными (рав­но­­силь­ны­ми), если множества их ре­ше­­ний сов­­падают.

Система линейных уравнений называется сов­­­мест­­­­ной, ес­ли она имеет хотя бы одно ре­ше­ние, и не­­сов­­мест­ной - в про­тивном случае. Сов­мест­­ная сис­­те­ма на­зы­ва­ет­­ся определенной, если она имеет един­ст­вен­ное ре­ше­ние, и не­оп­ре­де­лен­ной - в про­тив­­ном слу­чае. Система яв­ля­­ется опре­де­­ленной, ес­­ли rang A = rang B, где матри­ца B, по­­лученная из матрицы A добавлением стол­бца сво­бод­ных чле­­нов, на­зы­­вается рас­ши­рен­ной.

Если матрица A - квадратная и det A  0, то она на­зы­­вается неособенной (невырожденной), при этом сис­те­ма уравнений, имеющая не­о­со­бен­ную мат­ри­цу A, сов­мес­­тна и имеет единственное ре­­шение.

Eсли уравнения (1.22) являются не­ли­ней­­­ными от­но­си­тельно неизвестного вектора Х, то со­от­вет­с­т­ву­ю­щая сис­тема, записанная в век­тор­ной форме

(1.23)

на­­­зы­вается системой нелинейных уравнений. Она мо­жет быть также представлена в ко­орди­натном виде:

1 < k < n.

Многообразие численных методов решения сис­­­тем ли­нейных алгебраических уравнений мож­­­­но раз­де­лить на два класса: прямые (или точ­­ные) и ит­е­ра­ционные (или при­ближенные) ме­то­ды. В на­сто­ящем па­раграфе рас­смат­ри­­ваются на­и­­более эф­фективные ал­горитмы, ре­ализующие ряд методов из обоих клас­сов. Однако за­ме­тим, что не­ли­ней­­­ные системы ре­шают толь­ко ите­ра­ци­онными ме­то­­да­ми, один из ко­торых (ме­­тод Нью­то­на) рас­смат­ривается в на­­сто­я­щем параграфе.
^ 3.1. МЕТОД ИСКЛЮЧЕНИЯ ГАУССА ДЛЯ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ
Из курса линейной алгебры [Крылов и др., 1972; Ку­рош, 1962; Фадеев, Фадеева, 1963 и др.] из­­вестно, что ре­ше­ние системы линейных урав­не­ний можно прос­то най­ти по правилу Крамера - че­­рез отношение оп­ре­де­ли­те­лей. Но этот способ не очень удобен для ре­шения сис­тем урав­не­ний с чис­­лом неизвестных > 5, т.е. когда най­ти опре­де­ли­тель сложно, а при чис­­ле не­известных > 10 на­­­хож­де­ние оп­ре­­де­ли­теля с до­ста­точ­но высокой сте­пенью точ­нос­ти ста­но­вится са­мо­сто­ятельной вы­чис­­ли­тель­­­ной за­дачей. В этих слу­чаях применяют иные методы ре­­­шения, среди ко­то­рых самым рас­про­­стра­нен­ным яв­ля­ет­ся метод Га­ус­са.

Запишем систему линейных уравнений (1.22) в ви­де

(1.24)

Если матрица системы верхняя треугольная, т.е. ее эле­мен­ты ниже главной диагонали рав­ны ну­­лю, то все хj можно найти по­сле­до­ва­тель­но, на­­чиная с хn, по фор­му­ле

. (1.25)


При j > k и аjj  0 этот метод дает возможность най­­ти решение системы.

Метод Гаусса для произвольной системы (1.22) ос­­­но­ван на приведении матрицы А сис­те­мы к верх­­ней или ниж­ней треугольной. Для это­го выч­и­та­ют из второго уравнения системы первое, умно­­­­женное на такое число, при котором а21= 0, т.е. ко­­­эф­фи­ци­ент при х1 во второй строке должен быть ра­вен ну­­лю. Затем та­ким же образом ис­­клю­чают по­­сле­до­­ва­­тельно а31 , а41 , ..., аm1 . После за­вер­ше­­ния вы­чис­­ле­ний все эле­мен­ты первого столбца, кроме а11, бу­­дут равны ну­лю.

Продолжая этот процесс, исключают из мат­ри­­­цы А все коэффициенты аij, лежащие ниже главной ди­а­го­на­ли.

Построим общие формулы этого процесса. Пусть ис­клю­чены коэффициенты из k - 1 столб­ца. Тог­да ниже глав­ной диагонали долж­­­ны остаться урав­не­ния с нену­ле­выми эле­­­ментами:



Умножим k-ю строку на число



и вычтем ее из m-й строки. Первый не­ну­­­левой элемент этой строки обратится в нуль, а ос­­­таль­ные изменятся по формулам

(1.26)

Произведя вычисления по формулам (1.26) при всех ука­занных индексах, исключим эле­мен­ты k-го столб­ца. Та­кое исключение назовем цик­­лом, а вы­­полнение всех цик­лов назовем пря­мым ходом ис­ключения.

После выполнения всех циклов получим верх­­нюю тре­угольную матрицу А системы (1.24), ко­то­рая легко ре­шается обратным ходом по фор­му­лам (1.25). Если при прямом ходе коэффициент аjj ока­зал­ся ра­вен нулю, то пе­ре­ста­нов­кой строк пе­ремеща­ем на глав­ную ди­а­го­наль не­ну­ле­вой эле­мент и про­дол­жа­ем расчет.

Если предположить, что аjj  0, то тогда можно при­ме­­нить подпрограмму gaus, ре­ша­ю­щую сис­те­му из n ли­ней­­ных уравнений. Это одна из под­про­грамм, тра­ди­ци­он­но ис­поль­зу­ю­ща­яся в биб­ли­о­теках стандартных про­грамм для ЕС-ЭВМ. Ее пе­ревод на язык PASCAL вы­полнен ав­то­ра­ми.

^ Формальные параметры процедуры. Входные: n (тип in­te­ger) - порядок системы; а (тип real) - мас­сив ко­эф­фи­ци­­ентов системы размером n´n; b (тип real) - массив-стро­­ка свободных чле­нов. Выход­ные: х (тип real) - мас­сив-строка, в который по­ме­ща­ется ре­­шение системы.

procedure gaus (n:integer; a : mas; b : mas1;

var x : mas1);

type mst = array [1..n] of real;

mss = array [1..n] of mst;

var a1 : mss; b1 : mst;

i, j, m, k : integer; h : real;

begin

for i := 1 to n do

begin

b1[i] := b[i];

for j := 1 to n do

a1 [i,j] := a[i,j];

end;

for i := 1 to n-1 do

for j := i+1 to n do

begin

a1[j,i] :=- a1[j,i] / a1[i,i];

for k := i+1 to n do

a1[j,k] := a1 [j,k] + a1[j,i]*a1[i,k];

b1[j] := b1[j] + b1[i]*a1[j,i];

end;

x[n] := b1[n] / a1[n,n];

for i := n-1 downto 1 do

begin

h := b1[i];

for j := i+1 to n do

h := h - x[j]*a1[i,j];

x[i] := h / a1[i,i];

end;

end.

Если контроль за невырожденностью мат­ри­цы А не­об­ходим, то можно предложить воспользоваться другой про­це­ду­рой gaus1.

В отличие от первой процедуры здесь в вы­ход­ных па­раметрах есть переменная tol, воз­вра­ща­ю­щая 0 при нор­­мальном завершении работы про­це­ду­ры, или 1, ес­ли на главной диагонали один из эле­ментов ра­вен 0, или 2, если матрица А раз­мер­ностью боль­ше, чем 50´50.

procedure gaus1 (n:integer; a : mas; b : mas1;

var x : mas1; var tol : integer);

type mst = array [1..50] of real;

mss = array [1..50] of mst;

var a1 : mss; b1 : mst;

i, j, m, k : integer; h : real;

begin

for i := 1 to n do

begin

b1[i] := b[i];

for j := 1 to n do a1 [i,j] := a[i,j];

end;

tol := 0;

if n > 50 then

begin

tol := 2;

exit;

end;

for i := 1 to n-1 do

for j := i+1 to n do

begin

if abs(a1[i,i])< 1.0e-10 then

begin

tol := 1;

exit;

end;

a1[j,i] :=- a1[j,i] / a1[i,i];

for k := i+1 to n do

a1[j,k] := a1 [j,k] + a1[j,i]*a1[i,k];

b1[j] := b1[j] + b1[i]*a1[j,i]

end;

if abs(a1[n,n]) < 1.0e-10 then

begin

tol := 1;

exit;

end;

x[n] := b1[n] / a1[n,n];

for i := n-1 downto 1 do

begin

if abs(a1[i,i]) < 1.0e-10 then

begin

tol := 1;

exit;

end;

h := b1[i];

for j := i+1 to n do h := h - x[j]*a1[i,j];

x[i] := h / a1[i,i];

end;

end.

По поводу приведенных ал­го­рит­мов можно ска­­зать, что они не самые эф­фек­тив­ные и при­год­ны для ре­ше­ния систем, имеющих невырожденные матрицы А и В с рангом не бо­лее 50, составленные из при­бли­зи­тельно оди­на­ко­вых ко­эф­фи­ци­ентов. Если меж­­ду на­и­большим и на­и­мень­шим из ко­эф­­фи­ци­ен­тов рас­стоя­ние более чем 104, то эти ал­­го­ритмы при­ме­нять не рекомендуется, так как по­греш­ность вы­чис­­ле­ний бу­дет та­­кова, что может ли­бо привести к вы­­рож­ден­ной мат­ри­це А, ли­бо дать в ре­зультате век­­тор Х с боль­шой вы­чис­­ли­­тель­ной по­греш­нос­тью.

Для проверки работы процедур ре­шим сис­­тему ли­ней­ных уравнений методом Гаусса с точ­нос­тью до 0.0001:



Коэффициенты, промежуточные результаты и око­н­чательное решение приводятся в таб­л. 1.14. Подобные таб­лицы удобно ис­поль­зо­вать для руч­ного счета и про­вер­ки хода ре­ше­ни­я.

Таблица 1.14

Коэффициенты при неизвестных

Cвободные

Cтрочные

x1

x2

x3

x4

члены

суммы

0.68

0.21

0.11

-0.08

0.55

-0.13

0.84

0.15

-0.11

0.27

0.28

0.50

0.88

0.80

-0.06

0.12

2.15

0.44

0.83

1.16

2.85

-0.01

1.44

0.61

1

0.0735

-0.1618

0.1176

3.1618

4.1912




-0.1454

-0.18319

0.15590

0.30398

0.26220

-0.51290

-0.8247

0.0729

-0.1106

-0.22398

-0.48220

1.41290

-0.88015

-0.97847

0.94530




1

-2.09060

5.6719

1.54040

6.1217







-1.47643

-0.18697

4.79139

-0.99480

0.79920

1.17230

4.1136

-0.0095







1

-3.24410

-0.54110

-2.7851










-1.60130

1.07110

-0.5302










1

-0.66890

0.3311

2.8264

-0.3337

-2.7110

-0.6689

: РЕШЕНИЕ



^ 3.2. МЕТОД ГЛАВНЫХ ЭЛЕМЕНТОВ
На практике применяют множество ва­ри­ан­тов вы­чис­ли­тельных схем метода Гаусса. Например, при при­ве­дении мат­рицы к верхней тре­у­голь­ной фор­­ме вы­би­ра­ют на­и­боль­ший элемент (в­ строке или стол­бце), умень­шая вы­чис­ли­тель­­­­ную по­греш­­­ность за счет де­ле­ния на не са­мый ма­лень­кий эле­­мент. Та­кая вы­чис­ли­тель­ная схема на­зы­ва­ет­ся ме­­­то­­дом Га­­ус­са с выбо­ром ве­ду­щего элемента. Ес­ли же вы­би­­­рать при при­ведении мат­рицы са­мый боль­­шой (по мо­ду­лю) элемент из всех ос­­тав­ших­ся, то такая схе­ма бу­дет на­зы­ваться ме­то­дом Га­усса с вы­­бором глав­но­го эле­­мента. По­­след­няя схема от­но­сит­­ся к на­и­бо­лее по­­­пулярным. Глав­ное ее от­­личие от метода Гаусса, рас­смот­рен­­ного в п. 3.1, сос­­то­ит в том, что при при­ведении мат­­рицы А к верх­ней (или ниж­ней) тре­угольной фор­­ме ее стро­ки и стол­б­­цы пе­ре­­став­­ля­ют так, чтобы на­и­боль­ший из всех ос­тав­­ших­ся эле­­­мен­­тов матрицы стал ве­дущим, и на него вы­пол­ня­ет­­ся де­ление. Ес­ли мат­ри­ца хоро­шо обу­с­лов­лена, то в ме­тоде Га­­усса с вы­бо­ром глав­­­но­го элемента по­греш­­нос­­ти ок­руг­ле­­ния не­ве­ли­­ки.

Описанный алгоритм, как и алгоритм метода Га­­­­ус­са, представленный в п. 3.1, имеет множество про­грам­мных ре­­­ализаций и всегда есть в биб­ли­о­те­ках стан­­дар­т­ных про­грамм. Один из относительно эф­фек­тив­ных ал­го­рит­мов есть в БСП 1 на ЕС ЭВМ для тран­слятора FORT­RAN-77. Он ре­а­ли­зо­ван в ви­­­де про­цедуры sinq. Пе­ревод на язык PASCAL вы­­пол­нен ав­торами.

^ Формальные параметры процедуры. Входные: n (тип in­­te­ger) - целое положительное число, рав­ное по­­­рядку ис­­ходной системы; aa (тип real) - массив из n´n дейс­т­ви­тель­ных чисел, содержащий мат­ри­цу ко­­эф­фи­циентов сис­те­мы (aa[1] = а11; aa[2] = а21; aa[3] = a31; ...; aa[n]= an1; aa[n +1]= =a12; aa[n + 2] = a22; ...; aa[2*n] = аn2; ...; aa[n*n] = аnn); b (тип real) - мас­сив из n действительных чисел, со­дер­жа­щий стол­бец сво­бодных членов исходной системы (b[1] = =b1; b[2] = b2; ...; b[n] = bn). Выходные: b (тип real) - мас­­сив из n действительных чисел (он же был вход­ным) при выходе из подпрограммы, со­дер­жа­щий ре­ше­ния ис­ход­ной системы (b[1]= x1; b[2] = x2; ...; b[n] = xn); ks (тип in­­te­ger) - признак пра­виль­нос­ти ре­­ше­ния или код ошиб­ки: если ks = =0, то в ма­с­си­ве b со­дер­жится ре­­шение ис­ход­ной сис­те­мы; если ks = 1, то исход­ная сис­тема не име­ет ре­ше­ния (глав­ный опре­де­ли­тель ее равен нулю).

procedure sinq (var a: mas11; var b : mas1;

var ks : integer; n : integer);

var tol, biga, aa, save : real;

jj,jy,ij,it,j,i, i1, imax, k, iqs, ixj, ixjx : integer;

jjx, ny, ia, ib, io, i2, ix, jx, ky : integer;

label Cont10;

begin tol := 0.0;

ks := 0;

jj := -n;

for j := 1 to n do

begin jy := j + 1;

jj := jj + n + 1;

biga := 0.0;

it := jj - j;

for i := j to N do

begin

ij := it + i;

aa := abs (a[ij]);

if (abs(biga)-aa) < 0.0 then

begin

biga := a[ij];

imax := i; end;

end;

if (abs(biga)-tol) <= 0.0 then

begin

ks := 1;

exit;

end;

i1 := j + n*(j-2);

it := imax - j;

for k := j to n do

begin

inc (i1,n);

I2:= i1 + it;

save := a[i1];

a[i1] := a[i2];

a[i2] := save;

a[i1] := a[i1] / biga;

end;

save := b[imax];

b[imax] := b[j];

b[j] := save / biga;

if j=n then goto Cont10;

iqs := n*(j-1);

for ix := jy to n do

begin

ixj := iqs + ix;

it := j - ix;

for jx := jy to n do

begin

ixjx := n*(jx-1) + ix;

jjx := ixjx + it;

a[ixjx] := a[ixjx] - a[ixj]*a[jjx];

end;

b[ix] := b[ix] - b[j]*a[ixj];

end;

end;

Cont10: ny := n - 1;

it := n*n;

i := 1;

j :=1;

for ky := 1 to ny do

begin ia := it - ky;

ib := n - ky;

io := n;

for k := 1 to ky do

begin

b[ib] := b[ib] - a[ia]*b[io];

Dec (ia,n);

Dec (io);

end;

end;

end.

Для проверки процедуры и сравнения с ра­бо­той про­цедур в п. 3.1 решалась система урав­не­ний, при­ве­ден­ная в качестве примера в п. 3.1. Вы­­­числения про­во­ди­лись с точностью до 10-5. Ре­зуль­таты работы про­грам­мы приведены далее.

Исходная матрица А

Матрица В

0.680000 0.050000 -0.110000 0.080000

0.210000 -0.130000 0.270000 -0.800000

-0.110000 -0.840000 0.280000 0.060000

-0.080000 0.150000 -0.500000 -0.120000

2.150000

0.440000

-0.830000

1.160000

Преобразованн­ая матрица А

Матрица В

1.000000 0.210000 -0.110000 -0.080000

0.000000 1.000000 -0.145441 0.155882

0.000000 0.000000 1.000000 0.258130

0.000000 0.000000 0.000000 1.000000

3.161765

0.579636

-2.851572

-0.669070


РЕШЕНИЕ СИСТЕМЫ

2.826351 -0.333733 -2.711759 -0.669070 .


^ 3.3. РЕШЕНИЕ СИСТЕМ НЕЛИНЕЙНЫХ УРАВНЕНИЙ МЕТОДОМ НЬЮТОНА
Очень распространенной является вы­чис­ли­тель­ная за­­да­­ча нахождения некоторых или всех ре­­шений сис­темы (1.23) из n нелинейных ал­геб­ра­и­ческих или транс­цен­ден­тных уравнений с n не­из­вест­ны­ми.

Обозначим через Х вектор-столбец (х1, х2, ..., хn)T и за­пишем систему уравнений в виде формулы (1.23) F(Х) = 0, где F = (f1, f2, ..., fn)T.

Подобные системы уравнений могут воз­ни­кать не­­по­средственно, например при конс­тру­и­ро­ва­нии фи­­­­зи­чес­ких систем, или опо­­сре­до­ван­но. Так, к при­­­ме­ру, при ре­шении задачи ми­­ни­ми­за­ции не­ко­то­­рой функ­ции G(х) час­то не­об­ходимо опре­де­лить те точ­ки, в ко­то­рых гра­ди­ент этой функ­ции ра­вен нулю. Полагая F = grad G, по­лу­­ча­ем не­ли­ней­ную си­стему.

Основная идея метода Ньютона состоит в вы­де­­­лении из уравнений линейных частей, ко­то­рые яв­­ля­ют­ся глав­ны­ми при малых при­ра­ще­ни­ях ар­гу­мен­тов. Это по­з­во­ля­ет свес­ти исходную за­дачу к ре­­­шению по­сле­до­ва­тель­нос­ти ли­ней­­ных систем. При решении единственного ура­в­не­ния (n=1) по­лу­­ча­ем рас­смот­ренный в п. 2.3 ме­тод Ньютона (1.19).

Метод Ньютона для n уравнений применим толь­­ко тог­да, когда могут быть вычислены все част­­­ные про­из­вод­ные функций fi по переменным хi. Пусть J(х) обо­зна­чает мат­ри­цу Якоби и ее (i, j)-й эле­мент есть значение про­изводной в точке xi. Как и в одномерном слу­чае (n = 1), ме­тод Ньютона на­чи­на­ется с про­из­воль­но­­го Х, обо­зна­чен­ного Х0. Да­лее F ли­не­а­ри­зу­ют для Х0, раз­ла­гая его в ряд Тей­ло­ра и учи­ты­вая лишь пер­вые чле­­ны:

F(Х)= F(Х0) + J(Х 0)(Х - Х0) + ...

Линейное приближение к F около Х0в опе­ра­тор­ной фор­ме задается

L(Х) = F(Х0 ) + J 0(Х - Х0), где J0 = J(Х0).

Чтобы найти следующее приближение Х к ре­ше­­­­нию сист­емы F(Х) = 0, решают уравнение F(Х0) +J0(Х1 - Х0) = 0. Естественно, решение мож­­но так­же за­пи­сать в фор­ме X1 = =X0- (J0) -1F(X0), силь­но на­по­ми­на­ющей од­но­мер­ную фор­му­­лу метода Нью­­­тона.

Однако для большинства систем из n урав­не­ний с n не­­из­вестными вычисление обратной мат­ри­­цы (J0) -1не яв­ля­ется не­обходимым, а на­о­бо­рот, пре­д­поч­ти­тель­нее ре­шать ли­ней­­ную сис­те­му от­но­­­си­тельно по­правки Х1 - Х0.

В общем случае, имея Хk, можно найти Хk+1 при­­бав­ле­нием к Хk поправки Хk+1 - Хk, по­лу­чен­ной из ре­шения ли­нейной системы

F(Хk ) + J k(Хk+1 - Хk) = 0. (1.27)

Сходимость итерационного процесса (1.27) до­ка­­зы­ва­ется теоремой Дж.Форсайта и др. (1980), ко­­­то­рую сфор­му­лируем неформально.

Пусть r - решение системы F(Х) = 0 такое, при ко­то­ром J(n) не вырождена и вторые частные про­из­вод­­ные функ­ции F непрерывны вблизи r. Тогда, ес­ли Х0 до­ста­точ­но близко к r, то ньютоновы ите­ра­ции схо­дятся. Бо­лее того, для еk = хk - r при k® ¥ от­но­ше­ние



ограничено. Cхо­ди­мость про­цесса будет 2-го по­ряд­­ка.

Как и в одномерном случае, здесь основная про­­­бле­ма сос­тоит в удачном выборе начального при­­бли­­же­ния, ко­то­рое желательно было бы выбрать до­ста­точ­но близ­ко к пред­полагаемому корню, что­­бы могла на­чаться быстрая схо­­ди­­мость.

На практике такое приближение достигается или очень большим везением (удачно выбран Х0), или му­жест­вом и настойчивостью ис­сле­до­ва­те­ля (выполняется очень мно­го ите­раций до того, как про­цесс нач­нет быстро схо­дить­ся).

Еще одно замечание по поводу матрицы Яко­би. Если вы­числение производной функции уже в од­но­мер­ном слу­чае бывает более сложной за­да­чей, чем отыс­кание значения са­мой функции, то для сис­те­мы n урав­нений вычисление F'(Х) во мно­­го раз бо­лее тру­до­емко, чем вычисление F(Х) (не за­бы­вай­те, что это мат­рицы, а не просто функ­­ции !).

Попытки избежать перечисленные труд­нос­ти пре­­в­ра­ти­лись в отдельную вы­­­чис­ли­тельную задачу. Прямое обоб­ще­ние ме­то­­да се­ку­щих оказалось не­у­дов­ле­тво­ри­тель­ным, так как при­бли­же­ния к J(Х), получающиеся как n-мер­­ный аналог ме­тода секущей (метод хорд), часто ока­зы­ва­­ются вы­­рож­­ден­ными. Популярны так на­зы­ва­е­мые ква­зи­нью­­то­новские методы, которые на­чи­на­ют­­ся с очень труд­ных начальных итераций, но по ме­ре при­бли­же­ния к ре­ше­­нию точность их воз­рас­та­ет. Эти ме­то­ды ши­роко ис­пользуют в за­да­чах мно­го­мер­ной оп­ти­ми­за­ции.

Полная информация по рассмотренным мето­дам име­ет­ся в работах Островского (1963) и Ортега, Рейн­­­болда (1975), последнюю можно счи­­тать пол­ным справочником по методам решения сис­тем нелинейных урав­не­ний.

В данной работе можно воспользоваться под­­­про­граммой zeroin, подробно описанной в п. 2.6 с не­боль­шими изменениями. Но здесь приводится другая про­цедура, взятая из БСП для БЭСМ (язык FORT­RAN), переведенная на язык Pascal авто­ра­ми. Эту под­­про­грам­му ис­пользуют тра­ди­ци­он­но для ре­ше­ния сис­тем не вы­ше 10-го порядка, она работает до­ста­­точно эф­фек­тивно и быстро.

^ Формальные параметры процедуры. Входные: n (тип integer) - количество урав­не­ний системы (сов­па­да­ет с ко­ли­чес­твом неизвестных, причем n < 10); x (тип real) - мас­сив из n действительных чисел, со­дер­жа­щий перед об­ра­щением newts начальное при­бли­­же­ние решения; funcf - имя внешней под­про­грам­­мы, при помощи которой выполняют вы­­чис­ления те­ку­щих зна­чений функ­ции F по за­дан­ным зна­че­­ни­ям, рас­по­ло­жен­ных в эле­­мен­тах мас­сива x, и раз­­ме­ще­ние их в эле­мен­тах мас­си­ва y; funcg - имя внеш­­ней под­про­грам­мы, ­предназначенной для вы­чис­ле­ния по за­дан­ным зна­че­ни­ям x из мас­сива {x} эле­мен­тoв матрицы dF/dх, раз­мещенной в двух­мер­ном мас­си­ве a раз­мером [n´n]; eps (тип real) - зна­­че­ние  из ус­ло­вия окон­­ча­ния ите­ра­ционного про­­цес­са. Выходные: x (тип real) - мас­сив из n дейст­ви­тельных чисел (он же вход­­ной) содержит при вы­хо­де из newts при­бли­­жен­ное зна­чение решения; k (тип integer) - раз­ре­шенное ко­ли­чес­т­­во итераций.

procedure newts (const n: integer;

var x : array of real; eps : real;

var xkit : integer);

var y, x1 : array [0..2] of real;

a : array [0..4] of real;

l, m : array [0..10] of integer;

j, i, nk : integer; s, d, xx,yy : real;

begin

xkit := 0;

repeat

for j := 1 to n do x1[j] := x[j];

xx := x1[1];

yy := x1[2];

FuncF (N, Xx,yy, Y);

FuncG (N, Xx,yy, a);

MinV (A, N, D, L, M);

for j := 1 to n do

begin

x[j] := x1[j];

for i := 1 to n do

begin

NK := J + N*(i-1);

x[j] := x[j] - A[NK]*Y[i];

end;

end;

Inc (xkit);

s := 1.0;

for j := 1 to N do s := s* sqr(X[j]-X1[j]);

s := sqrt(s);

until s > eps;

end.

Внимание: подпрограмма newts содержит об­ра­­ще­ние к подпрограмме minv, которая входит в БСП БЭСМ. Пол­ный текст под­­программы приводится ни­же (пе­­ревод на язык PAS­CAL выполнен ав­то­ра­ми).

procedure MinV (var a : array of real;

n : integer; var d : real;

var L, M : array of integer);

var nk,kk,k,iz,ij,i,ki,ji,jp, jk, ik, kj, jq : integer;

biga, hold : real;

jr : integer; dn : boolean;

begin d := 1.0;

nk := -n;

dn := false;

for k := 1 to n do

begin Inc(nk,n);

l[k] := k;

m[K] := k;

kk := nk + k;

biga := a[kk];

for j := k to n do

begin

iz := n*(j-1);

for i := k to n do

begin

ij := iz + i;

if (abs(biga)-abs(a[ij])) < 0.0 then

begin

biga := a[ij];

l[k] := i;

m[k] := j;

end;

end;

end;

j :=l[k];

if j > k then

begin

ki := k - n;

for i := 1 to n do

begin

Inc(ki,n);

hold := - f[ki];

ji := ki - k + j;

a[ki] := a[ji];

a[ji] := hold;

end;

end;

i := m [k];

if i > k then

begin

jp := N*(i-1);

for j := 1 to n do

begin

jk:= nk + j;

ji:= jp + j;

hold := - a[jk];

a[jk] := a[ji];

a[ji] := hold;

end;

end;

if abs(biga)< 1.0e-10 then

begin

d := 0;

exit;

end;

for i := 1 to n do

begin

if i<> k then

begin

ik := nk + i;

a[ik] := a[ik] / (-biga);

end;

end;

for i := 1 to n do

begin

ik := nk + i;

hold := a[ik];

ij := i - n;

for j := 1 to n do

begin

Inc(ij,n);

if i<>k then

begin

kj := ij - i + k;

a[ij] := hold*a[kl] + a[ij];

end;

end;

end;

kj := k - n;

for j := 1 to n do

begin

Inc (kj, n);

if j <> k then a[kj] := a[kj] / biga;

end;

d := d * biga;

a[kk] := 1.0 / biga;

end;

k := n-1;

repeat

i := l[k];

if i>k then

begin

jq := n*(k-1);

jr := n*(i-1);

for j := 1 to n do

begin

jk := jq + j;

hold := a[jk];

ji := jr + j;

a[jk] := -a[ji];

a[ji] := hold;

end;

end;

j := m[k];

if j>k then

begin ki := k - n;

for i := 1 to n do

begin

ki := ki + n;

hold := a[ki];

ji := ki - k + j;

a[ki] := -a[ji];

a[ji] := hold;

end;

end;

Dec (k);

until k=0;

end.

Для проверки работы процедур решим систему не­ли­ней­­ных урав­нений с точностью до 0.001, ис­поль­зуя ме­тод Нью­то­на:



После отделения корней выяснилось, что сис­те­ма имеет решениe по х на интервале 0.4 < х < 0.5, а по y - 0.75 < у < <-0.73. Таким образом, за на­чаль­ные при­бли­же­ния можно взять: х0 = 0.4; у0 = -0.75. Далее имеем

F(х,у) = sin(2х - у) - 0.4 - 1.2х ;

G(х,у) = 0.8х2 + 1.5у2 -1;

Fx ' = 2 cos (2х - у) - 1.2; Gх' = 1.6х;

Fy' = -cos(2х - у); Gy' = 3у.

Уточнение корней системы проведем методом Нью­то­на. Взяв за основу предлагаемые про­це­ду­ры и до­о­пре­делив процедуры для вычисления F(х), G(х) и F'(х), G'(х) как

Procedure FuncF (n : integer; xx1,xx2 : real;

var y : array of real);

begin

y[1] := xx1 - exp(-xx2);

y[2] := xx2 - exp (xx1);

end.

Procedure FuncG (n : integer; xx1,xx2: real;

var a : array of real);

begin

a[1] := 1.0;

a[2] := - exp(xx1);

a[3] := exp(-xx2);

a[4] := 1.0;

end

получим решение поставленной задачи:

Х1 = 0.273332; Y1 = 1.275009; итерация = 1;

Х2 = 0.273332; Y2 = 1.275009; итерация = 2.

^ 3.4. РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ МЕТОДОМ КВАДРАТНОГО КОРНЯ
Метод квадратного корня основан на пред­став­­лении матрицы А, составленной из ко­эф­фи­ци­­ентов сис­темы в форме произведения тре­у­голь­ных мат­риц, что позволят свести решение за­дан­ной сис­те­мы к по­сле­довательному решению двух сис­­тем с тре­у­голь­ны­ми матрицами.

Метод квадратного корня применяется для ре­ше­­ния сис­темы линейных уравнений, ко­эф­фи­ци­ен­ты ко­торой об­ра­зуют эрмитову сим­мет­ри­чес­кую мат­ри­цу (эр­ми­то­ва мат­­рица совпадает с ком­­плек­с­­но-со­пря­женной тран­с­­по­ни­ро­ванной A* = A).

Представим матрицу А в виде А = S*D S, где S - верх­няя треугольная матрица с по­ло­жи­тель­ны­ми эле­мен­тами на главной диагонали; S*- транс­по­ни­ро­ван­ная к матрице S; D- ди­а­го­наль­ная мат­ри­ца, на ди­агонали ко­торой на­хо­дят­ся чис­ла (+1) или (— 1).

Если матрицы S и D найдены, то заданная сис­­те­ма AХ= = F может быть решена следующим пу­­тем:

AX = S* D S X = (S* D) S X = B Y = F, (1.28)

где S*D = В есть нижняя треугольная матрица и Y = S X - вспомогательный вектор.

Таким об­ра­зом, ре­шение системы АX = F рав­но­­силь­но ре­ше­нию двух треугольных систем ВY = F и SX =Y.

Пусть S = (sik) при i > k и sik  0, sii > 0; S* = (); D = =(dik), d =1; i  k. Тогда из срав­не­ния мат­риц А и S*DS по­лучим

.

Ограничение в сумме получается из учета то­го фак­­­та, что в матрице S ниже главной ди­а­го­на­ли эле­­менты об­ра­ща­ются в нуль. Последнее ра­венс­т­во можно пе­ре­пи­сать не­сколько иначе, при­няв для оп­ределенности k = min(k, l):

;

,

откуда окончательно получим формулы для вы­чис­­ления элементов матриц S и D:

(1.29)

Единственным условием возможности опре­де­ле­­ния sik является skk 0. Для по­стро­е­ния мат­­риц по­лагаем k = 1 и последовательно вы­чис­ля­­ем все эле­менты первой строки s по формуле (1.29); за­т­ем по­лагаем k = 2 - и определяем эле­мен­ты вто­рой стро­­ки и т.д. Когда k = n, тогда най­де­ны все эле­­мен­ты матриц S и D, а следовательно и S*. За­тем последовательно вы­пол­ня­­ем вы­чис­ления (1.28):

S*Z = F; D Y = Z; S X = Y

обыч­ным ходом по формулам

(1.30)

при i = 2, 3, ..., n.

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

. (1.31)

Этот метод экономичен, требует n3/3 ариф­ме­­тических действий и при больших n ( n > 50) вдвое бы­стрее метода Га­усса. Если за основу про­цедуры при­нять алгоритм П5.6 Дья­конова [1987], то тогда метод квад­ратного кор­ня мо­жет быть ре­а­­ли­зован c помощью сле­дующей про­це­ду­ры:

procedure KVK (M, N : integer;

aa: array of real; bb : array of real;

var C: array of real);

type mas1=array [0..4] of real;

mas=array [0..4] of mas1;

var a : mas; j, k, i : integer; s, c1 : real;

begin

i := 0;

for j := 1 to m do

for k := 1 to n do

begin Inc (i); a[j,k] := aa [i]; end;

for j := 1 to N do

begin

for k := j to N do

begin

s := 0.0;

for i := 1 to M do s := s + a[i,j] * a[i,k];

c[k] := s;

end;

c1 := 0.0;

for i := 1 to M do с1 := c1 + a[i,j]*Bb[i];

for i := j to N do a[i,j] := c[i];

c[J] := c1;

end;

a[1,1] := sqrt (a[1,1]);

for j := 2 to N do a[1,j] := a[j,1] / a[1,1];

for i := 2 to n do

begin

s := 0.0;

for k := 1 to i-1 dо s := s + a[k,i]*a[k,i];

a[i,i] := sqrt (a[i,i] - S);

for j := i+1 to N do

begin

s := 0.0;

for k := 1 to i-1 do

S := S + A[K,I]*A[K,J];

A[I,J] := (A[J,I] - S) / A[I,I];

end;

end;

c[1] := c[1] / a[1,1];

for i := 2 to N do

begin s := 0.0;

for k := 1 to i-1do

s := s + a[k,i] * c[k];

c[i] := (c[i] - s) / a[i,i];

end;

c[n] := c[n] / a[n,n];

for i := n-1 downto 1 do

begin s := 0.0;

for k := i+1 to N do s := s + a[i,k] * c[k];

c[i] := (c[i] - s) / a[i,i];

end;

еnd.

^ Формальные параметры процедуры.Входные: m, N (тип integer) - m уравнений и n не­из­вест­ных оп­ре­де­ляют раз­мер матрицы А. Для этой про­це­ду­ры обя­за­тельно вы­пол­не­ние m > n, т.е. ко­ли­чество урав­­не­ний долж­но быть боль­­­­ше ко­личества не­из­вест­­ных (сис­­те­ма пе­ре­о­пре­делена), пре­дель­­ный раз­­­ре­шен­ный слу­чай m = n; а - мат­рица, со­став­­­лен­­ная из ко­эф­фи­ци­ен­тов при не­из­вест­­ных; В - мас­сив, со­став­­ленный из стол­бца сво­бод­ных чле­­нов. Вы­ход­ные: С - массив, в ко­­то­ром со­дер­жит­ся решение сис­темы.

Для проверки правильности работы про­це­ду­ры ре­­ша­лась система 4´4 линейных уравнений ме­то­дом квад­рат­ных корней с точностью 0.0001:

0.68X1 + 0.05X2 + 0.11X3 + 0.08X4 = 2.15 ;

0.05X1 + 0.13X2 + 0.27X3 + 0.80X4 = 0.44 ;

0.11X1 + 0.27X2 + 0.28X3 + 0.06X4 = 0.83 ;

0.08X1 + 0.80X2 + 0.06X3 + 0.12X4 = 1.16 ,

решение которой, полученное методом квад­рат­ных кор­ней, будет следующим

Х 1 = 2.97; Х2 = 1.11; Х3 = 0.74; Х4 = -0.07.
^ 3.5. РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ МЕТОДОМ ИТЕРАЦИЙ
Итерационные методы решения систем ли­ней­ных урав­нений дают возможность вычислить ре­ше­­­ние сис­те­мы как предел бесконечной по­сле­до­ва­­тель­нос­ти про­ме­жуточных решений. Причем каж­­дое по­сле­ду­ющее ре­ше­ние^ § 4. АЛГЕБРА МАТРИЦ
Матрицей называется прямоугольная таб­ли­ца из чи­­сел, содержащая некоторое количество m строк и n столбцов, при этом числа m и n на­зываются порядками мат­ри­цы. Если m = n, мат­­рица на­зывается квадратной, а число m = n - ее по­­рядком. Для записи матриц ис­пользуются сле­ду­ю­щие обо­зна­че­ния:

, (1.33)

где числа aij называются элементами матрицы A. В слу­чае, если m = n и определитель матрицы detA  0, мат­ри­ца A на­зывается невырожденной и для нее можно найти об­рат­ную мат­ри­цу. Обратной по от­но­шению к дан­ной мат­ри­це A называется матрица A-1, которая, бу­ду­чи умно­женной как справа, так и сле­ва на A, дает еди­­ничную матрицу:

.

Матрица AT, полученная перестановкой строк со столб­ца­ми в мат­­ри­це A, называется транс­по­ни­ро­ван­ной. Квад­ратная мат­ри­ца A на­зы­ва­ет­ся сим­мет­рич­еской, если AT = A, и ор­то­го­наль­ной, если AT A = E.

Характеристическим уравнением матрицы A на­­зы­ва­ет­ся матричное уравнение ||A - E|| = 0, в ко­тором i - соб­ст­вен­ные (или ха­рак­те­рис­ти­чес­кие) числа (или зна­че­ния) мат­­рицы A. Соб­ст­вен­ным вектором, отвечающим соб­ст­вен­­ному чис­лу i, называется вектор

,

который удов­летворяет матричному уравнению Ax =i x. Ког­­да говорят о вычислении собст­вен­ных чисел, то раз­ли­ча­ют полную и частичную проблему собст­венных чисел. В пол­ной проблеме вы­чис­ля­ют все собственные числа и со­от­­ветст­ву­ю­щие им собственные векторы матриц, а под час­тич­­­ной про­блемой обычно понимают задачу на­хо­ж­де­ния од­­ного или нескольких собственных чи­сел и со­от­ветс­т­ву­ющих им собственных век­то­ров.

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

^ Задача определения собственных значений и собст­вен­ных векторов матриц имеет большое зна­че­ние при ре­ше­нии очень широкого спектра за­дач. Методы ре­ше­ния ука­занной за­дачи по типу примененной вы­чис­ли­тельной схе­мы мож­но разделить на пря­мые (точные) и ит­е­ра­ци­он­ные (при­бли­женные).

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

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

К прямым можно отнести методы Кры­лова, Да­ни­лев­с­ко­го, Самуэльсона и др., а к ите­рационным - сте­пен­ной и ме­­тод Якоби, или, как его еще на­зы­ва­ют, ме­тод вращений. По­­след­ний метод считается на­и­более эф­фек­тивным из всех известных [Kpылов и др., 1972].
^ 4.1. ВЫЧИСЛЕНИЕ СОБСТВЕННЫХ ВЕКТОРОВ И СОБСТВЕННЫХ ЗНАЧЕНИЙ МАТРИЦ ПО МЕТОДУ КРЫЛОВА
Пусть А - некоторая квадратная матрица ||аij|| по­рядка n. Рассмотрим связанное с ней уравнение ||А -Е|| = 0, определитель которого есть ал­геб­ра­и­ческий многочлен степени n от :

||А -Е|| = (-1)n (n - P1n -1Pn -1Pn . (1.34)

Кор­нями этого многочлена являются собственные зна­че­ния (собственные числа) матрицы А. Эта сис­тема име­ет ненулевое решение тогда и только тог­да, когда n.

А.Н.Крылов1 предложил эффективный ме­тод по­стро­е­ния характеристического мно­го­чле­на, ос­но­­ван­­­ный на при­ме­нении ми­ни­маль­но­го мно­го­чле­на мат­ри­цы, ан­ну­ли­ру­ю­ще­го за­дан­ный вектор.

Возьмем произвольный вектор с(0) 0, раз­мер­­нос­ти n и составим по­сле­до­ва­тель­ность ли­ней­но не­за­висимых век­то­ров по правилу

с(1) = А с(0); c(2) = A c(1); ...; c(n) = A c(n -1).

Очевидно, что c(n) бу­дет являться линейной ком­би­на­ци­ей пре­ды­ду­щих линейно независимых век­то­ров.

Рас­писав полученную на последнем шаге си­с­те­му

(1.35)

где сi - соответствующие координаты вектора с(i), а qi - не­оп­ределенные коэффициенты, по­лу­чим не­од­но­род­ную сис­те­му из n алгебраических урав­нений. Опре­де­литель этой сис­темы



будет отличен от нуля тогда и только тогда, ког­да с(i) об­ра­зу­ют систему линейно независимых век­то­ров [Кры­лов и др., 1972]. Полученные зна­че­ния qi бу­­дут ра­в­ны рi - ко­эф­фи­ци­ентам ха­ра­к­те­рис­ти­чес­ко­го урав­­нения мат­рицы А (1.34).

Для определения qi систему (1.35) решают ме­то­дом Га­усса (с обязательной проверкой). Если сис­те­му не удается привести в ходе решения к тре­у­голь­но­му виду, то говорят о зависимости по­стро­ен­ной сис­те­­мы век­торов, и тогда мож­но записать толь­ко де­ли­­тель ха­рак­те­рис­тического мно­­го­чле­на мат­p­ицы. Сам многочлен ре­ша­ется одним из из­­вест­­ных ме­то­дов решения линейных ал­­геб­ра­и­чес­­ких урав­нений.

После того как найдены собственные зна­че­ния i мат­­ри­цы А, ищут собственные векторы мат­ри­цы А, что при­во­дит к решению следующей од­но­род­­­ной сис­те­­мы ли­ней­ных ал­­гебраических урав­не­ний:

(A -  E)х = 0. (1.36)

Так как i являются корнями ми­ни­маль­но­го ан­ну­ли­рующего вектора с(0) многочлена (1.34), то ре­ше­ния сис­темы (1.36) представляют в ви­де линейной ком­би­нации не­за­висимых ве­к­то­ров с(i)

x(k) =i1 c(n -1) + i2c(n -2) + ... + in c(0),

где коэффициенты ij удовлетворяют ус­ло­вию Ax(n)=k x(n). Умножая x(n) на А и учитывая, что с(j)=Ас(j-1), по­лучают

i(i1c(n-1)+i2c(n-2)+...+inc(0)) =

= i1 c(n) + i2c(n-1) + ... + in c(1).

Если же учесть, что A)c(n) º 0, то после приведения по­доб­ных (с учетом формул 1.35) последнее ра­вен­ст­во мож­но переписать в виде

(qn i1- i in)c(0) + (qn-1 i1 + in - i in-1)c(1) +

+ (qn-2i1+ in-1- iin)c(2) + ... + (q1i1+ i2- ii1)c(n-1) = 0.

1 Библиотека стандартных программ. Поставляется вместе с транслятором языка.

1 Крылов А.Н. О численном решении уравнения высокой степени // ИАН ОМЕН. 1931. № 4. С. 491-539



еще рефераты
Еще работы по разное