Текст подпрограммы и версий asb1r_p.zip , asb1e_p.zip |
Тексты тестовых примеров tasb1r_p.zip , tasb1e_p.zip |
Решение системы линейных алгебраических уравнений с ленточной матрицей, заданной в компактной форме, 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