class
procedure
TInterpolator
.
Interpolate(na:
array
of
TNode);
var
i, j:
integer
;
A:TMatrix;
B:
array
of
extended
;
begin
Done:=
false
;
N := Length(na) -
1
;
if
N<=
2
then
begin
Raise
Exception
.
Create(
'Number of nodes must be greater than 3!'
) at @TInterpolator
.
Interpolate;
Exit;
end
;
SetLength(Nodes, N+
1
);
for
i:=
0
to
N
do
Nodes[i] := na[i];
SortNodes();
<font color="Blue">
SetLength(A, N+
1
);
for
i:=
0
to
N
do
begin
SetLength(A[i], N+
1
);
for
j:=
0
to
N
do
A[i, j]:=
0
;
end
;
A[
0
,
0
] :=
1
;
A[N, N] :=
1
;
SetLength(B, N+
1
);
SetLength(M, N+
1
);
M[
0
]:=
0
;
M[N]:=
0
;
for
i:=
1
to
N-
1
do
begin
A[i, i-
1
]:=h(i-
1
);
A[i, i] :=
2
*(h(i-
1
) + h(i));
A[i, i+
1
] := h(i);
B[i]:=
3
*( (f(i+
1
)-f(i))/h(i) - (f(i)-f(i-
1
))/h(i-
1
));
end
;
TSLESolver
.
TridiagonalShuttle(A, B, M);</font>
Done:=
true
;
end
;
class
procedure
TSLESolver
.
TridiagonalShuttle(S:TMatrix; R:
array
of
extended
;
var
X:
array
of
extended
);
var
a, b:
array
of
extended
;
n,i:
integer
;
begin
<font color="RoyalBlue">
n := Length(R);
SetLength(a, n);
SetLength(b, n);
A[
1
]:=-S[
0
,
1
]/S[
0
,
0
];
B[
1
]:=R[
0
]/S[
0
,
0
];
for
i:=
1
to
n-
2
do
begin
A[i+
1
] := -S[i, i+
1
]/(S[i, i] +S[i, i-
1
]*a[i]);
B[i+
1
] := (-S[i, i-
1
]*b[i] + R[i])/(S[i, i] +S[i, i-
1
]*a[i]);
end
;
x[n-
1
] := (-S[n-
1
, n-
2
]*b[n-
1
] + R[n-
1
])/(S[n-
1
, n-
1
] +S[n-
1
, n-
2
]*a[n-
1
]);
for
i:= n-
2
downto
0
do
x[i] := a[i+
1
]*x[i+
1
] + b[i+
1
];</font>
end
;