Текст подпрограммы и версий
asb1r_p.zip , asb1e_p.zip
Тексты тестовых примеров
tasb1r_p.zip , tasb1e_p.zip

Подпрограмма:  ASB1R (модуль ASB1R_p)

Назначение

Решение системы линейных алгебраических уравнений с ленточной матрицей, заданной в компактной форме, c выбором ведущего элемента по столбцу.

Математическое описание

Подпрограмма ASB1R вычисляет решение системы N линейных алгебраических уравнений А*x = b, где А - ленточная матрица, заданная в компактной форме, b - вектор правой части. Решение вычисляется с выбором главного элемента по столбцу.

Дж.Х.Уилкинсон, Алгебраическая проблема собственных значений, "Наука", М., 1970.

Использование

procedure ASB1R(var A :Array of Real; var B :Array of Real;
                var X :Array of Real; N :Integer;
                NLC :Integer; NUC :Integer; L :Integer;
                var R :Array of Real; var IERR :Integer);

Параметры

A - вещественный двумерный массив размера N на (NLС + NUС + 1), в котором содержится заданная матрица, записанная в компактной форме;
B - вещественный вектор длины N, в котором содержится правая часть исходной системы;
X - вещественный вектор длины N, в котором содержится искомое решение исходной системы;
N - заданный порядок матрицы (тип: целый);
NLC - число ненулевых диагоналей, расположенных под главной диагональю (тип: целый);
NUC - число ненулевых диагоналей, расположенных над главной диагональю (тип: целый);
L - задает режим работы подпрограммы (тип: целый); при этом:
L = 1 - если система с данной матрицей решается впервые;
L ≠ 1 - если система с данной матpицей pешается повторно;
R - вещественный двумерный массив размера N на (NLС + 1), используемый как рабочий;
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
IЕRR=65 - если заданная матрица является сингулярной.

Версии

ASB1E - решение системы линейных алгебраических уравнений с ленточной матрицей, заданной в компактной форме, с расширенной (Extended) точностью (выбор ведущего элемента по столбцу).

Вызываемые подпрограммы

UTBF10 - подпрограмма выдачи диагностических сообщений при работе подпрограммы АSВ1R;
UTBF11 - подпрограмма выдачи диагностических сообщений при работе подпрограммы АSВ1E;
AFB1R - треугольное разложение ленточной матрицы, заданной в компактной форме, с выбором ведущего элемента по столбцу;
AFB1E - треугольное разложение ленточной матрицы, заданной в компактной форме, с расширенной (Extended) точностью (выбор ведущего элемента по столбцу).

Замечания по использованию

 

При работе подпрограммы исходная матрица не сохраняется. На месте матрицы А помещается ее треугольное разложение, полученное подпрограммами АFВ1R или АFВ1E.

Подпрограммы АSВ1R и АSВ1E позволяют использовать вместо параметра Х параметр В.

При использовании подпрограмм АSВ1R и АSВ1E в цикле значение параметра R должно оставаться неизменным (см. описание подпрограммы АFВ1R).

Для подпрограммы АSВ1E параметры А, В, Х и R должны иметь тип Extended.

Пример использования

Unit TASB1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, ASB1R_p;

function TASB1R: String;

implementation

function TASB1R: String;
var
_i,IERR :Integer;
X :Array [0..2] of Real;
R :Array [0..5] of Real;
const
B :Array [0..2] of Real = ( 7.0,38.0,2.0 );
A :Array [0..8] of Real = ( 0.0,-1.0,10.0,1.0,22.0,18.0,3.0,5.0,0.0 );
begin
Result := '';  { результат функции }
Result := Result + Format('%s',
 [' РЕШЕНИЕ СИСТЕМЫ YРАВНЕНИЙ C ЛЕНТОЧНОЙ MATPИЦEЙ' + #$0D#$0A]) + #$0D#$0A; 
Result := Result + Format('%s',[' ЗАДАННАЯ MATPИЦA:' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 8 do
 begin
  Result := Result + Format('%20.16f ',[A[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' ПРАВАЯ ЧACTЬ:' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 2 do
 begin
  Result := Result + Format('%20.16f ',[B[_i]]);
  if ( ((_i+1) mod 3)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
ASB1R(A,B,X,3,1,1,1,R,IERR);
Result := Result + Format('%s',[' PEЗYЛЬTAT:' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 2 do
 begin
  Result := Result + Format('%20.16f ',[X[_i]]);
  if ( ((_i+1) mod 3)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' I=']);
Result := Result + Format('%5d ',[IERR]) + #$0D#$0A;
UtRes('TASB1R',Result);  { вывод результатов в файл TASB1R.res }
exit;
end;

end.


Результаты:

      X  =   (1., 2., -1.), 
      IERR = 0