Промышленный лизинг Промышленный лизинг  Методички 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 [ 90 ] 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110

> В подпрограммах NBTRIP и PBTRIP используются при работе другие подпрограммы, текст которых также приведен в приложении. Укажем на их основные функции, приведенные в комментариях к программе.

Подпрограмма LUDECO представляет матрицу А в виде произведения верхней (U) и нижней (L) треугольных матриц. Результат записывается на место матрицы А. Главный элемент при этом не выделяется.

Подпрограмма N[lJLPVT(AyByC,ORDER) производит умножение вектора В на матрицу А и вычитает полученное произведение из другого вектора С. Результат расчета запоминается в С, поэтому массив С при работе программы изменяется.

Подпрограмма LVSOLV{А,В,С,ORDER) решает систему алгебраических уравнений /*С = Б и записывает решение в С. Матрица А должна быть заранее представлена в виде произведения верхней (и) и нижней (L) треугольных матриц.- /7риж. перев.

В подпрограммах NBTRIP и PBTRIP выделение главного элемента при решении систем уравнений методом исключения не производится. Отметим, что для каждого значения N можно создать специальную подпрограмму решения системы уравнений с блочной трехдиагональной матрицей, которая будет работать быстрее, чем общая подпрограмма, приведенная ниже>.

Текст подпрограммы NBTRIP

с...subroutine то solve non-periodic block tridiagonal с...system of equations witkout pivoting strategy c...with the dimensions of the block matrices being c...n x n (n is any number greater than 1). c. . .

subroutine nbtrip(a,в,с,d,il,iu,order)

c...

dimension a(1),b(1),c(1),d(1) integer order,ordsq

c. . .

c...a = sub diagonal matrix c...b = diagonal matrix c...c = sup diagonal matrix c...d = right hand side vector



C...IL = LOWER VALUE OK INDEX FOR WHICH MATRICES ARE DEFINED C...IU .= UPPER VALUE OF INDEX FOR WHICH MATRICES ARE DEFINED C... (SOLUTION IS SOUGHT FOR BTRI(A,В,C)*X = D

C... FOR INDICES OF X BETWEEN IL AND IU (INCLUSIVE).

C... SOLUTION WRITTEN IN D VECTOR (ORIGINAL CONTENTS

C... ARE OVERWRITTEN)).

C...ORDER = ORDER OF A,B,C MATRICES AND LENGTH OF D VECTOR

C... AT EACH POINT DENOTED BY INDEX I

C... (ORDER CAN BE ANY INTEGER GREATER THAN 1).

C. . .

C...THE MATRICES AND VECTORS ARE STORED IN SINGLE SUBSCRIPT FORM C. . .

ORDSQ = ORDER--a

C. . .

C...FORWARD ELIMINATION C...

I = IL

lOMAT = 1+(I-1)*0RDSQ lOVEC = 1+(I-1)*0RDER CALL LUDECO(B(I0MAT),ORDER)

CALL LUSOLV(B(I0MAT),D(IOVEC),D(IOVEC),ORDER)

DO 100 J=l,ORDER

lOMATJ = IOMAT+(J-1)*ORDER

CALL LUSOLV(B(IOMAT),C(IOMATJ),C(IOMATJ),ORDER) 100 CONTINUE 200 CONTINUE

I = I+l

lOMAT = 1+(I-1)*0RDSQ lOVEC = 1+(I-1)*0RDER IIMAT = lOMAT-ORDSQ IIVEC = lOVEC-ORDER

CALL MULPUT(A(IOMAT),D(I1VEC),D(IOVEC),ORDER)

DO 300 J=l,ORDER

lOMATJ = IOMAT+(J-1)*ORDER

IIMATJ = I1MAT+(J-1)*0RDER

CALL MULPUT(A(IOMAT),C(I1MATJ),B(IOMATJ),ORDER) 300 CONTINUE

CALL LUDECO(B(I0MAT),ORDER)

CALL LUSOLV(B(I0MAT),D(IOVEC),D(I0VEC),ORDER)

IF(I.EQ.IU) GO TO 500

DO 400 J=l,ORDER

lOMATJ = IOMAT+(J-1)*ORDER

CALL LUSOLV(B(IOMAT),С(IOMATJ),С(IOMATJ),ORDER) 400 CONTINUE

GO TO 200 500 CONTINUE C...

C...BACK SUBSTITUTION C...

I = IU 600 CONTINUE I = I-l

lOMAT = 1+(I-1)*0RDSQ lOVEC = 1+(I-1)*0RDER IIVEC" = lOVEC+ORDER

CALL MULPUT(C(IOMAT),D(I1VPC),D(IOVEC),ORDER) IF (I.GT.IL) GO TO 600



Текст подпрограммы PBTRIP

subroutine то solve periodic block tridiagonal system of equations without pivoting strategy. each block matrix may be of dimension n with n any number greater than 1.

subroutine pbtrip(a,b,c,d,il,iu,order) dimension a(1),b(1),c(1),d(1) dimension ad(25),cd(25) integer order,ordsq

a = sub diagonal matrix в = diagonal matrix с = sup diagonal matrix d = right hand side vector

il = lower value of index for which matrices are defined

iu = upp::r value of index for which matrices are defined

(solution is sought for btri(a,b,c)*x = d for indices of x betweeen il and iu (inclusive). solution written in d vector (original contents are overwritten)). order = order of a,b,C matrices and length of d vector at each point denoted by index I (order can be any integer greater than 1) (arrays ad and cd must be at least of length 0rder*2) (current length of 25 anticipates maximum order of 5).

is = il+1 ie = iu-1 ordsq = 0rder**2 lUMAT « 1+(iu-1)*drdsq lUVEC = 1+(iu-1)*0rder lEMAT = 1+(ie-1)*0rdsq lEVEC = 1+(ie-1)*0rder

..forward elimination

i = il

lOMAT = 1+(i-1)*0rdsq lOVEC » 1+(i-1)*0rder call ludeco(b(iomat),order)

call lusolv(b(i0mat),d(iovec),d(iovec).order)

do 10 J=l,order

lOMATJ - i0mat+(J-1)*0rder

call lus0lv(b(i0mat),c(iomatj),c(iomatj).order) call lusolv(b(i0mat),a(i0matj),a(i0matj).order) 10 continue

DO 200 i e IS,ie lOMAT « 1+(i-1)*0rdsq lOVEC = 1+(i-1)*0rder iimat = lOMAT-ORDSQ iivec = lOVEC-order DO 20 J=l.ORDSQ



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 [ 90 ] 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110