Изучение программ решения систем с ленточными матрицами

Автор работы: Пользователь скрыл имя, 04 Декабря 2011 в 08:13, курсовая работа

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

Электронно-вычислительные машины являются одним из самых мощных факторов развития цивилизации и человечества. Благодаря универсальности, высокому быстродействию, неутомимости в работе, большому объему памяти ЭВМ нашли широкое применение в различных сферах деятельности человека. Применение ЭВМ должно быть не самоцелью, а определяться разумной достаточностью. Тенденция развития экономики приводит к тому, что инженеру - электрику все чаще приходится решать более сложные и трудоемкие задачи. С помощью ЭВМ рассчитываются сложные электрические цепи.

Содержание работы

Введение
1. Теоретические аспекты использованных методов
Прямые методы решения систем линейных уравнений
1.2. Используемые алгоритмы в виде псевдопрограмм
1.2.1. Алгоритм А1.5 (BANSOLVE). Драйвер решения СЛУ с ленточной матрицей
1.2.2. Алгоритм А1.5.1 (BANDECOMP). Триангуляция ленточной матрицы
1.2.3 Алгоритм А1.5.2 (BANSLU).
2. Программная реализация
2.1. Тексты программ
2.2. Расчет размера оперативной памяти для размещения переменных
2.3. Инструкция для пользователей
2.4. Результаты тестирования программ с заданными входными данными
3. Вычислительные эксперименты
3.1. Условия эксперимента
3.2. Отчет о результатах. Характеристические профили.
3.2.1 Скорость выполнения программы
3.2.2. Точность вычисления программы
Заключение
Список использованной литературы

Файлы: 1 файл

Курсач.doc

— 232.00 Кб (Скачать файл)

end; 

{Пpоцедуpа генеpации матpицы 7}

procedure Matrix7(var a0: matr0;var b:vect;m1,m2,n:integer);

begin

  clrscr;

{Данный алгоритм  производит формирование матрицы}

for i:=1 to n do begin

for j:=1 to n do begin

  if (j>i+m2) or (i>j+m1) then a0[i,j]:=0

  else begin

      if i=j then a0[i,j]:=0.01/((n-i+1)*(i+1));

      if i<j then a0[i,j]:=0;

      if i>j then a0[i,j]:=i*(n-j);

  end;

  write (a0[i,j]:6:2);

  end;

  writeln;

end; 

{Формирование  вектора b как суммы элементов  по строкам матрицы}

  for i:=1 to n do

    begin

    b[i]:=0;

    for j:=1 to n do

        b[i]:=b[i]+a0[i,j];

    end;

  write ('>...');

  readkey;

end;

procedure ProcA(n,m1,m2:integer;a:matr;b:vect);

var k,l,p,t: integer;

    sum: real;

begin

  for k:=1 to N-1 do begin

  l:=0;

  p:=1;

    for i:=k+1 to k+m1 do begin

  l:=l-1;

    a[i,l]:=a[i,l]/a[k,0]; 

    j:=1-p;

    for t:=1 to m2 do begin

      a[i,j]:=a[i,j]-a[i,l]*a[k,j+p];

      j:=j+1;

    end;

    p:=p+1;

    end;

    end; 
 

  for i:=1 to n do

  y[i]:=b[i]; 

  p:=m1;

  for k:=1 to n do begin

  sum:=0;

  for j:=-m1+p to -1 do

  sum:=sum+a[k,j]*y[k+j];

  p:=p-1;

  if p=-1 then p:=0;

  y[k]:=b[k]-sum

  end; 

  for i:=1 to n do

  x[i]:=y[i]; 

  for k:=n downto 1 do begin

  sum:=0;

  for j:=1 to m2 do

  sum:=sum+a[k,j]*x[k+j];

  x[k]:=(y[k]-sum)/a[k,0]

  end;

end; 

procedure ProcB(n,m1,m2:integer;a,a_l:matr;int:vect0;b:vect);

var retcode: integer;

procedure Bandecomp;

var

      z,p:real;

      i,j,k,l,imax:integer;

begin

l:=m+1;

for i:=1 to m1 do begin

