You are on page 1of 10

Po

olitechnika Św
więtok
krzysska
wK
Kielcaach

Wyydział Elektro
E otechniiki, Auttomaty
yki i Infformattyki
kierunek inform
matyka

Zadaniee projeektowee z prze


Z edmiottu
Podsstawy P Prograamowa ania 2

Mateusz
M Boś, Daniel Błłachut grup
pa 111A
 
Interpolacja 
Interpolacja polega na przybliżaniu funkcji na podstawie znanych punktów (węzłów interpolacji). 
W przypadku interpolacji najbardziej istotnym jest, aby funkcja interpolacyjna przechodziła dokładnie 
przez zadane węzły, mniej ważne jest to, w jaki sposób funkcja ta będzie zachowywała się pomiędzy 
tymi  węzłami.  Właśnie,  dlatego  jest  ona  szczególnym  przypadkiem  aproksymacji,  w  której  funkcja 
aproksymująca w węzłach ma jedynie wartości zbliżone do zadanych wcześniej z góry. 
 Istnieje wiele algorytmów/metod interpolacji, między innymi interpolacja Newtona (równoważna 
w swoim wyniku z interpolacja LaGrange’a), interpolacja Taylora (używana w celu interpolacji funkcji, 
gdy  znane  są  jej  pochodne),  interpolacja  Pade(odpowiednik  interpolacji  Taylora,  z  tym,  że  tutaj 
funkcja  interpolacyjna  jest  funkcją  wymierną),  interpolacja  funkcjami  sklejanymi(pierwszego, 
trzeciego stopnia). Interpolacja jest używana w wielu dziedzinach począwszy od grafiki a skończywszy 
na  numerycznych  metodach  obliczania  całek  czy  pochodnych.  Jest  ona  również  używania  w 
medycynie,  co  oczywiste  nie  do  bezpośredniego  leczenia  pacjentów,  a  do  ułatwiania  diagnostyki, 
poprzez  chociażby  poprawianie  jakości  zdjęć  otrzymywanych  z  aparatów  takich  jak  rezonans 
magnetyczny (MRI), tomograf komputerowy (CT) czy pozytronowy emisyjny tomograf komputerowy 
(PET‐CT).  Służy  ona  również  do  ułatwiania  obliczeń  poprzez  zastąpienie  bardziej  skomplikowanych 
wzorów funkcji prostszymi, np. wielomianami. Mimo tego, że nie wszystkie z zastosowań interpolacji 
zostały wyżej wymienione widać jak duże znaczenie ma ona w życiu każdego z nas, choć na co dzień 
trudno jest to zauważyć.  
 
 
 Cel Projektu 
 
 Celem projektu było napisanie programu wykonującego interpolację wielomianową dla zadanych 
punktów.  Program  z  założenia  musiał  być  odporny  na  błędy  użytkownika  oraz  błędy  związane  z 
obsługą danych lub plików. 
 
 
 
Opis implementacji 
 
Wybrana  została  metoda  interpolacji  za  pomocą  wielomianów  LaGrangre’a,  natomiast  sam 
program został napisany w języku Pascal oraz środowisku Lazarus (w wersji 0.9.28). Projekt  składa 
się  z  sześciu  modułów  (w  kolejności  alfabetycznej)  :  inputDataUnit,  interpolation,  mainModule,  
myTypes,  polynomial, subsidaryFunctions. 
 Funkcje  oraz  procedury  zawarte  w  modułach  zostały  podzielone  ze  względu  na  wykonywane 
operacje  albo  ich  przydatność  w  określonym  celu.  Na  potrzeby  programu  zaimplementowane 
zostały dwie struktury danych: polynomial oraz inputStruct. 
 
  
 
 
 
Dane w
wejściowe
e   
  Danne  wejścciowe  mają 
m nasstępującą  postać:
   
  Jak  widać  są  to ostaci  zmien noprzecinko
o  liczby  w  po owej,  jako 
  sepaarator  częśści  całkowittej  i  ułam kowej  zosttał  użyty  oodcięta|rzędn
na 
  przeecinek (kod A ASCII 44) natomiast, jakoo separator  odciętej i  1,00|3,010 
  rzęd
dnej użyto piionowej kresski (znaku o kkodzie ASCI 1 124).  2,930|3,90    
    1 
13,89|2,7891
  Danne  wejścio owe  po  pomyślnej  walidacji  zostają 
  przeekształcone  w  listę  za awierającą  wartości  odciętej 
o i 
  rzęd
dnej. W ten ssposób długo ość danych w wejściowych nie jest z 
  góryy  ograniczonna  przez  stałłą  wartość  z apisaną  w  programie 
p
  (np.. rozmiar tabblicy). 
   
  Wallidacja  danyych  wejściow wych  polega  na  sprawdzeniu  czy 
  wprrowadzane  dane  są  jedynie  licz bami  (nie  wliczając 
  sepaaratorów),  oraz 
o zliczeniu  ilości  znaaków  przecinka  (jeśli 
  różnne od dwóch h, oznacza to błąd). 
 

