Вы находитесь на странице: 1из 20

Институт проблем механики

Российской Академии Наук

С. Д. Алгазин, Г. И. Кершуков

ЧИСЛЕННЫЕ АЛГОРИТМЫ КЛАССИЧЕСКОЙ


МАТФИЗИКИ.

VII. Об уравнении Пуассона в цилиндре.

Препринт № 722

Москва 2003 г.
Аннотация.
Рассматривается трёхмерное уравнение Пуассона в цилиндре с
неоднородными краевыми условиями и правой частью
обеспечивающими гладкость решения. Для приближенного
нахождения этого решения построен численный алгоритм без
насыщения. Указан эффективный способ решения соответствующей
дискретной задачи.

The summary.
The three-dimensional Poisson equation in the cylinder with non-
uniform regional conditions and with the right of part ensuring smooth of
the solution is considered. For approximate finding of this solution the
numerical algorithm without saturation is constructed. The effective way
of the solution of the appropriate discrete problem is specified.

055(02)2  Институт проблем механики РАН 2003

2
Введение.

Это седьмой препринт серии объявленной в [1]. Предыдущие


препринты этой серии [1-6]. Препринт посвящён описанию
программного комплекса решения задачи об уравнении Пуассона в
цилиндре. Подробное описание алгоритма приведено в [7].
В [7] описана дискретизация уравнения Пуассона в цилиндре с
однородными краевыми условиями. В этой методике требование
однородности краевых условий существенно, поскольку идея
дискретизации состоит в построении конечномерной задачи со
спектральными свойствами, аналогичными дифференциальной
задаче. Вместе с тем практические задачи часто приводят к
уравнению Пуассона с неоднородными краевыми условиями. В
качестве примера можно привести задачу о деформации горного
массива над нефтяным пластом, вызванную падением давления в
пласте после откачки нефти. Если считать горный массив упругим
телом, то объемное расширение удовлетворяет уравнению Пуассона.
В качестве области, в которой это уравнение рассматривается,
можно выбрать цилиндр с достаточно большим радиусом основания,
снося на его поверхность граничные условия из бесконечности.
Ниже построен численный алгоритм без насыщения [7] для
уравнения Пуассона в цилиндре с неоднородными краевыми
условиями. Особенности численных алгоритмов без насыщения
является то, что они в отличие от разностных методов приводят к
дискретной задаче с полностью заполненной матрицей.
Эффективное решение которой и представляет основную трудность.
Ниже подробно описан прием, позволяющий свести обращение

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

I. Постановка задачи и дискретизация.

Рассматривается уравнение Пуассона с краевым условием Дирихле


∆ u+f=0, (I.1)
u| ∂G =g. (I.2)

Решение ищется в круговом цилиндре единичного радиуса, т.е. в


области G={r ≤ 1;a ≤ z ≤ b} , где (r, ϑ ,z) - цилиндрические координаты.
Для примера рассмотрено краевое условие Дирихле. Проведённые
ниже рассуждения без труда обобщаются на другие типы краевых
условий.
Будем обозначать: g a =g a (r, ϑ ) - граничное условие на донышке
цилиндра (z=a); g b =g b (r, ϑ ) - граничное условие на крышке
цилиндра (z=b); g c =g c ( ϑ , z) - граничное условие на боковой
поверхности цилиндра.
∂ 2u
∆ u= ∆ r ,ϑ u+ , (I.3)
∂ z2

где ∆ r ,ϑ - плоский оператор Лапласа. Из (I.3) следует



∂ 2u
u( ζ ,z)=- ∫ K (ζ , ξ )( f (ξ , z) + )d ξ + ∫ K0 (ζ ,ϑ ) gc (ϑ , z )dϑ. (I.4)
|ζ |≤1
∂ z2 0

Здесь
4
1
K( ζ , ξ ) = − ζ − ξ )|, ζ ρ=
ln|(1- ζξ )/(= exp(iϕ ), ξ r exp(iϕ )

- функция Грина оператора Лапласа с краевым условием Дирихле
(однородным);
1 1 − ρ2
K 0 (ζ , ϑ ) = , ζ = ρ exp(iϕ )
2π 1 + ρ 2 − 2 ρ cos(ϑ − ϕ )

- ядро Пуассона.
Выберем в круге (сечении цилиндра плоскостью z=const) сетку
из m окружностей и N=2n+1 точек на каждой окружности. На
границе круга также выберем N=2n+1 точек. Причём радиус ν -ой
1, 2 ,...,m. По окружностям узлы
окружности r ν =cos(2ν − 1) / π / 4m) , ν =
располагаются через равные углы ϑ l = 2π l/N, l=0,1,...,2n.
Применим для функции
∂ 2u
F (ξ , z) = f( ξ , z) +
∂ z2

интерполяционную формулу К. И. Бабенко для функции двух


переменных в круге [8, стр. 212], а для функции g c ( ϑ , z) применим
интерполяцию тригонометрическим многочленом (здесь z -
фиксировано), тогда из (I.4) получаем приближённое значение
~
u ( ζ , z ) для функции u( ζ , z )

~ 2n
u ( ζ , z ) = ∑ Hi (ζ ) F (ξi , z ) + ∑ H 0j (ζ ) gc (ϑj , z ), (I.5)
i j =0

где

H i (ζ ) = ∫ K (ζ , ξ )l (ξ )dξ ,
|ζ |≤1
i

n
2
H 0j = (0.5 + ∑ ρ l cos l (ϕ − ϑ j )),ζ = ρ exp(iϕ ).
N l =1

5
Здесь l i (ξ ), i=1,2,...,R, R=mN - фундаментальные функции
интерполяционной формулы К. И. Бабенко в круге. Конкретный вид
этих функций приведен в [8, стр. 212]. Для дальнейших рассуждений
он неважен.
Проведём теперь дискретизацию ∂ 2 v / ∂ z по z. Выберем для v (ξ , z)
интерполяционную формулу по k узлам
~ (−1) k +1 ( x − 1)
v(ξ , z ) = Tk ( x) g a (ξ )
2

2(1 − x2 ) k 1 k −1 ' ~
+
= k
∑ ∑
sin2 ψ j q 0
j 1=
cos( qψ )T
j q ( x ) v (ξ , z j )

( x + 1)
+ Tk ( x) gb (ξ ). (I.6)
2
~
Здесь v(ζ , z ) - приближённое значение функции v(ζ , z ),

Tk ( x) = cos(k arccos x) - многочлен Чебышева степени k; z=((b-


a)x+a+b)/2; ψ=j (2 j − 1)π / 2k , x j = cosψ j ; z j = ((b − a ) x j + a + b) / 2,

j=1,2,...,k; штрих у знака суммы означает, что слагаемое при q=0


берётся с коэффициентом ½ .
Обозначим
(−1) k +1 ( x − 1)
La ( x) = Tk ( x),
2

2(1 − x 2 ) 1 k −1
L j ( x) =
k sin 2 ψ j

q =0
'
co (sqψ j )Tq ( x),

( x + 1)
Lb ( x) = Tk ( x).
2

Дифференцируя (I.6) два раза по z, получим


~
∂2v 4 k ~
= (
∂ z 2 (b − a) 2 a
L''
( x ) g a (ξ ) + ∑
j =1
L''
j ( x ) v (ξ , z j ) + L''b ( x) gb (ξ )). (I.7)

6
Обозначим
4
Φ (ζ , z )
= ∑Hp
p (ζ )[ f (ζ p , z ) +
(b − a ) 2
{L''a ( x) g a (ξ p )

2n
(I.8)
+ L ( x) gb (ξ p )]} + ∑ H (ζ ) g c (ϑq , z ),
''
b
0
q
q =0

4
Dij = L''j ( xi ); i,j = 1,2,...,k
(b − a ) 2

матрицу размера k×k. Тогда из (7.5), (7.7) получаем

k ~
=u (ζ q , zi ) ∑H ∑Dp
q p
j =1
ij u (ζ p , z j ) + Φ (ζ q , z j ). (I.9)

Здесь H qp = H p (ζ q ), где p,q=1,2,...,R пробегают узлы интерполяции в


круге, т.е. H - матрица дискретной задачи Дирихле для плоского
оператора Лапласа ; zi ,i = 1,2,...,k пробегает узлы интерполяции по z.
Эффективный способ вычисления элементов матрицы H указан в
[7].

Исследование структуры конечномерной задачи.

Перенумеруем узлы в цилиндре сначала по z, а затем по ζ , т.е.


быстрее всего меняется индекс i, потом q. Тогда имеем из
соотношений (I.9) в матричной форме
u= H ⊗ Du + Φ, (I.10)

где u - вектор столбец, содержащий приближённые значения


искомого решения в узлах сетки; Φ - вектор столбец, содержащий
значения соответствующей функции (см. I.8) в узлах сетки; знаком
⊗ обозначено кронекеровское произведение матриц H и D.
Размерность этих векторов N g = Rk равна числу внутренних узлов
сетки. Решив конечномерную задачу (I.10) получим приближённое
значение решения в узлах сетки. В остальных точках цилиндра
7
решение может быть восстановлено по используемым выше
интерполяционным формулам.
Таким образом, для решения системы линейных уравнений
(I.10) требуется обратить матрицу I − H ⊗ D большого размера
N g xN g . Например, для сетки m=5, N=11, k=10 эта матрица 550х550,

и она полностью заполнена. Современные персональные ЭВМ


позволяют работать с такими матрицами, но время обращения
достаточно большое. На ПЭВМ типа Pentium с тактовой частотой
90Мгц время обращения матрицы 550х550 по стандартной
программе занимает примерно 7 минут. Кроме этого, требуется
много памяти для хранения полностью заполненной матрицы. В
этом параграфе описывается как преодолеть эти трудности.
Пусть
k
=
D ∑ λ b=
q =1
,bq q
2
q bq , b=
q bp 0, q ≠ p (I.11)

есть спектральное разложение матрицы D. Такое разложение всегда


можно построить, если D - матрица простой структуры, т.е. имеет
полную систему собственных векторов. Поскольку по построению D
- это матрица дискретного оператора, соответствующего
дифференциальному оператору d 2 /dz 2 с однородными краевыми
условиями при z=a и z=b, то это условие выполняется. Далее в (I.11)
bq ,q = 1,2,...,k - собственные проекторы на одномерное инвариантное

подпространство, λ q - соответствующее собственное значение. В


практических расчётах размер матрицы D невелик (k=6 ÷ 20) и
спектральное разложение можно построить, решив полную
проблему собственных значений для матриц D и D'.

8
k
Заметим, что I = I R ⊗ I k ; I k = ∑ bk , тогда
q =1

k k k
I − H ⊗ D = I R ⊗ ( ∑ bq ) − H ⊗ ( ∑ λ q bq ) = ∑ ( I R − λ q H ) ⊗ bq .
q =1 q =1 q =1

В таком случае имеем следующую формулу для обратной к матрице


I − H ⊗ D:
k
( I − H ⊗ D) −1 = ∑ ( I R − λ q H ) −1 ⊗ bq , (I.12)
q =1

которая проверяется непосредственным умножением.


Таким образом, вместо обращения матрицы размера N g xN g

требуется обратить k матриц размера R×R, т.е. размера, равного


числу узлов сетки в круге. Отметим, что I R − λ q H - h-матрица и её
обращение сводится к обращению (n+1) матриц размера m×m. Кроме
того, для хранения h-матрицы требуется хранить всего m 2 (n + 1)
элементов. Теперь для того, чтобы решить систему линейных
уравнений (I.10), нужно умножить правую часть соотношения (I.12)
на вектор. Если N = 3µ , µ = 1,2,..., то для умножения h-матрица на
вектор можно, для уменьшения количества операций, использовать
быстрое преобразование Фурье. Следовательно, для кругового
цилиндра формула (I.12) даёт исчерпывающее решение
поставленной задачи.
Обсудим теперь изменения, которые следует внести в методику,
чтобы рассмотреть цилиндр с произвольным основанием в виде
области G, с гладкой границей ∂ G. Пусть ϕ ( z ), | z |≤ 1 конформное
отображение круга на область G. Обозначим
Z = diag (| ϕ ' (ζ 1 ) |2 ,...,| ϕ ' (ζ R ) |2 ). Тогда аналогично получаем, что в
формулы этого параграфа вместо H нужно подставить матрицу HZ.
Изменится также правая часть Φ соотношения (I.11). Вместо f (ζ p ,z )
9
в (I.8) войдёт | ϕ '(ζ p ) |2 f (ζ p ,z ). Эти изменения приведут к тому, что в
формуле (I.12) придётся численно обращать k матриц размера R×R.
Полученная после обращения матрица будет матрицей общего вида
и, для её умножения на вектор не удастся использовать быстрое
преобразование Фурье.

Обсуждение методики и численный пример.

Для того, чтобы оценить погрешность предложенной методики,


нужно выписать применяемые интерполяционные формулы с
остатком и оценить погрешность дискретизации. Это делается
стандартными приёмами и поэтому не рассматривается.
Исследование устойчивости проводится ниже при рассмотрении
конкретных расчётов. Отметим качественную характеристику
методики. Выше применялась интерполяция решения
многочленами: алгебраическими и тригонометрическими. Известно
[8,9], что интерполяционный многочлен приближает гладкую
функцию тем точнее, чем большим условиям гладкости она
удовлетворяет, т.е. мы получили метод без насыщения. Он
автоматически настраивается на гладкость решения. Гладкость
решения определяется входными данными: граничными условиями
и правой частью.
В качестве численного примера рассматривалось решение
уравнения Пуассона в круговом цилиндре единичного радиуса при
=a 0,=b π.

Пусть u(r , ϑ , z ) = r 3 z 6 cos 5ϑ , тогда это решение удовлетворяет


соотношениям (I.1), (I.2), если

10
f (r , ϑ , z ) = ( −9rz 6 + 25rz 6 − 30r 3 z 4 ) cos 5ϑ ;
g a (r , ϑ ) = 0;
gb (r , ϑ ) = π r 3 cos 5ϑ ;
6

g c (ϑ , z ) = z 6 cos 5ϑ .

Расчёты проводились на сетках: m=3, N=11, k=6; m=3, N=11, k=8;


m=5, N=11, k=10; m=3, N=11, k=7.
Во всех случаях отклонение точного решения от приближённого
было величиной порядка 10 −9 . Получить такую точность, используя
разностную схему, практически невозможно.
Второй расчёт проводился для этого цилиндра с правой частью
f=10 и теми же граничными условиями. Приближённое решение
определялось на сетке k=6, m=13, N=15. Затем по
интерполяционной формуле К. И. Бабенко вычислялись значения на
оси z в точках: 0,h,2h,..., π , h = π / 10. Были получены следующие
значения 0.8269×10 −2 , 1.243, 1.901, 2.211, 2.332, 2.361, 2.332, 2.211,
1.901, 1.243, 0.8269×10 −2 . Дальнейшие расчёты проводились на
сетках: 8×7×11; 8×7×13; 10×11×11; 9×11×11; 20×7×7; 15×9×9;
13×9×9; 5×15×15; 7×13×13. Результаты интерполировались на
равномерную сетку по оси z (см. выше). Отклонение решений во
внутренних узлах сетки во всех случаях составляло величину
порядка 10 −2 . Из этого можно сделать вывод, что решение не
обладает высокой гладкостью. Одновременно вычислялась
Чебышевская норма матрицы ( I − H ⊗ D) −1 . Во всех случаях эта
величина была порядка 10 3 . Таким образом, при численном счёте
существенного накопления погрешности не происходит.
Последний рассматриваемый пример - определение объёмного
расширения упругого цилиндра, находящегося под действием
собственного веса:

11
∆e = 0,
ea = 0,
eb = (1 − 2ν ) ρgb / E ,
ec = (1 − 2ν ) ρgz / E .

Решение этой задачи известно (поскольку известно решение


задачи о деформации цилиндра под действием собственного веса):
e = ρgz (1 − 2ν ) / E .

Здесь ν , ρ , g, E − коэффициент Пуассона, плотность, ускорение


свободного падения и модуль Юнга. Этот пример интересен тем, что
показывает наличие гладких решений у уравнения Пуассона в
цилиндре в практически важных задачах. Расчёты проводились при
реальных константах горного массива на сетках: k=6, m=3, N=11;
k=3, m=3, N=11; k=2, m=3, N=3; k=1, m=3, N=3. Абсолютная
погрешность отклонения точного решения от приближённого была
величиной порядка 10 −15 -10 −16 . Таким образом подтверждается
высокая точность методики для гладких решений.

II. Описание программного комплекса.


Решение уравнения Пуассона в круговом цилиндре
осуществляет программа DEFGM7a. Параметры программы заданы
оператором

PARAMETER (K= 6,M=9,N=15,NT=M*N,NG=NT*K,AL=0.,BL=3.141592653589D0)

Здесь K – число узлов по z;


M – число улов по r;
N – число узлов по θ;
AL = a (донышко цилиндра);
BL = b (крышка цилиндра).

12
Программа считывает начальные данные из файла DATA [7],
использует подпрограммы HMATR1, RASPAK, TRANSP [7] и
производит умножение матрицы (I.12) вычисляемой подпрограммой
KRON на вектор правой части. Затем вычисляются значения
решения на оси цилиндра в узлах сетки (результат в Y2).

PROGRAM DEFGM7a
C 21.10.96 Тетрадь ВННИИ нефть N1, стр.115
IMPLICIT REAL*8 (A-H,O-Z)
PARAMETER (K= 6,M=9,N=15,NT=M*N,NG=NT*K,AL=0.,BL=3.141592653589D0)
DIMENSION D(K,K),A(K,K),B(K,K),IANA(K),X(K),Y(K),IANA1(K),D1(K,K),
*C0(225),C1(225),H(NT,NT),R(NG,NG),LR(NG),MR(NG),C(225),R1(NG,NG),
*R2(NG,NG),HR(NT,NT),U1(NG),U2(NG),FI(NG),H0(N),NL(N),U(NT),Y1(NT),
*Z(NT),Y2(K)
INTEGER*4 P,Q,S
REAL*8 LA2,LB2
PI=3.141592653589D0
C
C KAHAЛ BBOДA ДAHHЫX
NREAD = 3
OPEN(UNIT=3,FILE='DATA')
C KAHAЛ ПPOMEЖУTOЧHЫX BЫДAЧ
NOUT = 4
OPEN(UNIT=4,FILE='NOUT')
C
IM = 0
300 IM = IM + 1
IF (IM.GT.10) STOP
READ(NREAD,*) M1
C
NM=(N-1)/2
M2=M1*M1
C
READ (NREAD,*) (C0(I),I=1,M2)
READ (NREAD,*) (C1(I),I=1,M2)
IF (M1.NE.M) GO TO 300
C
WRITE (NOUT,*) ' M = ', M
WRITE(NOUT,*) 'LAMDA0'
WRITE(NOUT,*) (C0(I),I=1,M2)
WRITE(NOUT,*) 'LAMDA1'
WRITE(NOUT,*) (C1(I),I=1,M2)
C
CALL HMATR1 (H,M,N,C0,C1,C)
CALL RASPAK(H,M,NM)
CALL TRANSP (H,NT)
C
DO 1 I=1,NG
DO 1 J=1,NG
R2(I,J)=0.D0
1 CONTINUE
C
CALL KRON (R2,NG,H,HR,NT,D,K,AL,BL,X,Y,IANA,IANA1,A,B,LR,MR)
C
13
Q=0
I1=0
DO 3 NU=1,M
RNU=COS((2.*NU-1.)*PI/4./M)
DO 3 L=1,N
TETAL=2.*PI*(L-1)/N
Q=Q+1
CALL HJ0 (RNU,TETAL,H0,N)
DO 3 I=1,K
PSI=(2.*I-1.)*PI/2./K
XI=COS(PSI)
ZI=(XI*(BL-AL)+BL+AL)/2.
TK1=K*SIN(K*PSI)/SIN(PSI)
TK2=K*XI*SIN(K*PSI)/SIN(PSI)**3
LA2=(-1)**(K+1)*(2.*TK1+(XI-1)*TK2)/2.
LB2=(2.*TK1+(XI+1)*TK2)/2.
I1=I1+1
SUM=0.D0
DO 4 S=1,N
TETAS=2.*PI*(S-1)/N
4 SUM=SUM+H0(S)*GC(TETAS,ZI)
FI(I1)=SUM
P=0
SUM=0.D0
DO 5 MU=1,M
RMU=COS((2.*MU-1.)*PI/4./M)
DO 5 LM=1,N
TETALM=2.*PI*(LM-1)/N
P=P+1
5 SUM=SUM+H(Q,P)*(F(RMU,TETALM,ZI)+(2./(BL-AL))**2*
*(LA2*GA(RMU,TETALM)+LB2*GB(RMU,TETALM)))
3 FI(I1)=FI(I1)+SUM
C
DO 6 I=1,NG
SUM=0.D0
DO 8 J=1,NG
8 SUM=SUM+R2(I,J)*FI(J)
6 U2(I)=SUM
C В U2 результат
DO 10 I=1,M
10 NL(I)=N
DO 11 I=1,K
I1=I
DO 13 J=1,NT
U(J)=U2(I1)
13 I1=I1+K
CALL URT (0.D0,M,NL,U,Y1)
CALL URT (3.14159265359D0,M,NL,U,Z)
DO 40 I2=1,M
I1=M1-I2+1
40 Y(I1)=Z(I2)
X0=0.D0
11 Y2(I)=EIGEN (X0,Y1,Z,M1,-1.D0,1.D0)
WRITE(*,12) Y2
12 FORMAT(1X,3E18.11)
STOP
END
REAL*8 FUNCTION F(R,TETA,Z)
IMPLICIT REAL*8 (A-H,O-Z)

14
F=10.D0
RETURN
END
REAL*8 FUNCTION GA(R,TETA)
IMPLICIT REAL*8 (A-H,O-Z)
GA=0.D0
RETURN
END
REAL*8 FUNCTION GB(R,TETA)
IMPLICIT REAL*8 (A-H,O-Z)
GB=R**3*3.141592653589D0**6*COS(5.*TETA)
RETURN
END
REAL*8 FUNCTION GC(TETA,Z)
IMPLICIT REAL*8 (A-H,O-Z)
GC=Z**6*COS(5.*TETA)
RETURN
END

Описание параметров подпрограмм.


SUBROUTINE KRON (R,NG,H,HR,NT,D,K,AL,BL,X,Y,IANA,IANA1,A,B,LR,MR)
IMPLICIT REAL*8 (A-H,O-Z)
INTEGER*4 Q
DIMENSION R(NG,NG),H(NT,NT),HR(NT,NT),LR(NT),MR(NT)
DIMENSION D(K,K),A(K,K),B(K,K),IANA(K),X(K),Y(K),IANA1(K)
CALL SPEKTR (D,K,AL,BL,X,Y,IANA,IANA1,A,B)
DO 4 I=1,NG
DO 4 J=1,NG
4 R(I,J)=0.D0
DO 2 Q=1,K
IQ=IANA1(Q)
IQ1=IANA(Q)
DO 3 I=1,NT
DO 3 J=1,NT
HR(I,J)=-X(IQ)*H(I,J)
IF(I.EQ.J) HR(I,I)=HR(I,I)+1.D0
3 CONTINUE
CALL DMINV (HR,NT,DET,LR,MR)
DO 5 I=1,K
DO 5 J=1,K
5 D(I,J)=A(I,IQ1)*B(J,IQ)
CALL KRDIV1 (R,HR,D,NG,NT,K)
2 CONTINUE
RETURN
END

R – результат (матрица размера NG×NG);


H – входной массив (матрица NT×NT);
HR – рабочий массив (матрица NT×NT);

15
D – массив K×K, который служит для вычисления матрицы D.
На выходе не сохраняется;
K – размер матрицы D;
AL, BL – a и b границы интервала на котором рассматривается
задача (по z);
X, Y- массивы длины K на выходе содержат действительную и
мнимую часть собственных значений (если Y не тождественно равно
нулю – ошибка);
IANA – одномерный массив длины K, который содержит в i-ом
элементе номер i-го собственного значения матрицы D в порядке
возрастания;
IANA1 – тоже, что и IANA но для матрицы D';
A – матрица K×K, которая содержит по столбцам собственные
векторы матрицы D. Для того, чтобы их выбрать в порядке
возрастания собственных значений нужно воспользоваться
массивом IANA;
B – то же, что и A для матрицы D';
LR, MR – рабочие массивы длины NT.
Используются подпрограммы: SPEKTR, DMINV, KRDIV1.
DMINV – вариант с двойной точностью подпрограммы MINV
[10].

SUBROUTINE SPEKTR (D,K,AL,BL,X,Y,IANA,IANA1,A,B)


IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION D(K,K),A(K,K),B(K,K),IANA(K),X(K),Y(K),IANA1(K)
CALL ZSL1 (D,K,AL,BL)
CALL ELMHES (K,K,1,K,D,IANA)
CALL ELTRAN (K,K,1,K,D,IANA,A)
CALL HQR2 (K,K,1,K,D,X,Y,A,IERR)
CALL SORT(X,Y,K,IANA)
CALL ZSL1 (D,K,AL,BL)

16
DO 1 I=1,K
DO 1 J=1,I
P=D(I,J)
D(I,J)=D(J,I)
1 D(J,I)=P
CALL ELMHES (K,K,1,K,D,IANA1)
CALL ELTRAN (K,K,1,K,D,IANA1,B)
CALL HQR2 (K,K,1,K,D,X,Y,B,IERR)
CALL SORT(X,Y,K,IANA1)
DO 2 I=1,K
P=0.D0
I1=IANA (I)
I2=IANA1(I)
DO 3 J=1,K
3 P=P+A(J,I1)*B(J,I2)
DO 4 J=1,K
4 A(J,I1)=A(J,I1)/P
2 CONTINUE
RETURN
END

D – массив K×K, который служит для вычисления матрицы D.


На выходе не сохраняется;
K – размер матрицы D;
AL, BL – a и b границы интервала на котором рассматривается
задача (по z);
X, Y- массивы длины K на выходе содержат действительную и
мнимую часть собственных значений (если Y не тождественно равно
нулю – ошибка);
IANA – одномерный массив длины K, который содержит в i-ом
элементе номер i-го собственного значения матрицы D в порядке
возрастания;
IANA1 – тоже, что и IANA но для матрицы D';
A – матрица K×K, которая содержит по столбцам собственные
векторы матрицы D. Для того, чтобы их выбрать в порядке
возрастания собственных значений нужно воспользоваться
массивом IANA;

17
B – то же, что и A для матрицы D';
Требуемые подпрограммы: ZSL1, SORT, ELMHES, ELTRAN,HQR2.

SUBROUTINE ZSL1(D,K,A,B)
IMPLICIT REAL*8 (A-H,O-Z)
INTEGER*4 Q
DIMENSION D(K,K)
PI=3.141592653589D0
DO 1 I=1,K
PSI=(2*I-1)*PI/2./K
DO 1 J=1,K
PSJ=(2*J-1)*PI/2./K
S=1.D0
DO 2 Q=1,K-1
2 S=S+COS(Q*PSJ)*((2+Q**2)*COS(Q*PSI)+
+3.*Q*COS(PSI)*SIN(Q*PSI)/SIN(PSI))
1 D(I,J)=-2.*(2./(B-A))**2*S/K/SIN(PSJ)**2
RETURN
END

Вычисляет матрицу D размера K×K по формуле

 sin qψ i 
2 k −1
 2  2 1
Dij = − 
 b − a  k sin ψ j
2 ∑ '
cos qψ j (2 + q 2 ) cos qψ i + 3q cos qψ i
ψ
,
q =0  sin i 

ψ j = ( 2 j2−k1)π , j = 1,2,..., k .

SUBROUTINE SORT(Y,X,N,INT)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION Y(N),X(N),INT(N)
DO 10 I=1,N
INT(I)=0
10 X(I)=Y(I)
DO 1 I=1,N
P=0.D0
DO 3 J=1,N
IF(ABS(X(J)).GT.P) THEN P=ABS(X(J))
INT(N-I+1)=J
ENDIF
3 CONTINUE X(INT(N-I+1))=0.D0
1 CONTINUE
RETURN
END

18
Сортировка массива Y. Подпрограмма запоминает в массиве INT
номера элементов массива Y в порядке возрастания модулей
элементов, т.е. INT(1) содержит минимальный по модулю элемент,
INT(2) следующий по величине модуля элемент и т.д.
X- рабочий массив длины N.
ELMHES, ELTRAN,HQR2 – подпрограммы пакета EISPACK тексты
этих подпрограмм доступны в Интернет по адресу:
htpp:/www.netlib.org/eispack/.

SUBROUTINE KRDIV1 (R,H,D,NG,NT,K)


IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION R(NG,NG),H(NT,NT),D(K,K)
DO 1 I=1,NT
DO 1 J=1,NT
DO 1 MU=1,K
I1=(I-1)*K+MU
DO 1 NU=1,K
J1=(J-1)*K+NU
1 R(I1,J1)=R(I1,J1)+H(I,J)*D(MU,NU)
RETURN
END

Подпрограмма кронекеровского произведения матриц.


R – результат (матрица размера NG×NG);
H – первый сомножитель (матрица размера NT×NT);
D- второй сомножитель (матрица размера K×K).
Примечание. Результат прибавляется к тому, что уже есть в R.
Поэтому перед использованием этой программы нужно обнулить R.
III. Заключение. По поводу получения полных версий описанных
программ обращайтесь по электронному адресу: algazinsd@mail.ru
или на адрес Института проблем механики РАН, 119526, Москва,
проспект Вернадского д.101, к.1.

19
Алгазин Сергей Дмитриевич, Кершуков Григорий
Игоревич

Численные алгоритмы классической матфизики.

VII. Об уравнении Пуассона в цилиндре.

Подписано к печати 16.01.2003. Заказ № 3-2003. Тираж 50 экз.


________________________________________________________

Отпечатано на ризографе Института проблем механики РАН


119526, Москва, пр-т Вернадского, 101

20

Вам также может понравиться