Методы решения СЛАУ. Метод простой итерации. Метод Крамера

Автор: Пользователь скрыл имя, 14 Февраля 2011 в 13:23, курсовая работа

Описание работы

Цель работы – разработка программы, которая методом Крамера и методом простой итерации решает систему линейных уравнений.

Содержание

ВВЕДЕНИЕ 5
1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 7
1.1 ПОСТАНОВКА ЗАДАЧИ 7
1.2 Основные понятия 8
1.3 Метод Крамера 10
1.4 Метод простой итерации 11
2. ПРАКТИЧЕСКАЯ ЧАСТЬ 15
2.1 Обоснование выбора средств разработки 15
2.2. Реализация математической модели в Delphi 16
ЗАКЛЮЧЕНИЕ 17
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 18

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

ОТЧЕТ ПО КУРСОВОЙ1.doc

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

     Преимуществом итерационных методов является удобное применение в современной вычислительной технике, т.к. решения, полученные с помощью прямых методов обычно содержат погрешность. Итерационные методы же позволяют получить решение данной системы с заранее определенной погрешностью. Явным преимуществом является значительное  превосходство над точные методы по скорости и удобнее реализуются на практике. 
 
 

СПИСОК  ИСПОЛЬЗОВАННЫХ  ИСТОЧНИКОВ

  1. Бугров  Я.С. Высшая математика: Учеб. для вузов: в 3 т. – М.: Дрофа, 2004

Т1: Элементы линейной алгебры и аналитической геометрии. – 288 с.: ил.

  1. Гусак А.А. Справочник по высшей математике. – Мн.: Тетрасистемс. 1999. – 640 с.
  2. Лапчик М.П. Численные методы: Учеб. пособие для студ. вузов. – М.: Издательский центр «Академия», 2004. – 384 с.
  3. Наранович О.И., Скобля С.Г. Информатика: методические указания и задания к лабораторным работам для студентов 2-го курса дневной формы обучения специальностей 40 01 02, 36 01 03, 36 01 01. Часть 3. –Барановичи: БарГУ, 2005.
  4. Фаронов В.В. Delphi. Программирование на языке высокого уровня: Учебник для ВУЗов. – СПб.: Питер, 2006. – 640 с.: ил.
  5. Фаронов В.В. Турбо Паскаль 7.0: Практика программирования: Учеб. пособие. – М.: Нолидж, 1997.

