|
Легко видеть, что массив неизвестных х, вычисляемый на обратном ходе, целесообразно совместить с массивом свободных членов Ь. Это позволит обойтись без присваивания х [i] : = b [i] в псевдооператоре вычисление i-го неизвестного. Бросается в глаза также, что над столбцом свободных членов во многих псевдооператорах выполняются в точности те же операции, что и над столбцами матрицы коэффициентов. Ясно, что присоединение массива Ъ свободных членов к массиву а в качестве (п + 1)-го столбца позволит упростить запись этих псевдооператоров. Нетрудно также догадаться, что массив а можно нарастить не одним, а сразу несколькими столбцами свободных членов. Это позволит одновременно решать несколько систем линейных уравнений с одной и той же матрицей коэффициентов, но с разными свободными членами. Пусть расширенная матрица коэффициентов имеет размеры п X т (т. е. одновременно решается т —п систем). Тогда, например, псевдооператор исключение i-го неизвестного из k-го уравнения примет вид for j: = i + l step 1 until m do a[k, j]:=a[k, j] — a[k, i]xa[i, j] Аналогично изменятся и другие псевдооператоры. Зададимся теперь вопросом, оправдано ли выделение псевдооператора формирование i-го уравнения на своем месте при s = i в особый случай? Этот псевдооператор, конечно, выполняется быстрее, чем псевдооператор формирование i-го уравнения из s-го, но выполнять его приходится лишь в одном случае из n—i + / (так как s может принимать любое из значений i, i + /, п)9 так что программа ускоряется незначительно, а удлиняется заметно. Результат же работы этих двух псевдооператоров при s = i один и тот же. Поэтому заменим условный оператор с условием if s = г then одним псевдооператором формирование i-го уравнения из s-го. Взглянем теперь, во что вылился псевдооператор исключение i-го неизвестного: begin формирование i-го уравнения: begin поиск номера s наибольшего коэффициента г в i-м столбце; формирование i-го уравнения из s-го: Обращает на себя внимание то, что в этом псевдооператоре содержатся два цикла с параметром / с одним и тем же заголовком. Нельзя ли их объединить и тем самым укоротить программу и ускорить ее выполнение? Если это и возможно, то придется существенно изменить схему исключения i-го неизвестного, так как циклы, которые мы хотим объединить, находятся в разных псевдооператорах. Поскольку у нас уже есть опыт, проделаем это быстрее. Преобразованный псевдооператор примет следующий вид исключение i-го неизвестного:
|