for j:=l-1 to m2 do

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

l:=l-1;

for j:=m2-l to m2 do

a[i,j]:=0;

end; 

l:=m1;

for k:=1 to n do

  begin

    z:=a[k,-m1];

    i:=k;

    if l<k then l:=l+1;

    for j:=k+1 to l do begin

      if abs(a[j,-m1])>abs(z) then begin

        z:=abs(a[j,-m1]);

        i:=j;

      end;

    end;

    int[k]:=i;

    if z<macheps then begin

      retcode:=1;

      exit;

    end;

    if i<>k then

      for j:=-m1 to m2 do begin

        p:=a[k,j];

        a[k,j]:=a[i,j];

        a[i,j]:=p;

      end;

    for i:=k+1 to l do begin

      z:=a[i,-m1]/a[k,-m1];

      a_l[k,i-k]:=z;

      for j:=1-m1 to m2 do

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

      a[i,m1]:=0;

    end;

  end;

end; 

procedure  banslu;

var i,j,k,l: integer;

   p:real;

begin

l:=m1;

for k:=1 to n do begin

  i:=int[k];

  if i<>k then begin

    p:=b[k];

    b[k]:=b[i];

    b[i]:=p;

  end;

  if l<n then l:=l+1;

  for i:=k+1 to l do

  b[i]:=b[i]-a_l[k,i-k]*b[k];

end; 

l:=-m1;

for i:=n downto 1 do begin

    p:=0;

    for k:=1-m1 to m2 do

        p:=p+a[i,k]*b[k+i+m1];

    b[i]:=(b[i]-p)/a[i,-m1];

    if l<m2 then l:=l+1;

    end;

end;

begin

  retcode:=0;

  Bandecomp;

  if retcode=0 then Banslu

  else writeln ('Решение неуспешно!');

end; 

BEGIN 

clrscr;

writeln('1 - хорошо  обусловленная ленточная матрица');

writeln('2 - плохо обусловленная матpица N4');

writeln('3 - плохо обусловленная  матpица N7');

 writeln;

write('? ');read(m); 

  writeln('размер матрицы N - ');

  read(N);

  writeln('m1 (число  строк под диагональю) - ');

  read(m1);

  writeln('m2 (число  строк над диагональю) - ');

  read(m2);

    case m of

      1: GenMatr(a0,b,m1,m2,n);

      2: Matrix4(a0,b,m1,m2,n);

      3: Matrix7(a0,b,m1,m2,n);

    end; 

{Переписываем  матрицу в экономную схему}

writeln ('Экономная  схема размещения матрицы!');

 for i:=1 to n do begin

k:=-m2;

for j:=i-m1 to i+m2 do begin

   if (j<1) or (j>n) then a[i,k]:=0 else a[i,k]:=a0[i,j];

   write (a[i,k]:6:2);

   k:=k+1;

end;

writeln;

end; 

writeln;

retcode:=1; 

writeln('1 - решить  СЛУ методом Гаусса без выбора');

writeln('2 - решить СЛУ методом Гаусса с выбором ведущего элемента');

writeln;

write('? ');read(m);

gettime(hour0,minute0,second0,sot0); 

    case m of

      1: ProcA(n,m1,m2,a,b);

      2: ProcB(n,m1,m2,a,a_l,int,b);

    end; 

  for i:=1 to n do

  writeln ('x',i,'=',x[i]); 

{Погрешность}

    delta:=x[1];

    max:=x[1];

    for i:=2 to n do

      begin

        if max>x[i] then max:=x[i];

        if delta<x[i] then delta:=x[i];

      end;

    writeln('Погрешность - ',abs((delta-max)/max)*100);

{конечное время работы программы}

gettime(hour,minute,second,sot);

writeln('Время начала работы программы (мин:сек:сот): ',minute0,':',second0,':',sot0);

writeln('Конечное время (мин:сек:сот): ',minute,':',second,':',sot);

write ('>...');

 readkey;

END.

 

2.2. Расчет размера оперативной памяти для размещения переменных

 