ПРИЛОЖЕНИЕ 1

     unit Unit1; 

     interface 

     uses

       Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

       Dialogs, StdCtrls, Grids; 

     type mas= array[1..10,1..10] of real;

       mas1 = array[1..10] of real;

       TForm1 = class(TForm)

         Matr: TStringGrid;

         Svb: TStringGrid;

         Button1: TButton;

         Button2: TButton;

         Button3: TButton;

         Button4: TButton;

         Eps: TEdit;

         Label1: TLabel;

         Razm: TEdit;

         Label2: TLabel;

         Label3: TLabel;

         Label4: TLabel;

         Memo1: TMemo;

         Label5: TLabel;

         procedure FormCreate(Sender: TObject);

         procedure Button4Click(Sender: TObject);

         procedure Button3Click(Sender: TObject);

         procedure Button2Click(Sender: TObject);

         procedure Button1Click(Sender: TObject);

       private

         { Private declarations }

       public

         { Public declarations }

       end;

      const nmax=20;

     var i,j,n:integer;  p,p1:integer;

       d:real;

       mxz:mas1;

       tmp:mas; 

       A: array [1..nmax,1..nmax+1] of real; //расширенная матрица системы

       X: array [1..nmax] of real; // решение системы

       Form1: TForm1; 

     implementation 

     {$R *.dfm} 

     procedure TForm1.FormCreate(Sender: TObject);

     begin

       Memo1.Clear;            // Ввод начальных данных

       Matr.Cells[0,0]:='1,02';

       Matr.Cells[1,0]:= '-0,25';

       Matr.Cells[2,0]:='-0,3';

       Matr.Cells[0,1]:='-0,41';

       Matr.Cells[1,1]:='1,13';

       Matr.Cells[2,1]:='-0,15';

       Matr.Cells[0,2]:='-0,25';

       Matr.Cells[1,2]:=' -0,14';

       Matr.Cells[2,2]:='1,31';

       Svb.Cells[0,0]:='0,515';

       Svb.Cells[0,1]:='1,555';

       Svb.Cells[0,2]:='1,21';

     end; 

     procedure TForm1.Button4Click(Sender: TObject);

     begin

     Application.Terminate;   //выход из приложения

     end; 

     procedure TForm1.Button3Click(Sender: TObject);

     begin

       n:=StrToInt(Razm.Text);  //задаем количество неизвестных

       for i:=0 to n do         //цикл обнуления матрицы

         for j:=0 to n do begin

           Matr.Cells[i,j]:='';

           Svb.Cells[0,j]:='';

         end;

       //задаем размеры матрицы

       Matr.ColCount:=n;

       Matr.RowCount:=n;

       Svb.RowCount:=n;

     end; 

     procedure TForm1.Button2Click(Sender: TObject);

     var x0: array [1..nmax] of real;//начальное приближение

         k: integer;

         p,s,am,bm,t,e:real;

     begin

       e:=StrToFloat(Eps.Text);

       n:=StrToInt(Razm.Text);

       for i:=1 to n do

         for j:=1 to n do

         a[i,j]:=StrToFloat(Matr.Cells[j-1,i-1]);

        for i:=1 to n do

         a[i,n+1]:=Strtofloat(Svb.Cells[0,i-1]);

       //Проверка достаточного условия сходимости: абсолютная сумма недиагональных

       //коэффициентов элементов строки  должна быть меньше модуля  диагональных

       //коэффициентов этой строки

       for i:=1 to n do

         begin

          p:=0;

           for j:=1 to n-1 do //цикл получения суммы модулей недиагональных элементов

             if j<>i then p:=p+abs(a[i, j]);

         if abs(a[i,i])<p then //вывод "Итерационный процесс расходится" и закрытие приложения

           begin

            messageDLG('Итерационный процесс расходится',mtWarning,[mbOk],0);

             Exit;

           end;

         end;

        //приводим систему к нормальному  виду

        for i:=1 to n do

         begin

           for j:=1 to n do

             if j<>i then

               a[i,j]:=-a[i, j]/a[i, i];

           a[i,n+1]:=a[i,n+1]/a[i,i];

           a[i,i]:=0;

         end;

         //вычисление m-нормы матрицы системы уравнений и столбца свободных членов

        for i:=1 to n do

         begin

          s:=0;

           for j:=1 to n do

             s:=s+abs(a[i, j]);

           if i = 1 then

              begin

                am:=s;

                bm:=abs(a[1, n+1]);

              end

           else

             begin

               if s>am then

                  am:=s;

               if abs(a[i,n+1])>bm then

                  bm:=abs(a[i,n+1]);

             end;

         end;

           k:=round((ln(e)+ln(abs(1-am))-ln(bm))/ln(am));

         //устанавливаем начальные приближения равные bi

           x0[i]:=a[i,n+1];

         //цикл вычисления последующих  приближений

           t:=0;

        repeat

         for i:=1 to n do //цикл вычисления нового значения корня xi

          begin

            s:=0;

            for j:=1 to n do

               s:=s+a[i,j]*x0[j];

            x[i]:=a[i,n+1]+s;

          end;

         t:=t+1;

         for i:=1 to n do

           x0[i]:=x[i];

           until t>k;

       // вывод решения

        memo1.lines.Add('Решение методом простой итерации:');

        for i:=1 to n do

          memo1.lines.Add('x'+inttostr(i)+'='+floattostrf(x[i],fffixed,12,7));

          memo1.lines.Add('k='+ inttostr(k));

     end; 
 

     function opr(n:integer; a:mas):real; //функция нахождения  определителя

     var i, j, k: Integer; d: Double;

     const

       E = 0.000001;

     begin

       for i := 1 to Pred(n) do

         begin

           if Abs(a[i, i])<E then

           begin

             Opr := 0.0; Exit

           end;

           for j := Succ(i) to n do

           begin

             d := a[j, i] / a[i, i];

             for k := i to n do

               a[j, k] := a[j, k] - d * a[i, k];

             end;

         end;

       d := 1;

       for i := 1 to n do

         d := d * a[i, i];

       Opr := d;

     end; 

     procedure zamena(q:mas; q1:mas1; n,y:integer); //замена y-ого столбца  столбцом свободных членов

     begin

         for i:=1 to n do

           q[i,y]:=q1[i];

         for i:=1 to n do

           for j:=1 to n do

             tmp[i,j]:=q[i,j];

     end; 
 

     procedure TForm1.Button1Click(Sender: TObject);

     var

       n,i:integer;

       mx,Determ:mas;

       x,deti:array[1..10] of real;

     begin

        //ввод количества неизвестных

       n:=strtoint(razm.text);

       //ввод матрицы

       for i:=1 to n do

         for j:=1 to n do

         mx[i,j]:=StrToFloat(Matr.Cells[j-1,i-1]);

        for i:=1 to n do

         mxz[i]:=Strtofloat(Svb.Cells[0,i-1]);

          //находим определитель

       d:=Opr(n,mx);

       for p1:=1 to n do //находим решение

        begin

         zamena(mx,mxz,n,p1); //заменяем j-ый столбец столбцом свободных членов

         deti[p1]:=Opr(n,tmp); //находим определитель

        end;

          memo1.lines.Add('Решение методом Крамера:');

        for i:=1 to n do  //вывод решения

         begin

           x[i]:= deti[i]/d;

           Memo1.Lines.Add('x'+inttostr(i)+'='+floattostrf((x[i]),fffixed,12,7));

          end;

     end;

     end.

Информация о работе Методы решения СЛАУ. Метод простой итерации. Метод Крамера