Автор работы: Пользователь скрыл имя, 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. Точность вычисления программы
Заключение
Список использованной литературы
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.
Переменные основной
программы.
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
Программа формирует ленточную матрицу тремя различными способами: формированием хорошо обусловленной матрицы по последним цифрам номера зачетной книжки, формированием плохо обусловленной матрицы №4 и №7. После запуска программа спрашивает, каким способом создавать матрицу:
1 – хорошо обусловленная матрица
2 – плохо обусловленная матрица №4
3 - плохо обусловленная матрица №7
?_
Затем задается порядок матрицы N, m1 – число диагоналей с ненулевыми элементами, расположенных под диагональю, m2 – число диагоналей с ненулевыми элементами, расположенных над диагональю, и, если нужно, код.
Заданная квадратная матрица преобразуется в экономную форму размещения матрицы от –m1 до m2 и выводится на экран.
Затем созданная ленточная система линейных уравнений решается методом Гаусса 2 способами: без выбора ведущего элемента и с частичным выбором ведущего элемента.
2 – решить СЛУ методом Гаусса с выбором ведущего элемента
?_
В данной курсовой работе был проведен эксперимент по решению СЛУ с ленточной матрицей. Для этого были отлажены 2 процедуры
А) Процедура решения системы , где А – ленточная матрица порядка n с шириной ленты l. Применен метод исключения Гаусса без выбора ведущего элемента и экономная схема размещения в памяти ленточной матрицы.
Б) Аналогичная процедура, которая использует частичный выбор ведущего элемента.
Программа формирует ленточную систему, которая хранится в памяти как система порядка n x m1+m2+1. Столбцы такой матрицы нумеруются от –m1 до m2 (нулевой столбец - диагональный).
Для получения системы линейных уравнений были использованы различные способы:
1) генерация матрицы с помощью датчика случайных чисел Urand (kod), где kod формируется следующим образом: для получения первой хорошо обусловленной системы берут последнюю цифру года и две последние цифры номера зачетной книжки, для второй системы слева добавляют единицу, для третьей системы – две единицы.
Информация о работе Изучение программ решения систем с ленточными матрицами