Reprezzentacja w
wielomian
nu 
 
W  ceelu  umożliwienia  przechhowywania  w wielomianu  oraz  wykon nywania  na  nim  operacjji  została 
napissana  specjallna  struktura  danych,  bazująca    na n liście  dwwukierunkowwej  z  wartownikami. 
Strukktura  ta  zosstała  nazwana    Polynom mial  znajduje  się  ona  w  module  o  nazwie  myTypes, 
m
natommiast wszelkkie operacje ppowiązane zz nią znajdująą się w modu ule polynomiial.  Do obsłu
ugi tego  
      typu danych zostały dodane n następujące  procedury: 
   

 procedu ure copy (varr l1,l2:handleer); 
           ko
opiuje listę l1 d
do listy l2. 
  procedu
ure create (va
ar l:handler) ; 
             tw
worzy nową lisstę, 
  procedu ure concat (vvar l1,l2:handdler); 
             łaaczy ze sobą dwie listy wyniik zapisuje w pierwszej, 
  procedu ure concatS ((var l1,l2:hanndler); 
             łącczy ze sobą dw
wie listy, wyniik zapisuje w p
pierwszej  
              (w wielomianów) , 
wariant dla wielomianu będdącego sumą w
  procedu
ure dispose_llist (var l:hanndler); 
             zw e zajmowane pprzez elementty listy po czym usuwa ją, 
walnia miejsce
  procedu ure showPolyy (var outputt:TEdit; const poly:Handler); 
             zaapisuje listę w
w reprezentacjji wielomianowej(razem ze stopniami zm
miennej x) 
               w
w polu Text obbiektu TEdit poodanym jako parametr, 
  procedu ure add_firstt (var l:handl er; dat:data__type); 
             iniicjalizuje listę podanym parrametrem, 
  procedu ure multiply ((var l:handleer; mplr:dataa_type); 
            mnoży całą listęę przez podanny parametr,
  procedu ure divide (va ar l:handler;  divider:dataa_type); 
            dzzieli całą listę przez podany  parametr 
Interpolacja LaGrange’a 
 
 
Jedną  z  odmian  interpolacji  jest  interpolacja  LaGrange’a,  za  jej  pomocą  zawsze  otrzymuje  się 
jednoznaczny  wzór  funkcji  interpolującej.  Poniżej  znajduje  się  wzór  obrazujący  algorytm 
postępowania: 
 
( − )
( )=  
( − )

 
Efektem wykonania tego wzoru jest wielomian stopnia co najwyżej n‐1, przechodzący dokładnie 
przez  wszystkie  węzły.  Zaletą  tej  metody  jest  dokładność  odwzorowania  wartości  w  węzłach 
przez  funkcję  interpolującą.  Wynika  on  z  przedstawionej  wyżej  definicji  tej  metody: 
 
, =
( )=    
0, ≠
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Opis działania algorytmu interpolaacji 
 
Główną funkcją całego proggramu jest:  iinterpolateLa aGrange (...), zwraca onaa zmienną typu 
ndler, będącąą w rzeczywistości dwuellementową ttablicą zawie
han erającą wska źniki na koniec oraz 
pocczątek listy przechowująccej funkcję innterpolującą. Jej kod zosttał przedstaw
wiony w listin
ngu 
ponniżej. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Schemat 1 Pierwsza częśćć schematu blo
okowego powyżższej funkcji 
 
Schemat 2 Druga część sschematu blokowego powyżsszej funkcji 
Algo
orytm zapam
miętania wielomianu dziaała na zauwaażonej zależn
ności.  
 
( − 1)( − 3) = ( − − 0) 
3 ∗ ( − 1) 
                                    ‐ 3
( − 4 + 3) 
 
Otó óż, aby uzyskkać efekt jak powyżej wysstarczy: 
 Skopiowaać ( − 1) , a oryginalny  a wielomian rrozszerzyć o jeden stopieeń, jako wyrraz wolny 
dopisującc  zero.  (Wiielomian  reeprezentowany  jest  przzez  współczzynniki  stoją ące  przy 
odpowied dnich potęga ach zmiennejj): 
1−1+0
                                                                                  1 − 1 
 Pomnożyyć skopiowan ny wielomiann przez wyrazz wolny jedn nomianu ( − 3)  
1−1+0
                                                                            − 3 + 3 
 Zsumowaać oba wielom miany, otrzyymując żądan ny wynik 
1−1 + 0
                                                                    +      − 3 + 3
                                                                         1 − 4 + 3 
 
Jak  widać meto oda ta działa,, jednak jej tteoretycznym m minusem jjest ilość mieejsca w pam mięci jakie 
jest potrrzebne do wyykonania obliczenia [(2*nn +1)*16B] w w szczytowymm momenciee (każdy z ele ementów 
listy ma  dwa wskaźn niki ( 2* 4B) o oraz zmiennąą typu double (8B)). Teoretycznym, pponieważ wiielkość ta 
(dla  10000  elementó ów  ok  30  MB)  w  stosunnku  do  iloścci  pamięci  RAM  R zainstallowanej  w  obecnych 
o
komputeerach  nie  wydaje  w się  byyć  znaczna. Ilość  zajmowanego  mie ejsca  można   ograniczyć  niewiele 
więcej n niż 1/3 zmien niając jedynie typ danychh, na których h operujemyy na single. TTaka zmiana typu dla 
mniejszeej  ilości  węzłłów  interpolacyjnych  niee  jest  zbyt  widoczna,  w jed
dnak  przy  w
większej  ilości  węzłów 
wynik m może nieco o odbiegać od  oczekiwaneggo, z powod du mniejszej  dokładnościi odwzorowa ania liczb 
zmienno oprzecinkowyych przez typ p single. 
 
Opisany wyżej ssposób na zapamiętanie  wykonują prrocedury zaw warte w linia ch: 
  
 26 lub 28 oraz 3 34 do 36 i 38 8, 39. 
 
 27: iif i <> truncToCCardinal(datIn[00]^.x) then 
 26: aadd_first(propeer,getInputX(daatIn,(i+1))) 
28: eelse 
 
29: aadd_first(propeer,getInputX(da
atIn,0)); 
 
... 
 
34: ccopy(proper,temp); 
 
35: mmultiply(temp,(‐getInputX(dattIn,j))); 
 
36: cconcat(proper,ttemp); 
 
... 
 
38: mmultiply(proper,dzielnik); 
 
39: cconcatS(suma,p proper); 
 
 
  Listingg 2. Opisany wyyżej schemat zapamiętywania  wielomianu
Dowód poprawności algorytmu 
 
Obliczenia wykonano dla trzech oraz czterech punktów. W obu przypadkach uzyskano identyczne 
wielomiany, co pozwala wnioskować, że dla każdej ilości podanych węzłów algorytm zachowa się 
poprawnie. 
 
Wyznaczamy węzły z funkcji :     + + 4 
(1,6)(2,10)(3,16) 
 
( − 2)( − 3)
( )=6∗ = 3 ∗ ( − 5 + 6) = 3 − 15 + 18 
(1 − 2)(1 − 3)
( − 1)( − 3)
( ) = 10 ∗ = −10 ∗ ( − 4 + 3) = −10 + 40 − 30 
(2 − 1)(2 − 3)
( − 1)( − 2)
( ) = 16 ∗ = 8 ∗ ( − 3 + 2) = 8 − 24 + 16 
(3 − 1)(3 − 2)

( )= ( ) 

( )= 3 − 15 + 18 − 10 + 40 − 30 + 8 − 24 + 16 = + +  
 
Wielomian wskazany przez program to: 1,0 * x^2 + 1,0 * x^1 + 4,0. 
Jak widać program poprawnie oblicza funkcję interpolującą. 
 
Wyznaczamy węzły z funkcji:  − + − 1 
(1,0)(2,5)(3,20)(4,51) 
 
( − 2)( − 3)( − 4)
( )=0∗ = 0 
(1 − 2)(1 − 3)(1 − 4)
( − 1)( − 3)( − 4)
( )=5∗ = 2,5 − 20 + 47,5 − 30 
(2 − 1)(2 − 3)(2 − 4)
( − 1)( − 2)( − 4)
( ) = 20 ∗ = −10 + 70 − 140 + 80 
(3 − 1)(3 − 2)(3 − 4)
( − 1)( − 2)( − 3)
( ) = 51 ∗ = 8,5 − 51 + 93,5 − 51 
(4 − 1)(4 − 2)(4 − 3)

( )= ( ) 

 
( ) = 0 + 2,5 − 20 + 47,5 − 30 − 10 + 70 − 140 + 80 + 8,5 − 51 + 93,5
− 51 = − + −  
 
Wynik wskazany przez program to: 1,0 * x^3 ‐1,0 * x^2 + 1,0 * x^1 ‐1,0. 
Również w tym przypadku podany wielomian jest poprawny.  
Na podstawie indukcji matematycznej można śmiało powiedzieć, że skoro otrzymujemy wynik 
poprawny dla 3 oraz 4 punktów to, wynik poprawny otrzymamy również dla   węzłów, przy czym 
≥2 ∧ ∈  
 
Uwagi 
Program czasem zwraca wartości bardzo bliskie wyznaczonym, to znaczy, że zamiast pożądanego 
1  zwraca  wartość  0.99(9).  Wynika  to  najprawdopodobniej  z  tego,  jak  organizowane  są  liczby 
zmiennoprzecinkowe  w  pamięci  komputera  oraz  z  błędów  zaokrągleń,  będących  implikacją  tejże 
organizacji. Z tego powodu nie polecamy zmieniać typu danych, w których przechowywane są węzły 
(w  listach)  na  mniej  precyzyjne  w  celu  zmniejszenia  zużycia  pamięci.  Z  drugiej  strony  nie 
zauważyliśmy  zbytniej  poprawy  po  zamianie  typu  przechowywanych  danych  na  extended  (tak  więc 
zwiększając dokładność typu). Błąd ten łatwiej napotkać dla większej ilości węzłów (więcej niż 10).  

You might also like