Автор работы: Пользователь скрыл имя, 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. Точность вычисления программы
Заключение
Список использованной литературы
Выходные параметры: A_LÎRn,m1- массив, содержащий нижнюю треугольную матрицу, полученную при разложении матрицы А; intÎZn – целочисленный массив, содержащий информацию о перестановке строк, выполненных при приведении матрицы А к треугольной форме.
Код возврата: retcode=0 при успешном решении и retcode = 1 в противном случае.
Описание: Алгоритм реализует разложение матрицы с частичным выбором ведущего элемента с учетом ленточности матрицы. Для общности будем предполагать, что рассматриваемая ленточная матрица несимметрична, т.е. ненулевыми являются только элемента, для которых j>i+m2 и i>j+m1. Специальный алгоритм для обработки таких матриц состоит из N-1 основных шагов. На текущем k-ом шаге алгоритма исключаются поддиагональные элементы k-столбца. На текущем шаге алгоритма, кроме m1 последних шагов, исключается m1 ненулевых поддиагональных элементов. Текущий k-ый шаг алгоритма включает в себя следующие операции:
;
M[i,k]=A[i,k]/A[k,k],|M[i,k]|<
после чего из каждой строки с номером , где 1=min(n,k+mi), вычитается k-я строка, умноженная на коэффициент M[i,k].
Необходимая экономия памяти при размещении ленточных матриц достигается с помощью следующего приема.
Память: В алгоритме матрица А представлена в виде массива А размера n x (m1+m2+1). При такой форме записи не удается использовать свойства симметрии, если матрица А ими обладает. Для удобства столбцы нового массива нумеруются от -m1 до m2, причем диагональные элементы исходной матрицы А расположены в столбце с номером 0. Расположение элементов в массиве А для случая n=7, m1=2, m2=1 показано ниже.
Заметим, что в первую, вторую и последнюю строки массива А требуется ввести нулевые элементы.
В процессе разложения матрицы массив А перестраивается таким образом, чтобы элементы, участвующие в текущем преобразовании, образовывали столбец. Соответствующее расположение элементов в массиве А непосредственно перед исключением переменных х1 и х2 показано ниже.
Строки, участвующие в текущем преобразовании, выделены прямоугольником. Изменение массива А производится на всех шагах, за исключением первого.
Алгоритм:
{Алг. А1.5.1}
CALL BANSLU(n,m1,m2,A,A_L,int,b) {Алг. А1.5.2}
{RETURN для алг. A1.5)
{END для Алг. A1.5)
1.2.2. Алгоритм А1.5.1 (BANDECOMP). Триангуляция ленточной матрицы
Назначение: Находит разложение ленточной матрицы в виде произведения нижней L и верхней U треугольных матриц.
Входные параметры: nÎZ, m1ÎZ, m2ÎZ, machepsÎR.
bÎRn , L и U в массиве АÎRn,n; intÎZn, A0ÎRn.
Входно-выходные параметры: АÎRn,m1+m2+1 – массив, состоящий из элементов ленточной матрицы (после разложения содержит нижний треугольный сомножитель L).
Выходные параметры: АÎRn,m1 – массив, содержащий нижнюю треугольную матрицу L, полученную при разложении матрицы А; intÎZn – целочисленный массив, содержащий информацию о перестановке строк, выполненных при приведении матрицы А к треугольной форме.
Код возврата: : retcode=0 при успешном решении и retcode = 1 – если матрица вырождена.
Память: Исходная ленточная матрица А порядка n записана в виде массива A[1..n,-m1..m2] размера n x (m1+m2+1). Полученная из нее матрица разлагается на произведение нижней и верхней треугольных матриц с использованием перестановки строк. Ненулевые элементы нижней треугольной матрицы хранятся в массиве A_L[1..n,1..m1], а ненулевые элементы верхней треугольной матрицы записываются в массив А. Массив Int[1..n] содержит информацию о перестановках строк при разложении матрицы А.
Алгоритм:
{подготовка к первому шагу}
1.l <=m+1
2. FOR i=1 TO m1 DO
2.1 FOR j=l-1 TO m2 DO
A[i,j-1]<=A[i,j]
2.2. l <= l-1
2.3. FOR j=m2-l TO m2 DO
A[i,j]<=0
{Гауссово исключение с частичным выбором ведущего элемента}
3. l<=m1
FOR k=1 TO n DO
4.1 x<=A[k,-m1]
4.2 i<=k
4.3 IF l<k THEN
l<=l+1
4.4 FOR j=k+1 TO l DO
4.4.1 IF |A[j,-m1]|>|x| THEN
4.4.1.1 x<=|A[j,-m1]|
4.4.1.2 i<=j
4.5 int[k]<=i
{проверка на вырожденность}
4.6 IF x<macheps THEN
4.6.1 retcode<=1
4.6.2 RETURN
4.7 IF i<>k THEN
{перестановка строк i и k}
4.7.1 FOR j=-m1 TO m2 DO
переставить местами A[k,j] и A[i,j]
4.8 FOR i=k+1 TO l DO
4.8.1 x<=A[i,-m1]/A[k,-m1]
4.8.2 A_L[k,i-k]<=x
4.8.3 FOR j=1-m1 TO m2 DO
A[i,j-1]<=A[i,j]-x*A[k,
4.8.4 A[i,m1]<=0
{RETURN для Алг. A1.5.1}
{END для Алг. A1.5.1}
1.2.3 Алгоритм А1.5.2 (BANSLU).
Решение СЛУ Ax=b относительно х с ранее триангулированной ленточной матрицы A=LU
Назначение: Ищется решение СЛУ Ax=b, где матрица предварительно разложена на треугольные с помощью алгоритма А1.5.1.
Входные параметры: nÎZ, m1ÎZ, m2ÎZ, АÎRn,m1+m2+1 – массив, содержащий верхнюю треугольную матрицу U разложения для исходной матрицы А; A_L ÎRn,m1 – массив, содержащий нижнюю треугольную матрицу L, полученную при разложении матрицы А; intÎZn.
Входно-выходные параметры: вектор правых частей bÎRn (после прямой и обратной подстановок содержит решение исходной системы).
Алгоритм:
1. i<=m1
{прямая подстановка}
2. FOR k=1 TO n DO
2.1 i<=int[k]
2.2 IF i<>k THEN
l<=l+1
2.4 FOR i=k+1 TO l DO
b[i]<=b[i]-A_L[k,i-k]*b[
{RETURN для Алг. A1.5.2}
{END для Алг. A1.5.2}
program Kraut;
uses crt,dos;
const nn=40;
mm1=20;
mm2=20;
type
matr=array[1..nn,-mm1..mm2] of real;
matr0=array[1..nn,1..nn] of real;
vect=array[1..nn] of real;
vect0=array[1..nn] of integer;
var
a,a_l:matr;
a0: matr0;
x,y,b:vect;
int: vect0;
retcode,i,j,k,N,m,m1,m2:
macheps,max,delta:real;
hour,minute,second,sot:word;
hour0,minute0,second0,sot0:
{пpоцедуpа генеpации матpицы}
procedure GenMatr(var a0:matr0;var b:vect;m1,m2,n: integer);
var
p: real;
kod: integer;
function Urand (kod: integer):real;
label 10,20,99;
const itwo=2;
ia:integer=0;
ic:integer=0;
mic:integer=0;
iy:integer=0;
m2:integer=0;
s:real=0;
var
m:integer;
halfm:real;
begin
if kod<0 then begin
m2:=0;
goto 99;
end;
if m2<>0 then goto 20;
m:=1;
iy:=kod;
10:m2:=m;
m:=itwo*m2;
if m>m2 then goto 10;
halfm:=m2;
ia:=trunc (halfm*arctan(1.0)/8.0)+5;
ic:=trunc (halfm*(0.5-sqrt(3.0)/6.0)+1);
mic:=(m2-ic)+m2;
s:=0.5/halfm;
20:iy:=iy*ia;
if iy>mic then iy:=(iy-m2)-m2;
iy:=iy+ic;
if iy/2>m2 then iy:=(iy-m2)-m2;
if iy=0 then iy:=(iy+m2)+m2;
99: urand:=iy*s;
end;
begin
write ('Код генерации матрицы - ');
readln (kod);
p:=urand(-1);
{фоpмиpование матpицы A}
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 a0[i,j]:=urand(kod);
write (a0[i,j]:6:2);
end;
writeln;
end;
{фоpмиpование вектоpа 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;
{Пpоцедуpа генеpации матpицы 4}
procedure Matrix4(var a0: matr0;var b:vect;m1,m2,n:integer);
var alfa: real;
begin
clrscr;
alfa:=5;
{Данный алгоритм
производит формирование
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 if i=j then a0[i,j]:=alfa
else a0[i,j]:=1;
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;
Информация о работе Изучение программ решения систем с ленточными матрицами