
- •Интерполяция
- •1. Постановка задачи и основные определения
- •2. Интерполяция многочленами
- •2.1 Интерполяционная формула Лагранжа
- •2.2 Погрешность интерполяционного многочлена
- •2.3 О сходимости процесса интерполяции
- •3. Интерполяция сплайнами
- •3.1 Что такое сплайн
- •3.2 Построение кубического сплайна
- •3.3 Сплайн-квадратура
- •Приложение. Текст библиотечного модуля splinunt на языке Паскаль для интерполяции кубическими сплайнами.
3.3 Сплайн-квадратура
Аналогично интерполяционным многочленам, сплайн можно использовать для построения квадратурных формул с целью приближенного вычисления определенных интегралов.
Интегрируя сплайн, записанный в форме (13), виде, легко получить формулу
(22)
для n+1
узлов A=x0x1...xn=B
на отрезке интегрирования
[A,B].
Однако, эту формулу можно
существенно упростить,
записав сплайн в виде (17). Тогда
для интеграла на элементарном
отрезке
получаем:
.
Учитывая,
что
,
имеем:
.
Весь интеграл на отрезке [A,B] получается суммированием по элементарным отрезкам:
. (23)
Таким образом, требуются только значения функции fi и коэффициенты ci, вычисляемые библиотечной процедурой SPLINE. В случае равноотстоящих точек (h0=h1=...=hn1=h=(BA)n) эту формулу можно еще более упростить.
Приложение. Текст библиотечного модуля splinunt на языке Паскаль для интерполяции кубическими сплайнами.
{====================} UNIT SplinUNT; {======================}
{ В этот модуль включены подпрограммы SPLINE и SEVAL из книги
Форсайт Дж., Малькольм М., Моулер К., Машинные методы математи-
ческих вычислений: Пер. с анг.- М.: Мир, 1980. с. 91-94.
Для повышения точности интерполяции используется арифметика
с плавающей точкой, определяемая типом
RealType = double
Если Ваш компьютер не имеет арифметического сопроцессора, и
Вы хотите несколько увеличить скорость вычислений ценой ухуд-
шения точности, а также во всех других случаях, когда необходи-
мо сменить базовый вещественный тип (например, в целях экономии
памяти), Вы должны желаемым образом изменить определение вещес-
твенного типа, например: type RealType = real;
}
{-------------------------------------------------------------}
INTERFACE
{$N+,E+}
type
RealType = double; { базовый вещественный тип }
RealTypeArray =
array [1..(2*MaxInt) div Sizeof(RealType)] of RealType;
procedure Spline (N : word; var XI, YI, BI, CI, DI);
{
Вычисляются коэффициенты B[i], C[i] и D[i], i = 1..N
для кубического интерполяционного сплайна вида
S(X) = Y[i] + B[i]*(X-X[i]) + C[i]*(X-X[i])^2 + D[i]*(X-X[i])^3
для X[i] <= X <= X[i+1].
ВХОДНАЯ ИНФОРМАЦИЯ:
N - число заданных точек или узлов (N >= 2);
X - абсциссы узлов в строго возрастающем порядке;
Y - ординаты узлов.
ВЫХОДНАЯ ИНФОРМАЦИЯ:
B, C, D - массивы коэффициентов сплайна, записанного в указанной
выше форме.
Если обозначить дифференцирование символом ', то
Y[i] = S(X[i]);
B[i] = S'(X[i]);
C[i] = S''(X[i])/2;
D[i] = S'''(X[i])/6 (правосторонняя производная).
С помощью сопровождающей функции SEVAL можно вычислять значения
сплайна.
}
{-------------------------------------------------------------}
function Seval (N : word; var U : RealType;
var XI, YI, BI, CI, DI) : RealType;
{
Эта функция вычисляет значение кубического сплайна:
Seval = Y[i]+B[i]*(U-X[i])+C[i]*(U-X[i])**2+D[i]*(U-X[i])**3
где X[i] <= U <= X[i+1]. Используется схема Горнера.
Если U < X[1], то берется значение i = 1;
если U > X[N], то i = N.
ВХОДНАЯ ИНФОРМАЦИЯ:
N - число заданных точек (N >= 2);
U - абсцисса, для которой вычисляется значение сплайна;
X, Y - массивы заданных абсцисс и ординат;
B, C, D - массивы коэффициентов сплайна, вычисленные
процедурой Spline.
Если по сравнению с предыдущим вызовом Seval значение U не
находится в том же интервале, то для отыскания нужного ин-
тервала используется двоичный поиск.
}
{-------------------------------------------------------------}
IMPLEMENTATION
procedure Spline (N : word; var XI, YI, BI, CI, DI);
var
X : RealTypeArray absolute XI;
Y : RealTypeArray absolute YI;
B : RealTypeArray absolute BI;
C : RealTypeArray absolute CI;
D : RealTypeArray absolute DI;
T : RealType;
i : integer;
begin { Spline }
if N < 2 then Exit;
if N = 2 then begin
B[1] := (Y[2] - Y[1]) / (X[2] - X[1]);
C[1] := 0;
D[1] := 0;
B[2] := B[1];
C[2] := 0;
D[2] := 0
end
else begin
{ Формирование трехдиагональной системы линейных уравнений:
B = диагональ, D = наддиагональ, C = правые части. }
D[1] := X[2] - X[1];
C[2] := (Y[2] - Y[1]) / D[1];
for i := 2 to N-1 do begin
D[i] := X[i+1] - X[i];
B[i] := 2 * (D[i-1] + D[i]);
C[i+1] := (Y[i+1] - Y[i]) / D[i];
C[i] := C[i+1] - C[i]
end;
{ Граничные условия. Третьи производные в точках X[1] и X[N]
оцениваются с помощью разделенных разностей. }
B[1] := -D[1];
B[N] := -D[N-1];
if N = 3 then begin
C[1] := 0;
C[N] := 0
end
else begin
C[1] := C[3]/(X[4]-X[2]) - C[2]/(X[3]-X[1]);
C[N] := C[N-1]/(X[N]-X[N-2]) - C[N-2]/(X[N-1]-X[N-3]);
C[1] := C[1] * sqr(D[1])/(X[4]-X[1]);
C[N] := -C[N] * sqr(D[N-1])/(X[N]-X[N-3])
end;
{ Прямой ход метода Гаусса }
for i := 2 to N do begin
T := D[i-1]/B[i-1];
B[i] := B[i] - T*D[i-1];
C[i] := C[i] - T*C[i-1]
end;
{ Обратная подстановка }
C[N] := C[N]/B[N];
for i := N-1 downto 1 do C[i] := (C[i] - D[i]*C[i+1]) / B[i];
{ В C[i] теперь хранится значение Sigma(i), определяемое в книге:
Дж.Форсайт, М.Малькольм, К.Моулер, Машинные методы математических
вычислений. }
{ Вычисление коэффициентов сплайна B, C и D }
B[N] := (Y[N]-Y[N-1])/D[N-1] + D[N-1]*(C[N-1]+2*C[N]);
for i := 1 to N-1 do begin
B[i] := (Y[i+1]-Y[i])/D[i] - D[i]*(C[i+1]+2*C[i]);
D[i] := (C[i+1]-C[i])/D[i];
C[i] := 3*C[i]
end;
C[N] := 3*C[N];
D[N] := D[N-1]
end { N <> 2 };
end { Spline };
{-------------------------------------------------------------}
function Seval (N : word; var U : RealType;
var XI, YI, BI, CI, DI) : RealType;
var
X : RealTypeArray absolute XI;
Y : RealTypeArray absolute YI;
B : RealTypeArray absolute BI;
C : RealTypeArray absolute CI;
D : RealTypeArray absolute DI;
DX : RealType;
j, k : integer;
const
i : integer = 1;
begin { Seval }
if i >= N then i := 1;
if (U < X[i]) or (U > X[i+1]) then begin { Двоичный поиск }
i := 1;
j := N+1;
repeat
k := (i+j) div 2;
if U < X[k] then j := k else i := k
until j <= i+1
end;
{ Вычисление сплайна }
DX := U - X[i];
Seval := Y[i] + DX*(B[i] + DX*(C[i] + DX*D[i]))
end { Seval };
{=================} END. { Unit SplinUNT } {==================}
Употребляется также термин «интерполянт».
Многочлен, записанный в форме (9), часто называют интерполяционным многочленом Лагранжа, хотя на самом деле это не особый вид многочлена, а лишь одна из возможных форм представления единственного существующего интерполяционного многочлена данной степени.
1. Ahlberg H. J., Nilson E. N., Walsh J. L. The theory of splines and their application. N.-Y.: Academic Press, 1967. Русский перевод: Алберг Дж., Нильсон Э., Уолш Дж. Теория сплайнов и ее приложения. М.: Мир, 1972.
2. Стечкин С. Б., Субботин Ю. Н. Сплайны в вычислительной математике. М.: Наука, 1976.
3. Завьялов Ю. С., Квасов Б. И., Мирошниченко В. Л. Методы сплайн-функций. М.: Наука, 1980.
4. Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических вычислений. М.: Мир, 1980. Гл. 4.