Переменные основной программы. 

   a,a_l:matr; v=2*8*402=25600

   a0: matr0;  v=8*402=12800

   x,y,b:vect; v=3*40*8=960

   int: vect0; v=40*4=160

   retcode,i,j,k,N,m,m1,m2:integer; v=8*4=32

   macheps,max,delta:real;           v=3*8=24

   hour,minute,second,sot:word;         v=4*2=8

   hour0,minute0,second0,sot0:word;       v=4*2=8 

Процедуры и  функции. 

procedure GenMatr(var a0:matr0;var b:vect;m1,m2,n: integer);  v=12800+320+12=13132

var

  p: real;    v=8

   kod: integer;    v=4

procedure Matrix4(var a0: matr0;var b:vect;m1,m2,n:integer);    v=13132

procedure Matrix7(var a0: matr0;var b:vect;m1,m2,n:integer);    v=13132

procedure ProcA(n,m1,m2:integer;a:matr;b:vect);           v=13132

var k,l,p,t: integer;     v=16

    sum: real;            v=8

procedure ProcB(n,m1,m2:integer;a,a_l:matr;int:vect0;b:vect);   v=12+25600+160+320=26092

var retcode: integer;   v=4

procedure Bandecomp;

var

      z,p:real;   v=16

      i,j,k,l,imax:integer;    v=5*4=20

procedure  banslu;

var i,j,k,l: integer;    v=4*4=16

   p:real;     v=8 
 

Итого объем оперативной памяти  ≈  105192 б 
2.3. Инструкция для пользователей

 

     Программа формирует ленточную матрицу тремя различными способами: формированием хорошо обусловленной матрицы по последним цифрам номера зачетной книжки, формированием плохо обусловленной матрицы №4 и №7. После запуска программа спрашивает, каким способом создавать матрицу:

     1 – хорошо обусловленная матрица

     2 – плохо обусловленная матрица  №4

     3 - плохо обусловленная матрица №7

     ?_

     Затем задается порядок матрицы N, m1 – число диагоналей с ненулевыми элементами, расположенных под диагональю, m2 – число диагоналей с ненулевыми элементами, расположенных над диагональю, и, если нужно, код.

     Заданная  квадратная матрица преобразуется в экономную форму размещения матрицы от –m1 до m2 и выводится на экран.

     Затем  созданная ленточная система линейных уравнений решается  методом Гаусса 2 способами: без выбора ведущего элемента и с частичным выбором ведущего элемента.

     1 – решить СЛУ методом Гаусса  без выбора

      2 – решить СЛУ методом Гаусса  с выбором ведущего элемента

      ?_

Затем реализуется выбранный алгоритм Гаусса и, в случае удачного решения (retcode=1), выводится значение машинного нуля, вектор ответов, время начала работы алгоритма, время окончания работы и величина погрешности. 
2.4. Результаты тестирования программ с заданными входными данными

 
  1. Результат формирования хорошо обусловленной системы при n=7,m1=1,m2=2
 

     

  1. Результат решения системы методом Гаусса без выбора.
 

     
     

 

3. Вычислительные  эксперименты

3.1. Условия эксперимента

     В данной курсовой работе был проведен эксперимент по решению СЛУ с ленточной матрицей. Для этого были отлажены 2 процедуры

А) Процедура  решения системы  , где А – ленточная матрица порядка n с шириной ленты l. Применен метод исключения Гаусса без выбора ведущего элемента и экономная схема размещения в памяти ленточной матрицы.

Б) Аналогичная  процедура, которая использует частичный  выбор ведущего элемента.

     Программа формирует ленточную систему, которая хранится в памяти как система порядка n x m1+m2+1. Столбцы такой матрицы нумеруются от –m1 до m2 (нулевой столбец - диагональный).

     Для получения системы линейных уравнений были использованы различные способы:

1) генерация матрицы с помощью датчика случайных чисел Urand (kod), где kod формируется следующим образом: для получения первой хорошо обусловленной системы берут последнюю цифру года и две последние цифры номера зачетной книжки, для второй системы слева добавляют единицу, для третьей системы – две единицы.

Информация о работе Изучение программ решения систем с ленточными матрицами