Изучение программ решения систем с ленточными матрицами
Курсовая работа, 04 Декабря 2011, автор: пользователь скрыл имя
Описание работы
Электронно-вычислительные машины являются одним из самых мощных факторов развития цивилизации и человечества. Благодаря универсальности, высокому быстродействию, неутомимости в работе, большому объему памяти ЭВМ нашли широкое применение в различных сферах деятельности человека. Применение ЭВМ должно быть не самоцелью, а определяться разумной достаточностью. Тенденция развития экономики приводит к тому, что инженеру - электрику все чаще приходится решать более сложные и трудоемкие задачи. С помощью ЭВМ рассчитываются сложные электрические цепи.
Содержание работы
Введение
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;
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:
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,
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,
writeln('Время начала
работы программы (мин:сек:сот): ',minute0,':',second0,':',
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:
macheps,max,delta:real;
hour,minute,second,sot:word;
hour0,minute0,second0,sot0:
Процедуры и
функции.
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;
var k,l,p,t: integer; v=16
sum: real; v=8
procedure ProcB(n,m1,m2:integer;a,a_l:
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.
Результаты тестирования
программ с заданными
входными данными
- Результат формирования хорошо обусловленной системы при n=7,m1=1,m2=2
- Результат решения системы методом Гаусса без выбора.
3. Вычислительные эксперименты
3.1. Условия эксперимента
В данной курсовой работе был проведен эксперимент по решению СЛУ с ленточной матрицей. Для этого были отлажены 2 процедуры
А) Процедура решения системы , где А – ленточная матрица порядка n с шириной ленты l. Применен метод исключения Гаусса без выбора ведущего элемента и экономная схема размещения в памяти ленточной матрицы.
Б) Аналогичная процедура, которая использует частичный выбор ведущего элемента.
Программа формирует ленточную систему, которая хранится в памяти как система порядка n x m1+m2+1. Столбцы такой матрицы нумеруются от –m1 до m2 (нулевой столбец - диагональный).
Для получения системы линейных уравнений были использованы различные способы:
1) генерация матрицы с помощью датчика случайных чисел Urand (kod), где kod формируется следующим образом: для получения первой хорошо обусловленной системы берут последнюю цифру года и две последние цифры номера зачетной книжки, для второй системы слева добавляют единицу, для третьей системы – две единицы.