Решение систем линейных алгебраических уравнений методом Гаусса

Автор: Пользователь скрыл имя, 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

Работа содержит 1 файл

курсовая 2 курс.doc

— 238.50 Кб (Скачать)

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; 

Остаётся только вывести результат и сделать  проверку. 
 
 

Пример № 6: .  Процедура решения СЛАУ с симметричной ленточной матрицей, упакованной в прямоугольник

 

procedure mGaussa_ypak(a:mas1;b:mas2;n,m:integer;var x:mas2);

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. Самарский А.А. Численные методы. 1989.-432 с.

      7. Кураш А.Г. Курс высшей алгебры. 1975.-431 с. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Информация о работе Решение систем линейных алгебраических уравнений методом Гаусса