
31.10.2010, 23:40
|
 |
Активный
|
|
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
|
|
в исходнике есть же
Код:
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();
//Формирование тридиагональной матрицы
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);
Done:=true;
end;
//процедура решения системы линейных уравнений
//S-коэффициенты при Х
//R-правая часть
//X-результат
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
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];
end;
и функция для доступа к готовым сплайнам
Код:
class function TInterpolator.Spline(x:extended):extended;
var i:integer;
begin
i:=0;
//Нахождение номера промежутка
while not ((x >= xi(i)) and (x <= xi(i+1))) do
if (i+1)<Length(Nodes) then
inc(i)
else
Break;
Result := Spline(i, x);
end;
//Функция кубических сплайнов Эрмита
class function TInterpolator.Spline(i:integer; x:extended):extended;
begin
Result := ( M[i+1]*Power(x - xi(i), 3) + M[i]*Power(xi(i+1) - x, 3))/(3*h(i)) + (f(i+1)/h(i) - M[i+1]*h(i)/3)*(x-xi(i)) + (f(i)/h(i) - M[i]*h(i)/3)*(xi(i+1)-x);
end;
Разумеется, отдельно работать не будет, там еще "служебные" функции есть
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
|