
- •Курсова робота
- •А) інтерполяція функцій сплайном третього порядку;
- •В) диференціювання на сітці, перехід від сітки до сітки.
- •1. Математичні основи інтерполяції функцій та сплайна
- •Загальні відомості про сплайни
- •Інтерполяція функцій
- •Інтерполяція функцій сплайном
- •2.1 Переваги та недоліки сплайн-інтерполяції, види та характеристики
- •2.2 Інтерполяція функції, заданої таблицею значень кубічними сплайнами (Реалізація Java)
- •3. Реалізація інтерполяції функції сплайнами за допомогою мови програмування object pascal
- •3.1. Лінійна інтерполяція
- •3.2. Алгоритм побудови інтерполяційного кубічного сплайна
- •. Метод прогонки
- •3.4. Код програми на Pascal
- •3.5. Інтерполяція сплайном Ерміта. Код програми на Delphi
- •Висновки
- •Список використаних джерел та літератури
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 .
На основі всього вищевикладеного можна стверджувати, що:
Сплайн — функція, область визначення якої розбита на шматки, на кожному зі шматків функція є деяким поліномом (многочленом);
Для сплайнів є характерними такі ознаки: сплайн складається з фрагментів — функцій одного класу, які різняться лише своїми параметрами; на сусідні фрагменти в точках стикування накладаються певні умови, що зводяться до неперервності значень та деяких перших похідних. Сплайни — напрямок прикладної математики, що інтенсивно розвивається. В Internet міститься широка бібліографія щодо сплайнів (Spline Bibliography Database (SBD));
Інтерполяція — спосіб знаходження проміжних значень величини за наявним дискретним набором відомих значень;
Існує багато різних способів інтерполяції. Вибір найпридатнішого алгоритму залежить від відповідей на питання: наскільки точний обраний метод, які затрати на його використання, наскільки гладкою є інтерполяційна функція, яку кількість точок даних вона вимагає і т.д.;
Основними перевагами сплайн-інтерполяції є її стійкість і мала трудомісткість. Системи лінійних рівнянь, які потрібно вирішувати для побудови сплайнів, дуже добре обумовлені, що дозволяє отримувати коефіцієнти поліномів з високою точністю. У результаті навіть про дуже великих N обчислювальна схема не втрачає стійкість. Побудова таблиці коефіцієнтів сплайна вимагає O(N)операцій, а обчислення значення сплайна в заданій точці - усього лише O(log(N)).
Представлені результати широко використовуються в обчислювальній математиці. Під час виконання роботи були закріплені знання та навички використання мов Object Pascal та Java.