1X + 4Y – 0.33Z + 1.33 = 0
1X – 2Y + 6Z – 7 = 0 (14.4
Далее вычитают коэффициенты одного уравнения из соответствующих коэффициентов другого. В примере коэффициенты 2-го и 3-го уравнений системы (14.3) вычтены из коэффициентов 1-го. Результат:
– 6.5Y – 5.833Z – 5.333 = 0
– 0.5Y – 11.5Z + 3.0 = 0 (14.5)
Таким образом Х исключено. (осталось только 2 уравнения с 2-мя неизвестными).
Далее, повторяя описанные операции, исключают Y. Результат деления на коэффициенты при Y:
1Y + 0.897Z + 0.821 = 0
1Y + 23.0Z – 6.0 = 0 (14.6)
При почленном вычитании второго уравнения из первого получаем:
– 22.103Z – 6.821 = 0 (14.7)
1Z – 0.3086 = 0 (14.8)
Откуда : Z = 0.3086
Подставив значение Z например, в верхнее уравнение системы (14.6), получаем: Y= – 1.0974
Подставив найденные Z и Y в верхнее уравнение системы (14.4), находим: Х = 2.9536.
Итак, решение системы уравнений подразделяется на два этапа:
– Последовательное исключение неизвестных вплоть до нахождения значения последнего из них (в примере – это Z).
– Последовательное нахождение остальных неизвестных на основании ранее найденных.
Все действия, производимые на первом этапе основываются на числовых значениях коэффициентов. Записанные рядом с коэффициентами в буквенном виде неизвестные никакой роли не играют. Поэтому систему (14.3) – как и все остальные вытекающие из нее системы, вплоть до (14.8) – можно записать и без буквенных символов неизвестных в виде матрицы:
2 – 5 – 11 – 8
3 12 1 4
1 – 2 6 – 7 (14.9)
Либо в общем виде
А(1, 1) А(1, 2) А(1, 3) А(1, 4)
А(2, 1) А(2, 2) А(2, 3) А(2, 4)
А(3, 1) А(3, 2) А(3, 3) А(3, 4) (14.10)
Матрица представляет собой двумерный массив А. Рядом с числовой матрицей (14.9) представлена соответствующая ей буквенная (14.10), каждый член которой обозначается как А(J, I). Первый индекс – это строка J, второй –столбец I. Так А(2, 4) – это число находящееся в 4-м столбце 2-й строки. В числовой матрице А(2, 4) = 4
Напишем программу решения систем уравнений, основанную
на методе Гаусса
Программа SYST
10 CLS
15 PRINT “РЕШЕНИЕ СИСТЕМЫ ЛИНЕЙНЫХ УРАВНЕНИЙ”
20 DIM A(100,100), B(100,100)
30 DATA 2,-5,-11,-8,3,12,1,4,1,-2,6,-7
40 INPUT NJ
50 NI=NJ+1
60 FOR J=1 TO NJ
70 FOR I=1 TO NI
80 READ A(J, I)
90 NEXT I
100 NEXTJ
110 GOSUB 460
120 CLS
130 M = 1
140 FOR J = 1 TO NJ
150 S = A(J, M)
160 FOR I = M TO NI
170 A(J, I) = A(J, I)/S
180 NEXT I
190 NEXT J
200 GOSUB 460
210 CLS
220 FOR I = M TO NI
230 B(M, I) = A(1,I)
240 NEXT I
260 FOR J = 2 TO NJ
270 FOR I = M TO NI
280 A(J-1, I) = B(M, I)-A(J, I)
290 NEXT I
300 NEXT J
310 GOSUB 460
315 CLS
320 M = M+1
330 NJ = NJ-1
335 IF M > NI–1 THEN 350
340 GOTO 140
350 FOR K=1 TO NI-1
360 M = NI-K
370 C(K) = 0
380 FOR I = M TO NI-1
390 P(M, I) = B(M, I+1)*X(I+1)
400 C(K) = C(K)+P(M, I)
410 NEXT I
420 X(M) = – (B(M, NI)+C(K))
430 PRINT “M, X(M)”; M;: PRINT USING “####.######”;X(M)
440 NEXT K
450 GOTO 550
460 FOR J=1 TO NJ
470 K1=7+2*J
480 FOR I=1 TO NI
490 K2=4+9*I
500 LOCATE K1,K2: PRINT USING “####.####”; A(J, I)
510 NEXT I
520 NEXT J
530 INPUT A$
540 RETURN
550 END
После названия программы в операторе DIM (номер 20) резервируется место в памяти для двух двумерных массивов А и В, с максимальным размером 100*100. Массив А представляет собой матрицу коэффициентов системы линейных уравнений вида (14.3); массив В играет служебную роль, которая будет видна ниже.
Конкретно коэффициенты рассматриваемой системы линейных уравнений записываются в операторе DATA. В этом операторе они представлены по строкам исходной матрицы (14.9)
В номере 40 задается число строк в исходной матрице NJ (число уравнений в системе), а в номере 50, определяется число столбцов NI. В примере NJ = 3, а NI = 4.
В номерах 60 – 100 массив А построчно вводится из оператора DATA с помощью оператора READ и двух вложенных циклов.
Строка 110 отсылает программу к записанной в строках 460 – 540 подпрограмме. Подпрограмма выводит на печать числа в матричной форме. В данном случае выводится исходная матрица вида (14.3)
Подпрограмма состоит из 2-х вложенных циклов. После заголовка внешнего цикла по параметру J (строка 460) в следующей строке величина К1=7+2*J показывает, что верхняя строка матрицы будет располагаться на 7 экранных строк ниже верхнего края экрана, а каждая последующая строка – на 2 экранных строки ниже. Например 3 - я строка матрицы (при J = 3) будет на 7+2*3=13 строк ниже края экрана.
Под номером 480 идет заголовок внутреннего цикла (по параметру I). Далее идет величина К2=4+9*I, которая показывает, что первое (считая слева-направо) число каждой матричной строки будут располагаться на 4 позиции правее левого края экрана, а каждое следующее число – на 9 позиций далее. Например число А(2,4) (матрица 14.10) будет располагаться во второй экранной строке на расстоянии 4 + 9 * 4 = 40 позиций от левого края экрана. В целом указанное расположение чисел матрицы даст оператор LOCATE K1,K2: PRINT USING “####.####”; A(J, I), – строка 500
После операторов конца цикла (строки 510 и 520) на строке 530 располагается оператор INPUT A$. Такой оператор означает требование нажать любую клавишу. Пока клавиша не нажата изображение матрицы будет оставаться на экране и ее можно анализировать (например, в поисках ошибки). Нажатие же клавиши возобновит выполнение программы. Программа перейдет к строке 540 с оператором RETURN (“ВЕРНИСЬ”) и возвратиться из подпрограммы в основную программу к следующему после 110 GOSUB 460 оператору 120 CLS, который удалит с экрана изображение матрицы.
В строке 130 некому параметру М присваивается начальное значение М = 1. Далее идут два вложенных цикла. После заголовка внешнего цикла (по J) в строке 150 присваивается S = A(J, M). Т. е S – это первое (М = 1) число каждой J – той строки. Далее идет заголовок внутреннего цикла (по I) и в нем стоит оператор 170 A(J, I) = A(J, I)/S, означающий, что в каждой J-той строке каждый I-тый член делится на число S. С помощью этой процедуры в примере система уравнений 14.3 (а точнее матрица коэффициентов этой системы (14.8)) превращается в систему (14.4), причем для верхней строки матрицы 14.9 ( J = 1) S = 2, для средней ( J = 2) S = 3 и для нижней (J=3) S = 1.
После завершения циклов в строке 200 GOSUB 460 программа снова обращается к подпрограмме для вывода на печать преобразованной (поделенной на S) матрицы А.
В цикле по параметру I (строки 220 – 240) в операторе 230 B(M, I) = A(1,I) верхняя (при J=1) cтрока матрицы А сохраняется под именем В.
Далее (строки 260 – 300) программа проходит два вложенных цикла с заголовками: 260 FOR J = 2 TO NJ и 270 FOR I = М TO NI, внутри которых осуществляется почленное, вычитание из строки В(M, I) (а по сути А(1,I) оставшихся строк. Это делается с помощью оператора 280 A(J–1, I) = B(M, I)–A(J, I). В примере из коэффициентов верхнего уравнения системы (14.4) : 1 -2.5 -5.5 -4) вычитаются сначала коэффициенты среднего, т. е. второго уравнения, а потом и нижнего.
Как следует из его заголовка, внешний цикл начинается с J=2 (а не J = 1, как обычно). В результате будет осуществлено всего только 2 цикла (для J = 2 и J = 3) и после вычитания останется только 2 уравнения (14.4). Однако верхнее из 2-х вновь полученных уравнений будет иметь номер J = 1, т. к. согласно строке 280 при начале внешнего цикла при J = 2 имеем А(2-1,I) = В(1,I) – (А(2,I) или А(1,I)=В(1,I)–(А(2,I). Аналогично нижнее уравнение будет иметь номер 2, несмотря на то, что оно образовалось в ходе 3-го J-го цикла. Само же почленное вычитание осуществляется для заданных внешним циклом двух строк в рамках внутреннего I-го цикла. Вновь полученная матрица выводится на печать обращением к подпрограмме 310 GOSUB 460, с возвращением к строке 315 CLS.
В результате операторов, записанных в строках 140 – 300 в примере из 3-х исходных уравнений получено два уравнения с исключением первого неизвестного Х.
Теперь два новых уравнения подлежат аналогичной обработке с целью исключения второго неизвестного Y. Чтобы учесть специфику этой новой системы уравнений используются операторы: 320 M = M + 1 и 330 NJ = NJ – 1. Действительно по сравнению с исходной матрицей в новой матрице счет ее членов в строке должен начинаться не с 1-го (который при вычитании обратился в 0) а со второго. Поэтому вместо первоначально объявленного значения М = 1 (номер 130) в соответствии с номером 320 мы теперь имеем М = 2. Число строк (номер 330) сократилось на одну (их осталось 2).
С учетом изложенных обстоятельств оператор 340 GOTO 140 отправляет программу снова на начало программы (совершает 2-й большой цикл), чтобы, пройдя путь до оператора 300 вторично, исключить Y. После этого оператор 340 GOTO 140 пошлет программу на 3-й большой цикл и т. д.
Большой цикл задан без обычного заголовка цикла, где бы указывался параметр цикла и необходимое число его повторений. Компьютер мог бы “зациклиться” (циклы 140 – 300 повторялись бы бесконечно), если бы не оператор 335 IF M > NI – 1 THEN 350. Используется то обстоятельство, что (хотя формально это и не обозначено) большой цикл идет по параметру М, а этот параметр с каждым циклом возрастает на 1 (строка 320). Поэтому наступает момент, когда условие в номере 335 удовлетворяется. При этом от исходной системы уравнений (14.3) остаются только 2 члена: предпоследний – с одним неизвестным – и последний, “свободный” член ( уравнение (14.7).
Если условие 335 удовлетворено, то программа переходит на строку 350. С этого момента первый этап решения системы линейных уравнений (последовательное исключение неизвестных) закончен и начинается второй – последовательное нахождение значений неизвестных. Этот процесс идет в порядке, обратном порядку первого этапа ( в примере первым определяется Z, затем Y и, наконец, X
Второй этап включает строки 350 – 450 и построен в виде двух вложенных циклов. Внешний цикл идет по параметру К, изменяющемуся от 1 до NI-1 (в примере от 1 до 3). В следующей строке 360 M = NI - K устанавливается связь между новым параметром К и ранее использованным параметром большого цикла М. В строке 370 “обнуляется” сумма С(К) для каждого внешнего цикла.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |


