Глава 2. Интерполирование и экстраполирование функций
α
α
α
α
σ
σ
σ
σ
β
β
β
β
11
22
33
1
2
3
1
2
3
00 00
0000
00 00
0000 0
h
h
h
nn
L
L
L
M
L
MM
⎛
⎝
⎜
⎜
⎜
⎜
⎜
⎜
⎞
⎠
⎟
⎟
⎟
⎟
⎟
⎟
×
⎛
⎝
⎜
⎜
⎜
⎜
⎜
⎜
⎞
⎠
⎟
⎟
⎟
⎟
⎟
⎟
=
⎛
⎝
⎜
⎜
⎜
⎜
⎜
⎜
⎞
⎠
⎟
⎟
⎟
⎟
⎟
⎟
n
.
Здесь вычисляются
1) диагональные элементы α
i
:
α
1
= - h
1
; α
i
= 2(h
i−1
+ h
i
) - h
2
i−1
/ α
i−1
;
α
n
= -h
n−1
- h
2
n−1
/ α
n−1
;
1) правые части матрицы β
i
:
β
1
= h
2
1
Δ
(3)
1
; β
i
= (Δ
i
−
Δ
i−1
) - h
i−1
β
i−1
/ α
i−1
;
β
n
= -h
2
n−1
Δ
(3)
n−3
- h
n−1
β
n−1
/ α
n−1
,
(здесь для всех соотношений i = 2, 3, ..., n-1). Тогда
искомые σ
i
определяются через обратную подстановку
σ
n
=
β
n
/
α
n
; σ
i
=
(β
i
−
h
i
σ
i+1
)
/
α
i
для всех i = n - 1, n - 2, ..., 1.
Вычислительные схемы, используемые для решения
систем с трехдиагональной матрицей, традиционно назы-
вают методом прогонки.
В некоторых случаях по различным причинам предпо-
чтительнее вычислять и сохранять коэффициенты b
i
, с
i
и d
i
для функции s(х), записанной в несколько ином виде :
s(х) = у
i
+ b
i
(х - х
i
) + с
i
(х - х
i
)
2
+ d
i
(х - х
i
)
3
,
x ∈ [x
i
, x
i+1
],
где на каждом подынтервале [х
i
, х
i+1
] указанные коэф-
фициенты выражаются через σ
i
и h
i
:
b
i
= (у
i+1
- у
i
) / h
i
- h
i
(σ
i+1
+ 2σ
i
); с
i
= 3 σ
i
;
d
i
= (σ
i+1
- σ
i
) / h
i
.
Использованиe такой формы хранения сплайнов упро-
щает некоторые операции с ними, например при вычислении
производных и интегралов. Заметим попутно, что при N = 1
сплайн совпадает с многочленом Ньютона первой степени
(см. § 2).
На практике, если дано достаточно много точек, то для
построения кубического сплайна выбирают 4 последовател-
ьно расположенные, по которым строят первый полином.
Затем сдвигаются на 3 точки и снова по 4 последовательным
точкам строят следующий сплайн. И так поступают до тех
пор, пока все точки не будут выбраны.
Один из методов вычисления кубической сплайн-функ-
ции реализован в подпрограмме SРLINЕ и процедуре-
функции SЕVАL [Дж. Форсайт и др., 1980], которые напи-
саны на алгоритмическом языке FОRТRАN и реализованы
в БСП для ЭВМ БЭСМ-6 (к сожалению, эта эффективная
процедура практически не используется для персональных
ЭВМ!). В работе подпрограмма и процедура-функция при-
водятся на языке РАSСАL (перевод выполнен авторами).
Перед применением программы следует убедиться, что
среди точек нет повторяющихся. Если это не так, то пов-
торяющиеся точки не должны быть использованы для по-
строения одного сплайна. Для построения разных сплай-
нов такие точки использовать можно.
Процедуры SРLINЕ и SЕVАL выполняются последова-
тельно. Сначала в первой из названных процедур вычисля-
ются коэффициенты для построения сплайна на выбран-
ном отрезке, а во второй процедуре - значение функции в
заданной точке. Отрезок, на котором строится сплайн, сле-
дует выбирать таким образом, чтобы заданная точка рас-
полагалась около его середины. Это уменьшит погреш-
ность вычислений. Выбор последовательности из четырех
точек осуществляется в основной программе.
Если требуется применить сплайн для построения не-
прерывной функции на всем пространстве эксперимен-
тальных данных, то в основной программе следует органи-
зовать скользящее окно из 4 точек с перекрытием в две
точки. В области перекрытия рекомендуется вычислять зна-
чение функции как среднее из одного и другого сплайна.
Формальные параметры процедур. Процедура SPLI-
NE. Входные: n (тип integer) - количество точек, по кото-
рым строится сплайн (oно должно быть не меньше 2, но не
больше 4); x, y (тип real) - два массива размером 1×n, в ко-
торые предварительно записаны данные для построения
очередного сплайна. Выходные: b, c, d (тип real) - массивы
коэффициентов кубического сплайна, если были предло-
жены 4 точки.
Процедура SEVAL. Входные: n (тип integer) - количес-
тво точек, по которым строится сплайн; u (тип real) - точ-
ка, в которой надо определить значение функции; x, y (тип
real) - два массива размером 1×n, в которые предваритель-
но записаны данные для построения очередного сплайна;
b, c, d (тип real) - массивы коэффициентов кубического
сплайна, если были предложены 4 точки. Выходные:
процедура-функция SEVAL возвращает вещественное
значение функции в указанной точке u.
{ ***????????? ?????????? ???????????
??????? ?? ??????? ???????? 4 ?????? ***}
PROCEDURE SPLINE (N:INTEGER; X,Y: MAS; VAR B,C,D : MAS);
VAR NM1, I : INTEGER; T : REAL;
BEGIN NM1 := N-1;
IF N<2 THEN EXIT;
IF N>=3 THEN
{
*** ????????? ???????????? ??? ???????;
***
?????? 3-? ???????????? ???????: ***
***
? - ?????????, D - ????????????, ***
***
? - ?????? ????? ***}
BEGIN D[1] := X[2]-X[1];
C[2] := (Y[2]-Y[1]) / D[1];
FOR I := 2 TO NM1 DO
BEGIN D[I] := X[I+1]-X[I];
B[I] := 2.0*(D[I-1]+D[I]);
C[I+1]:= (Y[I+1]-Y[I])/D[I];
C[I] := C[I+1] - C[I];
END;
{
*** ????????? ??????? *** }
B[1] := -D[1]; B[N] := -D[N-1];
62