INTERPOLACE KUBICKÝMI SPLINY

PROBLÉM
Jsou dány hodnoty funkce v bodech A.1<A.2<...<A.N. Odhadněte hodnotu funkce v bodě V z intervalu [A.1,A.N].

DEFINICE
Funkce S se nazývá kubický spline na intervalu [A.1,A.N] jestliže
  • S je na [A.1,A.N] definována;
  • S, první derivace S, druhá derivace S jsou spojité funkce na [A.1,A.N];
  • pro body A. funkce S platí A.1<A.2<...<A.N a S je polynom stupně <=3 na každém intervalu [A.J,A.Jp1], kde Jp1=J+1.

ALGORITMUS
Je dáno pole A.1,...,A.N a B.1,...,B.N. Pole B. obsahuje hodnoty funkce v bodech A., platí A.1<A.2<...<A.N. Jsou dány hodnoty první derivace funkce v bodech A.1 a A.N, které označíme B1A1 a B1AN. Podprogram SPLINE vypočte hodnoty pole B2. - druhé derivace interpolované funkce v zadaných bodech A.; funkce SPLINE je volána jen jednou. Hodnotu funkce v bodě V určí interpolační funkce SPLINT.

IMPLEMENTACE SPLINE
Jednotka: vnitřní podprogram
 
Globální proměnné: vstupní rostoucí posloupnost A.1,...,A.N, vstupní pole B. a výstupní pole B2., které obsahuje vypočítané hodnoty druhé derivace interpolované funkce v zadaných bodech.
 
Parametry: přirozené číslo N, hodnoty B1A1 a B1AN prvních derivací interpolované funkce v bodech A.1 and A.N
 


SPLINE: procedure expose A. B. B2.
N = ARG(1); B1A1 = ARG(2); B1AN = ARG(3)
if B1A1 > 0.99E+99 then do; B2.1=0; U.1=0; end
  else do
    B2.1 = -0.5
    U.1=(3 / (A.2 - A.1)) *,
      ((B.2 - B.1) / (A.2 - A.1) - B1A1)
  end
do J = 2 to N - 1
  Jm1 = J - 1; Jp1 = J + 1
  Sig = (A.J - A.Jm1) / (A.Jp1 - A.Jm1)
  P = Sig * B2.Jm1 + 2
  B2.J = (Sig - 1) / P
  U.J = (B.Jp1 - B.J) / (A.Jp1 - A.J) -,
    (B.J - B.Jm1) / (A.J - A.Jm1)
  U.J = (6 * U.J / (A.Jp1 - A.Jm1) - Sig * U.Jm1) / P
end
Nm1 = N - 1
if B1AN > 0.99E+99 then do; Qn = 0; Un = 0; end
  else do
    Qn = 0.5;
    Un = (3 / (A.N - A.Nm1)) *,
      (B1AN - (B.N - B.Nm1) / (A.N - A.Nm1))
  end
B2.N = (Un - Qn * U.Nm1) / (Qn * B2.Nm1 + 1)
do J = N - 1 to 1 by -1
  Jp1 = J + 1
  B2.J = B2.J * B2.Jp1 + U.J
end
return

 

IMPLEMENTACE SPLINT
Jednotka: vnitřní funkce
 
Globální proměnné: vstupní pole: rostoucí posloupnost A., pole B. a pole B2. vypočítané podprogramem SPLINE
 
Parametry: přirozené číslo N, hodnota V
 
Vrací: odhad hodnoty B.V
 


 
SPLINT: procedure expose A. B. B2.
N = ARG(1); V = ARG(2)
L = 1; H = N
do while (H - L) > 1
  K = (H + L) % 2
  if A.K > V then H = K
    else L = K
end
Q = A.H - A.L
if Q = 0 then
  call ERROR "SPLINT: Vstupní posloupnost musí být rostoucí"
X = (A.H - V) / Q; Y = (V - A.L) / Q
BV = (X**3 - X) * B2.L + (Y**3 - Y) * B2.H
BV = X * B.L + Y * B.H + BV * (Q**2) / 6
return BV
 
ERROR: say ARG(1); exit

 

PŘÍKLAD
Následující program zobrazí

2.52386364
2.71270431


do J = 1 to 6; A.J = J; end
B.1 = 1.1; B.2 = 2.5; B.3 = 2.6
B.4 = 3.0; B.5 = 5.0; B.6 = 4.0
call SPLINE 6, 0, 0
say SPLINT(6, 3.5); say SPLINT(6, 3.8)
exit
SPLINE: procedure expose A. B. B2.
...
SPLINT: procedure expose A. B. B2.
...

 

SOUVISLOSTI

SPOLUAUTOR
Doug Rickman - funkce SPLINE, SPLINT a příklad

Literatura
Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerical Recipes in C : the art of scientific computing
- 2nd ed. University Press, Cambridge, 1992


Obálka Obsah Index Hlavní stránka Rexx   Mail

změněno 25. července 2008
Copyright © 2000-2001 Vladimír Zábrodský, RNDr.