Программа решения системы линейных алгебраических уравнений


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

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

Опр. Упорядоченная совокупность однотипных объектов различимых одним индексом { } , i=1,2,…n образуют математический объект – вектор и его аналог в программировании – одномерный массив:

Var b: array [1…N] of real;

где отдельный -ый элемент совокупности именуется b[i].

Опр. Упорядоченная совокупность однотипных объектов, различимых по двум индексам { aij }, i=1,2…k, j=1,2,…m, образует математический объект – матрицу, а в программировании – двумерный массив

Var a: array [1..k, 1..m] of real;

а отдельный aij-элемент именуется а[i, j].

Примечание: Упорядоченность информационных объектов по k-индексам формализуем k-мерным массивом.

Для освоения техники использования индексированных переменных напишем программу решения системы линейных алгебраических уравнений: найти числа {xi}, i=1,2,…n, удовлетворяющие уравнениям:


i j = 1 2 3 … . . j . . . . . n

1 a11x1+a12x2+a13x3+...+a1jxj ...+a1nxn =b1

2 a21x1+a22x2+a23x3+...+a2jxj...+a2nxn =b2 (1)

3 a31x1+a32x2+a33x3+...+a3jxn...+a3nxn =b3

. . . . . . . . .

n an1x1+an2x2+an3x3+...+anjnj...+annxn =bn

 

Матричная формула записи задачи (1): А = (2)

где А = {aij} = {xi} = {bi} i=1,2…n, j=1,2,…n

Запись системы (1) посредством символа суммирования:

, для i=1, 2…n (3)

Систему уравнений (1) решаем методом последовательного исключения Гаусса.

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

aij=0 для всех i > j (4)

Алгоритм первого этапа:

1) Полагая ≠ 0, делим первое уравнение системы (1) на , т.е. приводим его к виду

1∙ (5)

где j = 1,2,3….n (6)

(7)

Эти действия на языке Pascal описываются операторами:

R:=A[1,1]; {сохранили значение коэффициента

в рабочей переменной с именем R}

for j:=1 to N do a[1, j]:=a[1, j]/R; {вычислили значение и разместили их в

тех же местах памяти, где ранее были значения }

b[1]:=b[1]/R;

Вопрос для самопроверки: почему нельзя описывать вычисления операторами:

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

 

2) С помощью преобразованного первого уравнения (5) легко исключить (обнулить) первые слагаемые из всех остальных уравнений системы, т.е. обнулить все для i=2,3,…n, т.е. обнулить первый столбец матрицы. Для этого необходимо из каждого i-го уравнения (i=2,3,…n) вычесть первое уравнение, т.е. (5) предварительно умножив его на .

Математически это записывается так: для всех i=2,3,…n и j=1, 2, ...n вычислить новые (пересчитать) коэффициенты

и (8)

На языке Pascal, эти инструкции записываются оператором двойного (вложенного) цикла:

For i:=2 to N do { перебор уравнений системы от i=2 до i=n}

begin

R:=a[i,1]; {копирование в рабочую ячейку памяти}

for j:=1 to N do a[i,j]:=a[i,j]-a[1,j]*R;

{пересчет всех элементов матрицы в i-ой строке}

b[i]:=b[i]-b[1]*R {пересчет значения bi}

end;

3) Преобразования, описанные в п.п.(1) и (2) следует последовательно повторить для всех остальных строк системы уравнений (1), т.е. с помощью второго уравнения исключить (обнулить) все под диагональные элементы матрицы из второго столбца, а с помощью третьего уравнения исключить все под диагональные элементы из третьего столбца и т.д.

Строгая упорядоченность выполняемых действий позволяет описать их на языке Pascal посредством вложенных циклов:

For i:=1 to N do {i- номер уравнения, которое используется для обнуления

всех коэффициентов матрицы А, расположенных в i-ом столбце

ниже главной диагонали}

begin

{выполняем пункт (1) для i-го уравнения системы}

R:=a[i,i]; {скопировали в рабочую ячейку коэффициент

матрицы на главной диагонали}

For j:=i to N do a [i,j]: = a [i,j] / R; {j-номера элементов матрицы

в i-ой строке, расположенных левее главной диагонали

Пояснение: цикл по j следует начинать именно с i, а не с 1

, т.к. все элементы матрицы в i-ой строке расположенные

левее i-ого уже обнуленными !}

b [i] : = b [i] / R; {Выполняем пункт (2) для всех уравнений систем,

расположенных ниже i-ой уравнения}

For k:=i+1 to N do {переменная k содержит номер очередного

обрабатываемого уравнения системы, из которого

исключается (обнуляется) коэффициент aki}

begin

R:=a[k,i];

For j:= i to N do a[k,j]:=a[k,j]-a[i,j]*R

{Напоминание: для j=1,2,….i-1 вычислять не надо,

т.к. там уже помещены нули}

b[k]:=b[k]-b[i]*R;

end;

end; {конец цикла по i}

Второй (завершающий) этап решения системы (1) реализуется последовательным просмотром и разрешением всех уравнений системы в обратном порядке, т.е. от N-го до первого.

Последнее уравнение системы, после проведенных преобразований имеет вид

0 ∙ +0∙ +…0∙ +1∙ = , откуда легко находим = ,

Предпоследнее уравнение:

0∙ +0∙ +…0 +1∙ =

позволяет легко найти , т.к. уже известно =

Аналогично вычисляются и все остальные искомые значения . Математически эта часть алгоритма записывается как

= , для i = n, n-1, n-2…, 2,1

На языке Pascal:

For i:=N downto 1 do {i- номер вычисляемой неизвестной xi , который

последовательно уменьшается на 1 от величины N до 1,

i- номер окончательно разрешаемого уравнения системы}

begin

x[i]:=b[i];

for j:=i+1 to N do x[i]:= x[i]-a[i,j]*x[j]; {j – номера ранее вычисленных

значений xj}

end;



Дата добавления: 2021-12-14; просмотров: 258;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.017 сек.