Еще одной особенностью языка MathCAD является то, что он сам определяет тип переменных
d1 –будетхранить результат деления строк матрицы.
da –будетхранить количество совпавших элементов деления.
s1 – для хранения сообщения и результата проверки. (в Pascal эта переменная lin)
Теперь нам нужно разделить все строки между собой друг на друга и определить общее частное. Легче всего это сделать, разделив поочередно сначала первую строчку на все другие, затем вторую на оставшиеся и т.д.
Запишем это так:
i будет обозначать делимое, а j делитель.
Совет.Чтобы вставить последовательность 1..n-1 нажмите на панели инструментов.
Внимание!Не вводите с клавиатуры имена программных операторов. Для их вставки с клавиатуры можно применять лишь сочетания клавиш, которые приведены в тексте всплывающей подсказки
|
В тело цикла вставьте Add Lineи вставим еще один цикл для того, чтобы найти сумму всех частных. Следует учитывать ситуацию деления на ноль, поэтому ограничим действия с помощью условного оператора if.
Обратите внимание! Что в MathCAD оператор if записывается, наоборот, в отличие от записи в Pascal. Т.е. сначала действие, которое произойдет, если выполниться условие.
Следующим шагом найдем среднее от частного, разделив на число слагаемых n и присвоив это значение d1.
Теперь проверим, сколько слагаемых равны d1. Переменную da будем увеличивать на единицу, если условие верно. Так же как и в предыдущем случае не стоит допускать деления на ноль, поэтому здесь используется вложенный оператор if.
После выполнения цикла, проверим, равно ли da = n, если так, то эти строки линейно зависимые.
Пример:
Допустим, матрица выглядит так: .
d1 будет равно = 1/2+2/4+3/6= 1.5
d1 =1.5 / n = 1.5 / 3 = 0.5
d1 = 1/2 = 2 /4 = 3/6 = 0.5 , то da= 3 и равно n, значит строки линейно-зависимые.
Далее установим значение переменных da и dl на ноль. Чтобы гарантировать нормальную работу алгоритма при следующих итерациях.
Возвратим результат функции. Если значение строковой переменной s1 так и не изменилось, то возвратим матрицу matr, в противном случае выведем сообщение наличии линейной зависимости.
Этап 3. Нахождение максимального элемента в столбце
Для реализации модифицированного метода Гаусса нам понадобиться функция нахождения максимального элемента в столбце и возвращение номера строки этого элемента.
Алгоритм этой функции достаточно прост и не требует подробных объяснений.
Этап 4. Перестановка строк в матрице
После того как найдена строка с максимальным элементом в столбце, возможно, нам понадобиться поменять эти строки местами. Для этого создадим функцию:
Определим переменные: i1будет использоваться в цикле, а temp для временного хранения элементов матрицы. Далее цикл и стандартный алгоритм замены переменных.
Возвратим матрицу matr.
Этап 5. Прямой ход
Все дополнительные функции определены, теперь можно перейти непосредственно к поиску решения. Выполним прямой ход в методе Гаусса:
Определим некоторые переменные: i1будет использоваться в цикле, а s1 для хранения сообщения о том, что система не имеет единственного решения. Создадим главный цикл.
Первым делом найдем строку с максимальным элементом через ранее объявленную функцию maxcol и присвоим это значение переменной max. Чтобы застраховать себя от частного случая, проверим, не является ли максимальный элемент равным нулю, если это так, то система не имеет единственного решения,и выйдем из цикла, используя команду break. В Pascal сразу произведем замену Zamena (i1,MaxCol(i1)) и реализуем алгоритм проверки в теле функции maxcol:
В MathCAD :
Если все в порядке, то поменяем строки местами.
Получим разрешающее уравнение, разделив каждый элемент на первый в строке i1
Получим:
Присвоим единицу коэффициенту при xi1
Умножим разрешающее уравнение i1 на первый коэффициент уравнения j и вычтем полученное из уравнения j.
Присвоим ноль коэффициенту при хj,i1
После выполнения всех итераций матрица примет треугольный вид, теперь не сложно найти корни системы.
Но не забудьте возвратить преобразованную матрицу или, в случае, если система не имеет единственного решения, соответствующее сообщение.
Этап 6. Обратный ход
Теперь не составит труда найти корни уравнения, выполнив обратный ход. Напишем еще одну функцию oh:
Выполним обратный цикл, задав диапазон значений от n до2, где n >= 2.
Тем самым пройдем по строкам в обратном порядке.
Далее, еще один цикл, чтобы пройти по всем элементам строки, от последнего до первого. Последовательно исключив неизвестные переменные, получим в последнем столбце матрицы корни уравнения.