Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Interpolyatsiya_funktsiy_splaynami.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
157.51 Кб
Скачать

3.5. Інтерполяція сплайном Ерміта. Код програми на Delphi

Працює клас TInterpolator1D.

constructor TInterpolator1D.CreateErmith( );

begin

FGetValueFunction := GetErmith;

ResetErmith(Point.Point_Float_Zero, Point_Float_One, 0, 0);

end;

Де ResetErmith створює потрібні коефіцієнти:

procedure TInterpolator1D.ResetErmith(APoint1, APoint2: TPoint_Float;

ADerivative1, ADerivative2: Double);

begin

FP1 := APoint1;

FP2 := APoint2;

if FP1.x = FP2.x then

RaiseInvalidValues;

FK1 := ADerivative1;

FK2 := ADerivative2;

CreateErmithCoeffl;

end;

procedure TInterpolator1D.CreateErmithCoeffl;

var

z: Double;

x1, y1, x2, y2, k1, k2: Double;

function Cube(x: Double): Double; inline;

begin

Result := Sqr(x)*x;

end;

begin

x1 := FP1.x;

x2 := FP2.x;

y1 := FP1.y;

y2 := FP2.y;

k1 := FK1;

k2 := FK2;

Z := Cube(x1 - x2);

FCoeff.A := (x1*k1-2*y1-x2*k1-x2*k2+x1*k2+2*y2)/Z;

//((FK1 + FK2) * (FP1.x - Fp2.x ) + 2 * (FP1.y + FP2.y)) / Z;

FCoeff.B := -(2*Sqr(x1)*k2+Sqr(x1)*k1+3*x1*y2-x1*x2*k2-3*x1*y1+x1*x2*k1-2*sqr(x2)*k1+3*x2*y2-sqr(x2)*k2-3*x2*y1)/Z;

{-( FK1 * (Sqr(Fp1.x) + FP1.x * FP2.x - 2 * Sqr(FP2.x)) +

FK2 * (2 * Sqr(Fp1.x) - FP1.x * FP2.x - Sqr(FP2.x)) +

3 * (FP1.x + FP2.x) * (FP2.y - FP1.y) ) / Z;}

FCoeff.C := (Cube(x1)*k2+Sqr(x1)*x2*k2+2*Sqr(x1)*x2*k1-2*Sqr(x2)*x1*k2+6*x1*x2*y2-Sqr(x2)*x1*k1-6*x1*x2*y1-Cube(x2)*k1)/Z;

{( Sqr(Fp1.x) * (Fk2 * (FP1.x + FP2.x) + 2 * FP2.x * FK1)

-Sqr(FP2.x)* (FK1 * (FP1.x + FP2.x) + 2 * FP1.x * FK2)

+ 6 * FP1.x * FP2.x * (FP2.y - FP1.y) ) / Z;}

FCoeff.D := -(-Cube(x1)*y2+Cube(x1)*x2*k2+Sqr(x1)*Sqr(x2)*k1-Sqr(x2)*k2*Sqr(x1)+3*x2*y2*Sqr(x1)-3*Sqr(x2)*y1*x1-x1*Cube(x2)*k1+Cube(x2)*y1)/Z;

{-( 3 * FP1.x * FP2.x * (FP2.y * FP1.x - FP2.x + FP1.y)

+ Fp1.x * FP2.x * (FP1.x - FP2.x) * (FK1 * FP2.x + Fk2 + FP1.x)

- IntPower(FP1.x, 3) * FP2.y + IntPower(Fp2.x, 3) * FP1.y ) / Z;}

if Abs(GetValueIn(x1) - y1) > 1e-6 then

Assert(False);

if Abs(GetValueIn(x2) - y2) > 1e-6 then

Assert(False);

end;

А функція GetErmith отримує по ним значення в шуканій точці

function TInterpolator1D.GetErmith(APoint: Double): Double;

begin

result := FCoeff.A * IntPower(APoint, 3) + FCoeff.B * Sqr(APoint) + FCoeff.C * APoint + FCoeff.D;

end;

TPoint_Float - двохвимірна точка з х та у.

ADerivative1, ADerivative2: Double - похідні.

GetValueIn в даному випадку можна вважати GetErmith.

Висновки

У курсовій роботі було розглянуто різні типи сплайнів та методи інтерполяції функції за їх допомогою. Було отримано програмний код прикладу використання цих методів на практиці у сфері чисельних обрахунків та наведено деякі функції, які керують роботою із сплайнами у ALGLIB .

На основі всього вищевикладеного можна стверджувати, що:

  1. Сплайн — функція, область визначення якої розбита на шматки, на кожному зі шматків функція є деяким поліномом (многочленом);

  2. Для сплайнів є характерними такі ознаки: сплайн складається з фрагментів — функцій одного класу, які різняться лише своїми параметрами; на сусідні фрагменти в точках стикування накладаються певні умови, що зводяться до неперервності значень та деяких перших похідних. Сплайни — напрямок прикладної математики, що інтенсивно розвивається. В Internet міститься широка бібліографія щодо сплайнів (Spline Bibliography Database (SBD));

  3. Інтерполяція — спосіб знаходження проміжних значень величини за наявним дискретним набором відомих значень;

  4. Існує багато різних способів інтерполяції. Вибір найпридатнішого алгоритму залежить від відповідей на питання: наскільки точний обраний метод, які затрати на його використання, наскільки гладкою є інтерполяційна функція, яку кількість точок даних вона вимагає і т.д.;

  5. Основними перевагами сплайн-інтерполяції є її стійкість і мала трудомісткість. Системи лінійних рівнянь, які потрібно вирішувати для побудови сплайнів, дуже добре обумовлені, що дозволяє отримувати коефіцієнти поліномів з високою точністю. У результаті навіть про дуже великих N обчислювальна схема не втрачає стійкість. Побудова таблиці коефіцієнтів сплайна вимагає O(N)операцій, а обчислення значення сплайна в заданій точці - усього лише O(log(N)).

Представлені результати широко використовуються в обчислювальній математиці. Під час виконання роботи були закріплені знання та навички використання мов Object Pascal та Java.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]