Автор: Пользователь скрыл имя, 29 Октября 2011 в 22:23, курсовая работа
Цель курсовой работы: освоить метод Гаусса для решения систем линейных алгебраических уравнений, и научится составлять алгоритмы решения систем линейных алгебраических уравнений
Введение……………………………………………………………………….. 4
1.Теоретическая часть………………………………………………………. 5
1.1. Основные определения…………………………………………………. 5
1.2. Действия над матрицами………………………………………………. 6
1.2.1. Сумма и разность матриц……………………………………………. 6
1.2.2. Умножение матриц…………………………………………………….. 6
1.3. Абсолютная величина и норма матрицы………………………………8
1.4. Метод Гаусса…………………………………………………………….... 9
1.4.1. Схема единственного деления………………………………………... 9
1.4.2. Схема частичного выбора……………………………………………. 11
1.4.3. Схема полного выбора…………………………………………………11
1.5. Метод Гаусса-Зейделя……………………………………………………12
1.5.1. Приведение системы к виду, удобному для итераций……………. 12
1.5.2. Описание метода………………………………………………………. 13
1.6. Сравнение прямых и итерационных методов………………………. 14
2. Практическая часть………………………………………………………. 15
2.1. Программа решения систем линейных уравнений по методу Гаусса
2.1.1 Постановка задачи…………………………………………………….. 15
2.1.2. Текстовый пример……………………………………………………. 15
2.1.3. Описание алгоритма…………………………………………………. 15
2.1.4.Листинг программы и результаты работы………………………... 16
Заключение…………………………………………………………………... 32
Список используемой литературы………………………………………... 33
aN1 aN2 aN3 ... aNN bN
Например:
2 -3 1 5
-1 -1 2 0
1 2 -1 3
Этот файл необходимо
создать в той директории, где
лежит программа, иначе она его
не найдет. В результате работы программы,
она выдаст результат, нечто вроде:
X0 = 3.000000
X1 = 1.000000
X2 = 2.000000
Это и есть решение
системы уравнений, т.е. набор неизвестных
Х.
Коротко опишем, для чего служит такое большое количество подпрограмм в данной программе:
void count_num_lines() - подсчитывает
количество уравнений в
void allocmatrix() - выделяет память для массивов для хранения коэффициентов уравнений, свободных членов и решения
void readmatrix() - прочитывает
из файла коэффициенты и
void printmatrix() - распечатывает систему уравнений
void diagonal() - делает так, чтобы на главной диагонали не было нулей, чтобы не пришлось однажды делить на ноль в процессе приведения матрицы к треугольному виду
void testsolve() - подставляет
решение в систему и
void printresult() - распечатывает получившийся столбец решений
void freematrix() - освобождает память, которая была выделена ранее
void cls() - стирает
экран в начале работы
void main() - основная
функция из которой
Пример№5:
Реализация
метода на языке Паскаль
Потребуется описание
используемых типов:
type mat=array[1..21,1..20] of real; {для расширенной матрицы коэффициентов}
vec=array[1..20] of real; {для вектора значений переменных }
Var n:integer; {Реальное число уравнений}
a: mat; x: vec;
Ввод матрицы
наиболее эффективно реализовать из
файла данных. Для этого потребуется
файловый тип и файловая переменная:
Var f:text;
В основной части
программы ввод можно организовать
следующим образом:
Write('Введите число уравнений N = '); readln(n);
assign(f,'alex.dat'); { alex.dat - имя файла данных на диска }
reset(f);
for i:=1 to n do begin
for j:=1 to n+1 do
read(f,a[i,j]);readln(f);end;
close(f);
Прямой ход
метода Гаусса (формирование треугольной
матрицы коэффициентов) может выглядеть
так:
for k:=1 to n do
begin
s:=a[k,k];j:=k;
for i:=k+1 to n do
begin
r:=a[i,k];
if abs(r)>abs(s) then begin s:=r; j:=i; end;
end;
if s=0 then
begin
writeln('Переставьте уравнения чтобы на главной диагонали не было нулевых коэффициентов !'); halt;
end;
if j<>k then
for i:=k to n+1 do
begin
r:=a[k,i]; a[k,i]:=a[j,i];a[j,i]:=r;
end;
for j:=k to n+1 do a[k,j]:=a[k,j]/s;
for i:=k+1 to n do
begin
r:=a[i,k];
for j:=k to n1 do a[i,j]:=a[i,j]-a[k,j]*r;
end;
end;
Обратный ход
метода Гаусса (вычисление вектора значений
переменных) может выглядеть так:
if s<>0 then
for i:=n downto 1 do
begin s:=a[i,n+1];
for j:=i+1 to n do s:=s-a[i,j]*x[j];
x[i]:=s;
end;
Остаётся только
вывести результат и сделать
проверку.
procedure mGaussa_ypak(a:mas1;b:mas2;n,
var
i,j,k,k2,k1:integer;
sum,r,t:real;
a1:array[1..nmax] of real;
begin
//прямой ход
for k:=1 to n-1 do
begin
r:=a[k,1];
for j:=1 to m do
begin
a1[j]:=a[k,j];
a[k,j]:=a[k,j]/r;
end;
b[k]:=b[k]/r;
{ if (m+k-1>n)then
k1:=m+k-1
else k1:=0;}
k1:=1;
k2:=0;
for i:=k+1 to m+k-1 do
begin
k2:=k2+1;
t:= a1[i-k+1];
for j:=1 to m-k1 do
a[i,j]:=a[i,j]-a[k,j+k2]*t;
b[i]:=b[i]-b[k]*t;
k1:=k1+1;
end;
end;
//обратный ход
k:=2;
x[n]:=b[n];
for i:=n-1 downto n-m+2 do
begin
sum:=0;
for j:=2 to k do
sum:=sum+a[i,j]*x[i+j-1];
x[i]:=b[i]-sum;
k:=k+1;
end;
for i:=n-m+1 downto 1 do
begin
sum:=0;
for j:=2 to m do
sum:=sum+a[i,j]*x[i+j-1];
x[i]:=b[i]-sum;
end;
end;
Заключение:
Основной задачей моей курсовой работы было изучение метода Гаусса решения систем линейных алгебраических уравнений. Мною были разобраны понятия матричной алгебры (матрица, действия над матрицами, абсолютная величина и норма матрицы) и изучен метод Гаусса. Также были разобраны алгоритмы решения СЛАУ и их реализация на Delphi, Паскале, VBA,СИ.
Вычисления
с помощью метода Гаусса заключаются
в последовательном исключении неизвестных
из системы для преобразования ее к эквивалентной
системе с верхней треугольной матрицей.
Вычисления значений неизвестных производят
на этапе обратного хода.
Список используемой литературы:
1. Мудров А.Е. Численные методы для ПЭВМ на языках Бейсик, Фортран, Паскаль. -Томск: МП “РАСКО”,1991.-227 с.
2. Офицеров Д. В., Старых В. А. Программирование в интерактивной среде Турбо-Паскаль: Справ. пособие. -Мн.: Беларусь, 1992. - 240 с.: ил.
3. Н.В. Копченова, И.А. Марон Вычислительная математика в примерах и задачах. “Наука” 1972
4. Фадеев Д.К. Вычислительные методы линейной алгебры. 1960.-736 с.
5. Крылов В.И. Вычислительные методы. 1976.-304 с.
6.
Самарский А.А. Численные
7.
Кураш А.Г. Курс высшей
Информация о работе Решение систем линейных алгебраических уравнений методом Гаусса