Professional Documents
Culture Documents
Sprawozdanie Bos Blachut 111 A
Sprawozdanie Bos Blachut 111 A
olitechnika Św
więtok
krzysska
wK
Kielcaach
Wyydział Elektro
E otechniiki, Auttomaty
yki i Infformattyki
kierunek inform
matyka
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).