- •Учебное пособие
- •Введение
- •Глава 1. Прикладные математические задачи
- •1.1. Вычисление математических функций
- •1.2. Создание программного модуля, объединяющего математические функции
- •1.3. Решение системы линейных алгебраических уравнений
- •1.4. Построение таблицы функции
- •Глава 2. Задачи вычислительной математики
- •2.1. Решение нелинейного уравнения
- •2.2. Численное дифференцирование
- •2.3. Численное интегрирование
- •2.4. Решение дифференциального уравнения
- •2.5. Аппроксимация функции
- •2.6. Интерполяция функции
- •Глава 3. Задачи математической статистики
- •3.1. Вычисление основных статистических величин
- •3.2. Создание программного статистического модуля
- •4. Построение графиков функций и создание диаграмм
- •4.1. Инициализация графического режима
- •4.2. Использование графических примитивов
- •4.3. Создание двумерной диаграммы
- •4.4. Построение графика функции
- •4.5. Создание трехмерной диаграммы
- •Библиографический список
выводится на экран компьютера. Рабочий экран программы с исходными данными и результатом ее работы показан на рис.1.3.
Рис.1.3. Программа abc: ввод исходных данных и результат работы
Простота и компактность приведенной выше программы обеспечивается за счет использования в ней возможностей созданного модуля math3. Обращаться к этому модулю можно и из других программ,
созданных в системе Turbo Pascal.
1.3. Решение системы линейных алгебраических уравнений
Системой линейных уравнений называется набор уравнений следующего вида:
a11 x1 + a12 x2 + ... + a1n xn = b1 |
|
|
a21 x2 + a22 x2 + ... + a2n xn = b2 |
|
|
.............................................. |
(1.3) |
|
an1 x1 + an2 x2 + + ann xn = bn |
||
|
Одним из наиболее распространенных способов решения систем линейных уравнений является метод исключения переменных, называемый также методом Гаусса. Рассмотрим его на примере системы из 3 уравнений с 3 неизвестными.
19
a11 x1 a21 x1 a31 x1
+a12 x2
+a22 x2
+a32 x2
+a13 x3
+a23 x3
+a33 x3
= b1
= b2 (1.4)
= b3
Для решения данной системы в начале делим первое уравнение на
коэффициент a11 . В результате |
|
преобразуем первое уравнение к |
|||||||||
следующему виду: |
|
|
|
|
|
|
|
||||
x1 +a12(1) x2 +a13(1) x3 = b1(1) , |
|
|
|
|
|
|
(1.5) |
||||
|
|
a12 |
|
|
a13 |
|
(1) |
|
b1 |
|
|
|
|
|
|
|
b1 |
= |
|
, |
|||
где |
a12(1) = |
, a13(1) |
= |
, |
a11 |
||||||
|
a11 |
|
|
||||||||
|
|
a11 |
|
|
|
|
|
|
|||
затем из левой и правой частей второго уравнения системы вычитаем соответственно левую и правую части первого уравнения, умноженные на
коэффициент a21 . В результате второе уравнение системы преобразуется к следующему виду:
a22(1) x2 + a23(1) x3 = b2(1) , |
(1.6) |
где a22(1) = a22 − a12(1) a21 , a23(1) = a23 − a13(1) a21 , |
b2(1) = b2 − b1(1) a21 , |
то есть из второго уравнения исключается первое неизвестное. Аналогичным образом поступаем с третьим уравнением системы, то
есть из обеих частей этого уравнения вычитаем соответствующие части первого уравнения, умноженные на коэффициент a31. Таким образом, из
третьего уравнения также исключается неизвестное x1. Третье уравнение преобразуется к виду:
a(1) x |
2 |
+ a(1) x |
3 |
= b(1) |
, |
(1.7) |
32 |
33 |
3 |
||||
где a32(1) = a32 |
− a12(1) a31 , |
a33(1) |
= a33 − a13(1) a31 , |
b3(1) = b1(1) a31 , |
||
Затем второе уравнение системы делится на коэффициент a22(1) . Тогда второе уравнение можно привести к следующему виду:
x |
|
+ a(2) x |
|
= b( |
2) |
, |
|
(1.8) |
|
|
2 |
|
23 |
3 |
2 |
|
b(1) |
|
|
где a23(2) |
= |
a(1) |
|
b2(2) |
|
, |
|||
23 |
, |
= |
2 |
||||||
|
|
|
a22(1) |
|
|
|
|
a22(1) |
|
Теперь из обеих частей третьего уравнения вычитаем соответствующие части второго уравнения, умноженные на коэффициент, находящийся в
20
третьем уравнении при |
x2 , то есть на a32(1) . Результатом данного вычитания |
|||||
будет следующее равенство: |
|
|
||||
a(2) x |
|
= b(2) |
, |
|
(1.9) |
|
33 |
|
3 |
3 |
|
||
где a33(2) = a33(1) |
− a23(2) a32(1) , |
b3(2) = b3(1) |
− b2(1) a32(1) . |
|||
Разделив |
обе части |
равенства |
на коэффициент a33(2) , получаем |
|||
следующее соотношение:
b(2)
x3 = b3(3) , где b3(3) = a3(2) . Таким образом, мы нашли одно из неизвестных
33
системы уравнений. Последовательность действий, приведшая к нахождению данного неизвестного, называется прямым ходом решения системы линейных уравнений методом Гаусса.
Для нахождения оставшихся неизвестных в системе уравнений требуется исключить из предыдущих уравнений в начале неизвестную x3, а
затем x2. Последовательность действий, требуемая для их исключения, называется обратным ходом решения системы уравнений методом Гаусса. В
нашем примере для того, чтобы исключить из второго уравнения x3,
необходимо умножить обе части третьего уравнения на коэффициент при x3 во втором уравнении и вычесть получившиеся величины из обеих частей
второго уравнения. Тогда во втором уравнении останется только x2, что позволит без труда определить ее величину. Затем останется умножить обе
части второго уравнения на коэффициент при x2 в первом уравнении и вычесть второе уравнение из первого. Таким образом, мы найдем последнюю
неизвестную величину x1.
Описанный выше метод решения может быть применен для решения
любой линейной системы n уравнений с n неизвестными за исключением того варианта, при котором в каком-либо из уравнений все коэффициенты при неизвестных равны нулю, а свободный член в этом уравнении не равен нулю (в этом случае уравнение вообще не имеет решения). Однако метод Гаусса в некоторых случаях дает значительную погрешность при вычислении неизвестных, поэтому был разработан ряд модификаций данного метода, наиболее распространенной из которых является метод Гаусса с выбором главного элемента в столбце.
Суть этого метода сводится к следующему: в начале вычислений при
прямом ходе среди коэффициентов при неизвестной x1 находится максимальный по модулю. Если этот коэффициент находится не в первом
уравнении (первой строке системы), а в какой-либо k-й строке, то в системе
21
уравнений первая и k-я строка меняются местами. Далее вычисления производятся по описанной выше схеме.
Затем на следующем этапе вычислений находят максимальный
коэффициент при неизвестной x2, причем поиск ведем, только начиная со второй строки системы уравнений. Та строка системы, в которой найден максимальный коэффициент, меняется местами со второй, и так далее вплоть до завершения прямого хода метода Гаусса.
Ниже приводится текст программы, которая решает систему из трех уравнений с тремя неизвестными методом Гаусса с выбором главного элемента в столбце.
program metgauss; Uses Crt;
var i,j,k,nom:integer; max,t,u:real; a:array[1..3,1..3] of real; b:array[1..3] of real;
beginr:array[1..3] of real;
ClrScr;
writeln('Программа решения системы из трех уравнений с тремя неизвестными');
for i:=1 to 3 do {начало ввода коэффициентов уравнений}
begin
writeln('Введите коэффициенты при неизвестных для ',i,' уравнения');
writeln('Введите коэффициент при x1'); readln(a[i,1]);
writeln('Введите коэффициент при x2'); readln(a[i,2]);
writeln('Введите коэффициент при x3'); readln(a[i,3]);
writeln('Введите свободный член уравнения'); readln(b[i]);
ClrScr;
end; {окончание ввода коэффициентов уравнений} {начало вывода системы уравнений}
writeln('Система из трех уравнений с тремя неизвестными');
writeln;
for i:=1 to 3 do begin
for j:=1 to 3 do
22
begin
if j=1 then write(a[i,j]:1:0,'*x',j); if (j=2) or (j=3) then
if a[i,j]>=0
write('+',a[i,j]:1:0,'*x',j)
then
end;
else write(a[i,j]:1:0,'*x',j)
writeln('=',b[i]:1:0)
end;{окончание вывода системы уравнений} writeln;
writeln('Для получения решения нажмите Enter'); readln;
for k:=1 to 3 do {начало прямого хода} begin
max:=abs(a[k,k]);
nom:=k;
for i:=k+1 to 3 do begin
if abs(a[i,k])>max then begin
max:=a[i,k];
nom:=i
end;
end;
if nom<>k then begin t:=b[k]; b[k]:=b[nom];
b[nom]:=t;
for j:= 1 to 3 do begin t:=a[k,j];
a[k,j]:=a[nom,j];
a[nom,j]:=t
end;
end;
t:=a[k,k];
b[k]:=b[k]/t;
for j:=k+1 to 3 do a[k,j]:=a[k,j]/t; for i:=k+1 to 3 do
begin t:=a[i,k];
for j:=k+1 to 3 do
23
a[i,j]:=a[i,j]-t*a[k,j]; |
|
b[i]:=b[i]-t*b[k] |
|
end; |
|
end; {окончание прямого хода} |
|
for i:=3 downto 1 do {начало обратного |
|
хода} |
|
begin |
|
u:=b[i]; |
|
for j:=3 downto 2 do |
|
u:=u-a[i,j]*r[j]; |
|
r[i]:=u; |
|
end; {окончание обратного хода} |
|
for i:=1 to 3 do |
{вывод результатов} |
writeln('x',i,' |
=',r[i]:5:2); {решения системы |
уравнений} |
|
readln |
|
end. |
|
Программа решения уравнения методом Гаусса с выбором главного элемента в столбце состоит из следующих блоков: ввод исходных данных, вывод промежуточных результатов – системы уравнений, записанных в стандартном виде, прямой ход решения системы уравнений, обратный ход решения системы уравнений и вывод конечных результатов.
Ввод исходных данных производится в цикле с заранее заданным числом повторений, которое в данном случае равно трем. В теле цикла производится построчный ввод коэффициентов. Коэффициенты при неизвестных вводятся в двумерный массив a, размерность которого
составляет 3*3. Каждая строка массива a содержит коэффициенты при
неизвестных для одного из уравнений. Свободные члены уравнений вводятся в одномерный массив b, состоящий из трех элементов. После ввода
коэффициентов для каждого уравнения производится очистка экрана.
Затем для контроля правильности ввода исходных данных и для большей наглядности программы производится вывод системы уравнений в стандартном виде. Этот вывод осуществляется посредством двух вложенных циклов. Наружный цикл задает количество выводимых строк, а непосредственный вывод строки производится во внутреннем цикле. Во внутреннем цикле содержатся два условных оператора, которые определяют внешний вид выводимых коэффициентов. Если коэффициент является первым по счету в строке, то данный коэффициент выводится в обычном виде, то есть если он положительный или равен нулю, то знак перед ним не выводится, а для отрицательного коэффициента по умолчанию выводится минус. Если же коэффициент является в строке вторым или третьим по счету, то для положительного коэффициента выводится знак плюс, а для отрицательного, как и в предыдущем случае минус. Затем выводится свободный член уравнения, перед которым ставится знак равенства.
24
Вычисления, производимые при прямом ходе метода Гаусса, также производятся с помощью системы циклов, но эта циклическая структура сложней, чем в предыдущем блоке, так как наружный цикл содержит не один, а несколько вложенных циклов, причем часть этих вложенных циклов также имеет свои вложенные в них циклы.
Первый из вложенных циклов, содержащихся в теле наружного цикла, определяет максимальный элемент в k-м столбце. Для этого первый по счету
элемент для первого столбца (или второй элемент для второго столбца и т. д.) считается максимальным, то есть переменной max присваивается значение
элемента массива a(k,k), и затем это значение поочередно сравнивается со всеми последующими элементами, находящимися в k-м столбце. Если
какой-либо из этих элементов оказывается больше текущего значения переменной max, то переменной max присваивается новое значение, равное
значению этого элемента, а переменной nom присваивается новое значение,
которое равно номеру строки, содержащей данный элемент.
Следующим этапом прямого хода является обмен строки, содержащей максимальный элемент, с k-й строкой системы уравнений. Для этого
предварительно производится сравнение номера строки, содержащей максимальный элемент nom, с номером строки k. Если эти номера не
совпадают, то выполняется группа операторов, которая производит процедуру обмена строк. Первым в этой последовательности операторов производится обмен значениями свободных членов соответствующих уравнений. Для такого обмена используется вспомогательная переменная t.
В начале процедуры обмена этой переменной присваивается значение свободного члена k-й строки. Затем свободному члену k-й строки
присваивается значение свободного члена строки с номером nom. Наконец
свободному члену строки nom присваивается старое значение свободного члена k-й строки, которое сохранилось в переменной t. Аналогичным
образом с помощью вспомогательной переменной производится и обмен коэффициентами при неизвестных, только этот процесс осуществляется в цикле, число повторений которого равно числу этих коэффициентов в одной строке, то есть в данном случае — трем.
Дальнейшая последовательность действий при прямом ходе заключается в делении всех коэффициентов и свободного члена k-го
уравнения на k-й коэффициент и преобразовании с помощью k-го уравнения
остальных уравнений системы. Эти действия также производятся с помощью циклических структур. Циклические структуры используются и при вычислении значений неизвестных при обратном ходе, только здесь применяется другая разновидность цикла – с убывающим значением переменной цикла. Вычисленные значения неизвестных присваиваются элементам одномерного массива r – массива результатов.
В последнем блоке программы осуществляется вывод значений неизвестных, содержащихся в массиве r.
25
