background image

Podstawy Informatyki 3 – ćwiczenia10 

 

Strona 1 z 8 

Podstawy Informatyki 

Programowanie w Matlab 

 
 

Ć

wiczenia 10 

Wybrane możliwości numeryczne pakietu Matlab – c.d. 

 

 

Interpolacja 

 

Zagadnienie  interpolacji  można  sformułować  następująco:  na  przedziale  <a,  b>  danych  jest 
n+1

  różnych  punktów  x0,  x1,  ...,  xn,  które  nazywamy  węzłami  interpolacji,  oraz  wartości 

pewnej funkcji y=f(x) w tych punktach f(x0)=y0, f(x1)=y1, ..., f(xn)=yn.  
 
Zadaniem  interpolacji  jest  wyznaczenie  przybliżonych  wartości  funkcji  w  punktach  nie 
będących węzłami oraz oszacowanie błędu tych przybliżonych wartości. 
 
W  tym  celu  należy  znaleźć  funkcję  F(x),  zwaną  funkcją  interpolującą,  która  w  węzłach 
interpolacji przyjmuje takie same wartości co funkcja f(x). 
 
Interpolacja  jest  w  pewnym  sensie  zadaniem  odwrotnym  do  tablicowania  funkcji.  Przy 
tablicowaniu,  mając  analityczną  postać  funkcji  budujemy  tablicę  wartości,  przy  interpolacji 
natomiast, na podstawie tablicy wartości funkcji określamy jej postać analityczną. 
 
Standardowe  procedury  Matlaba  realizują  interpolację  za  pomocą  wielomianu  pierwszego 
stopnia  (czyli  funkcji  kawałkami  liniowej),  wielomianu  trzeciego  stopnia  oraz  funkcji 
sklejanych stopnia trzeciego. 

 

Funkcje interpolujące 
yi=interp1(x,y,xi,metoda) 

Zwraca wektor yi, będący wartościami 
funkcji jednej zmiennej y=f(x) w 
punktach określonych wektorem xi
węzły interpolacji określają wektory x i 
y

metoda to łańcuch znaków określający 

metodę interpolującą 

zi=interp2(x,y,z,xi,yi,metoda) 

Zwraca macierz zi, zawierającą wartości 
funkcji dwóch zmiennych z=f(x,y) w 
punktach określonych wektorami xi i yi
węzły interpolacji określają macierze 
x

,y,z 

vi=interp3(x,y,z,v,xi,yi,zi,metoda) 
 

Interpolacja funkcją 3 zmiennych, 
analogicznie jak interp2 

vi=interpn(x1,x2,x3,...,v,y1,y2,y3, 
...)

 

Interpolacja funkcją n zmiennych, 

analogicznie jak interp2 

 
 
 
 

background image

Podstawy Informatyki 3 – ćwiczenia10 

 

Strona 2 z 8 

Metody interpolacji 
 
 ‘linear’ – interpolacja liniowa, 
 ‘spline’ – interpolacja funkcjami sklejanymi stopnia trzeciego, 
 ‘cubic’ lub ‘pchip’ – interpolacja wielomianami stopnia trzeciego, 
 ‘nearest’ – interpolacja wartością najbliższego sąsiada  
 

Wszystkie metody interpolacji wymagają, aby ciąg x był monotoniczny. 
 
Przykład 10.1 
Napisz skrypt, w którym przetestujesz różne metody interpolacji funkcji jednej zmiennej. 
Węzły interpolacji stanowią pary (x

i

, y

i

)

 gdzie x

i

 = 0, 1, 2, ..., 20, natomiast 

 y

i

 = 2sin(x

i

)+sin(2x

i

)+sin(3x

i

 +

π

 

%Przyklad10_1 

 

%INTERPOLACJA skrypt testuje różne metody interpolacji 1-D

 

%

 

%----------interpolowana funkcja-----------------

 

f= inline(

'2.*sin(x)+sin(2.*x)+sin(3.*x +pi)'

);

 

%---------- węzły interpolacji-------------------

 

x=[0:20];

 

y=f(x);

 

%---------- metody interpolacji -----------------

 

x_int=[0:0.1:20];

 

y_int1=interp1(x,y,x_int,

'spline'

);

 

y_int2=interp1(x,y,x_int,

'pchip'

);

 

y_int3=interp1(x,y,x_int,

'nearest'

);

 

y_int4=interp1(x,y,x_int,

'linear'

);

 

%---------------- wykresy------------------------

 

subplot(4,1,1), plot(x,y,

'*'

,x_int,y_int1,

'-r'

)

 

hold 

on

, fplot(f,[0,20])

 

title(

'Metoda funkcji sklejanych'

)

 

subplot(4,1,2),plot(x,y,

'*'

,x_int,y_int2,

'-r'

)

 

hold 

on

, fplot(f,[0,20])

 

title(

'Metoda wielomianow trzeciego stopnia'

)

 

subplot(4,1,3),plot(x,y,

'*'

,x_int,y_int3,

'-r'

)

 

hold 

on

, fplot(f,[0,20])

 

title(

'Metoda najblizszego sasiada'

)

 

subplot(4,1,4),plot(x,y,

'*'

,x_int,y_int4,

'-r'

)

 

hold 

on

, fplot(f,[0,20])

 

title(

'Metoda funkcji liniowych'

)

 

 

 
 
 

Przykład 10.2 
Przyjmując dane z tabeli znajdź wartości funkcji interpolującej w punktach -1; -0.8; -0.6 …. 3 
 

 

-1 

 
 
 
 

background image

Podstawy Informatyki 3 – ćwiczenia10 

 

Strona 3 z 8 

%PRZYKLAD10_2

 

clear 

all

 

% wyczyszczenie pamięci

 

%określenie węzłów interpolacji

 

x=[-1 0 1 2 3];

 

y=[3 5 4 2 6];

 

%określenie punktow xi w ktorych 

 

% znajdujemy interpolowane wartości funkcji yi=f(xi);

 

xi=-1:0.2:3;

 

% interpolacja liniowa

 

yi_lin=interp1(x,y,xi, 

'linear'

);

 

%interpolacja funkcjami sklejanymi

 

yi_spline=interp1(x,y,xi, 

'spline'

);

 

% wykresy

 

plot(x,y,

'*'

, xi, yi_lin,

':'

,xi,yi_spline,

'--'

)

 

legend(

'wezly interpolacji'

'interpolacja liniowa'

'funkcja sklejana'

)

 

 

Interpolacja Lagrange’a 
Interpolacja  za  pomocą  wielomianu  polega  na  znalezieniu  wielomianu 

)

x

L

n

  stopnia  co 

najwyżej  n,  by  wartości  tego  wielomianu  i  funkcji  interpolowanej  w  węzłach  były  sobie 
równe czyli: 

n

n

n

x

a

x

a

x

a

a

x

L

+

+

+

+

=

...

)

(

2

2

1

0

 

 
Zadanie  interpolacji  wielomianowej  posiada  jednoznaczne  rozwiązanie,  czyli  istnieje  tylko 
jeden wielomian spełniający warunek. Wartości współczynników wielomianu wyliczane są ze 
wzoru Lagrange’a: 
 
Szukany wielomian ma postać: 
 

)

)...(

)(

)...(

)(

(

)

)...(

)(

)...(

)(

(

)

(

1

1

1

0

1

1

1

0

0

n

j

j

j

j

j

j

j

n

j

j

n

j

j

n

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

y

x

L

=

+

+

=

 

 

przyjmując, że: 

)

)...(

)(

(

)

(

1

0

n

n

x

x

x

x

x

x

x

=

ω

 

 
wzór Lagrange’a ma wtedy postać: 
 

=

=

n

j

j

n

j

n

j

n

x

x

x

x

y

x

L

0

'

)

(

)

(

)

(

)

(

ω

ω

 

 

gdzie: y

j

 = y(x

j

)

 a ω

n

(x

j

)

 jest wartością pochodnej wielomianu ω(x) w punkcie x

j

. Pozwala to 

na  napisanie  procedury  numerycznej  do  obliczania  wartości  wielomianu  stopnia  n  w 
dowolnym punkcie  x leżącym w przedziale <a, b>. 
 
Przykład 10.3 
Napisz funkcję lagrange.m  obliczającą wartość wielomianu interpolacyjnego Lagrange’a 
stopnia n w dowolnym punkcie (x może być wektorem). Argumentami funkcji powinny być 
również n+1 wymiarowe wektory punktów węzłowych xj i yj
Przetestuj  napisaną  funkcję  interpolując  punkty  węzłowe  leżące  na  krzywej  będącej 
wykresem  funkcji y  = 1/(1+25x

2

).

 Przeprowadź obliczenia dla 3, 5 i 9 punktów leżących  w 

równych odległościach w przedziale <-1; 1>. 
 

background image

Podstawy Informatyki 3 – ćwiczenia10 

 

Strona 4 z 8 

%PRZYKLAD10_3 skrypt sprawdza interpolację wielomianami Lagrange'a

 

 

 

funk=inline(

'1./(1+25*x.^2)'

);

 

x=linspace(-1,1,201);  y=funk(x);

 

 

 

ia=linspace(1,201,3);

 

ib=linspace(1,201,5);

 

ic=linspace(1,201,9);

 

 

 

xia=x(ia); yia=y(ia);

 

x1a=x; x1a(ia)=[];

 

ya=lagrange(xia,yia,x1a,2);

 

 

 

xib=x(ib); yib=y(ib);

 

xlb=x; xlb(ib)=[];

 

yb=lagrange(xib,yib,xlb,4);

 

 

 

xic=x(ic); yic=y(ic);

 

xlc=x; xlc(ic)=[];

 

yc=lagrange(xic,yic,xlc,8);

 

 

 

subplot(2,2,1)

 

fplot(funk,[-1,1])

 

ylim([-1.5 1.5]), title(

'funkcja interpolowana: 1/(1+25x^2)'

)

 

 

 

subplot(2,2,2)

 

fplot(funk,[-1,1]), hold 

on

, plot(xia, yia,

'o'

), plot(x1a,ya,

'--'

)

 

ylim([-1.5 1.5]), title(

'funkcja interpolujaca: wielomian rzedu 2'

)

 

 

 

subplot(2,2,3)

 

fplot(funk,[-1,1]), hold 

on

, plot(xib, yib,

'o'

), plot(xlb,yb,

'--'

 

ylim([-1.5 1.5]), title(

'funkcja interpolujaca: wielomian rzedu 4'

)

 

 

 

subplot(2,2,4)

 

fplot(funk,[-1,1]), hold 

on

, plot(xic, yic,

'o'

), plot(xlc,yc,

'--'

)

 

ylim([-1.5 1.5]), title(

'funkcja interpolujaca: wielomian rzedu 8'

)

 

 

gdzie funkcja lagrange.m ma postać: 
 

function

 [y]=lagrange(xj,yj,x,n)

 

%LAGRANGE wzór interpolacyjny Lagrange'a

 

%LAGRANGE(xj,yj,x,n) oblicza wartości wielomianu interpolacyjnego stopnia n 
%w dowolnym punkcie x dla węzłów xj i odpowiadających im wartości funkcji 
%interpolowanej yj. 

 

%np.: y=lagrange([1 2 3], [1 2 3],1.7,2) daje y=1.7

 

 

 

omega_w=1;s=0;

 

for

 j=1:n+1

 

    omega_w=omega_w.*(x-xj(j));

 

    omega_p=1;

 

    

for

 i=1:n+1

 

        

if

 i~=j

 

            omega_p=omega_p.*(xj(j)-xj(i));

 

        

end

 

    

end

 

    s=s+yj(j)./(omega_p.*(x-xj(j)));

 

end

 

y=omega_w.*s;

 

 

background image

Podstawy Informatyki 3 – ćwiczenia10 

 

Strona 5 z 8 

Aproksymacja  
 
Aproksymacja  jest  innym  zagadnieniem  niż  interpolacja,  chociaż  sformułowanie  jest 
podobne. Załóżmy, że w przedziale <a, b> danych jest n+1 punktów x

0

 = a, x

1

, x

2

, ..., x

n

 = b 

oraz wartości pewnej funkcji y=f(x) w tych punktach. Poszukiwana jest funkcja F(x) dobrze 
przybliżająca  f(x) w przedziale <a, b>, z tym, że, w odróżnieniu od interpolacji, nie żąda się, 
by w podanych punktach obydwie funkcje miały takie same wartości. Pojawia się zatem błąd 
aproksymacji  zdefiniowany  jako  różnica  pomiędzy  wartościami  funkcji  aproksymującej  F  i 
funkcji aproksymowanej f w punktach x

i

i=0, 1,..., n. Zadaniem metody numerycznej jest w 

tym  przypadku  minimalizacja  błędu  aproksymacji.  Aproksymacja  jest  nazywana  również 
dopasowywaniem krzywej do danego zbioru danych. Jeżeli punkty (x

i

y

i

) pochodzą z badań 

eksperymentalnych  nad  procesami  fizycznymi,  to  zwykle  ich  wartości  są  obarczone  błędem 
pomiaru.  Interpolacja,  czyli  wymóg  znalezienia  funkcji  przechodzącej  dokładnie  przez  te 
punkty, w tym przypadku nie ma sensu. 

 

Jedną  z  najpopularniejszych  metod  aproksymacji  jest  aproksymacja  średniokwadratowa, 
zwana  także  metodą  najmniejszych  kwadratów.  Polega  ona  na  minimalizacji  błędu 
aproksymacji  zdefiniowanego  jako  suma  kwadratów  odchyłek  we  wszystkich  punktach 
obliczeniowych: 

[

]

2

0

)

(

)

(

)

(

i

i

n

i

i

x

f

x

F

x

w

=

 

Do  poprawy  przybliżenia  w  wybranych  węzłach  może  być  wykorzystana  funkcja  wagowa 
w(x

i

)

.  Zwykle  jednak  jest  ona  tożsamościowo  równa  jedności,  zatem  wszystkie  odchyłki  są 

jednakowo istotne. 
 
Podstawową  funkcją  jaką  oferuje  Matlab  do  rozwiązania  zadanie  aproksymacji  jest  funkcja  
polyfit

a = polyfit(x, y, n) 

Znajduje  współczynniki  wielomianu  n-tego 
stopnia,  który  w  sensie  najmniejszych 
kwadratów  najlepiej  pasuje  do  serii  danych 
pomiarowych (x, y

 
Uwaga: do obliczania wartości wielomianu:  

W(x,a)=a

1

x

n

+a

2

x

n-1

+...+a

n

x+a

n+1

o  współczynnikach  a  w  punkcie  x  można  wykorzystać  funkcję  polyval(a,  x),  gdzie 
a(1)

  jest  współczynnikiem  stojącym  przy  x

n

,  a(2)

  jest  współczynnikiem  stojącym  przy  x

n-1

....,  a(n+1) jest wyrazem wolnym. 
 
Przykład 10.4 
Przypuśćmy, że mamy następujące dane x

i

 

oraz y

i

  i chcielibyśmy znaleźć najlepsze liniowe 

dopasowanie do tych danych. 

 

x

12 

20 

y

15 

22 

42 

 
%PRZYKLAD10_4 skrypt dopasowuje krzywą do danych pomiarowych 

 

%

 

x=[2 4  7 12 20];

 

y=[3 5 15 22 42];

 

figure, plot(x,y,

'o'

);

 

a=polyfit(x,y,1);

 

background image

Podstawy Informatyki 3 – ćwiczenia10 

 

Strona 6 z 8 

xt=0:25;

 

yt=polyval(a,xt);

 

hold 

on

,  plot(xt,yt,

'r-'

)

 

legend(

'dane pomiarowe'

'dopasowanie'

);

 

 
 
 
Poza  funkcją  polyfit  Matlab  daje  użytkownikowi  narzędzie  Basic  Fitting, 
uruchamiane z menu Tools w oknie graficznym, pozwalające na: automatyczne dopasowanie 
krzywych  sklejanych  (spline)  oraz  wielomianowych  (do  dziesiątego  stopnia),  wyświetlenie 
równania dopasowanej krzywej, obliczenie odchyleń w punktach danych oraz wartości błędu 
aproksymacji  (pierwiastek  z  sumy  kwadratów  odchyleń).  Narzędzie  to  pozwala  w  łatwy 
sposób porównać różne dopasowania i wybrać najlepsze z nich. 

 

Przykład 10.5 
Załóżmy, że obserwujemy pewien proces w czasie t∈<0, 10> , który powinien mieć charakter 
sinusoildalny.  Pomiary  zawierają  jednak  pewien  błąd  losowy.  Za  pomocą  narzędzia  Basic 
Fitting

 dopasować najlepszą krzywą do tych danych. 

 

%PRZYKLAD10_5 wykorzystanie narzędzia Basic Fitting 

 

%

 

t=linspace(0,10,10);   

%momenty pomiaru 0,1,2,...,10

 

y=sin(0.5*t)+0.1*randn(size(t));

%wygenerowane dane pomiar. z błędem losowym

 

plot(x,y,

'o'

);    

%wykres surowych danych pomiarowych

 

 
Po  narysowaniu  surowych  danych  przejdź  do  okna  graficznego  i  z  menu  Tools  wybierz 
polecenie Basic Fitting. Zaznacz kolejno opcje quadraticcubic oraz 4th degree polynomial, a 
następnie zaznacz opcje: Show equations,  Plot residuals oraz Show norm of residuals
Wynik tych poleceń pokazuje poniższy rysunek. 

 

 
Jak widać, spośród tych trzech krzywych najlepsze dopasowanie, mierzone sumą kwadratów 
odchyłek, wykazuje wielomian czwartego stopnia o podanym równaniu. 
 

background image

Podstawy Informatyki 3 – ćwiczenia10 

 

Strona 7 z 8 

Korzystając z funkcji polyfit, możemy dopasowywać do danych również inne krzywe, np. 
wykładnicze: 

  y = ae

bx

  

czy potęgowe 

  y = qx

p

 

Wymaga  to  jednak  wstępnego  przekształcenia  równań  oraz  danych.  Najczęściej  należy 
przekształcić dane do skali logarytmicznej.  
Zauważmy, że logarytmując stronami powyższe równania otrzymamy:  

- dla pierwszego równania:  ln(y) = ln(a)+bx czyli dostaniemy przekształconą krzywą: 

   

 

 

y’ = a

0

+a

1

x

 ,       gdzie  y’ = ln(y),  a

0

 = ln(a)

 oraz a

1

 = b

- dla drugiego równania:  ln(y) = ln(q)+pln(x) czyli dostaniemy przekształconą krzywą: 

   

 

 

y’ = a

0

+a

1

x’

 ,      gdzie  y’ = ln(y),  a

0

 = ln(q)

,  a

1

 = p

 oraz  x’=ln(x) 

 
Możemy  zatem  w  obu  przypadkach  zastosować,  do  tak  zmienionych  danych,  aproksymację 
liniową za pomocą funkcji polyfit. 

 

Przykład 10.6 
W  tabeli  przedstawiono  dane  dotyczące  wahań  ciśnienia  w  czasie,  odczytane  z  pompy 
podciśnieniowej. Dopasuj krzywą P(t) = P

0

e

-t/T

 i znajdź stałe P

0

 oraz T

t

0.5 

1.0 

5.0 

10.0 

20.0 

P

760 

625 

528 

85 

14 

0.16 

Obliczając logarytm obu stron równania otrzymujemy: 

ln(P) = ln(P

0

) – t/T

    czyli   P’ = a

1

t + a

0

  , gdzie  P’=ln(P),  a

1

 = -1/T

, oraz a

0

 = ln(P

0

).

 

Po  wyznaczeniu  zatem  współczynników  a

0

 

i  a

1

  za  pomocą  funkcji  polyfit,  będziemy 

mogli z łatwością obliczyć stałe P

0

 

oraz T

 
%PRZYKLAD10_6 dopasowanie krzywej wykładniczej

 

 

 

t=[0 0.5 1 5 10 20];

 

P=[760 625 528 85 14 0.16]; 

% pierwotne dane

 

Pp=log(P);                 

% dane przekształcone

 

a=polyfit(t,Pp,1);         

% dopasowanie liniowe do przekształconych danych 

 

 

 

P0= exp(a(2));   

%obliczenie stałej P0

 

T = -1/a(1);     

%obliczenie stałej T

 

disp([

'stała P0 = '

,num2str(P0),

', stała T = '

,num2str(T)])

 

 

 

%narysowanie wykresu w skali liniowej

 

twyk=linspace(0,20,20);     

% dane do wykresu

 

Pwyk=P0*exp(-twyk/T);

 

figure, subplot(2,1,1)

 

plot(t,P,

'o'

,twyk, Pwyk,

'r-'

), grid 

on

 

xlabel(

'czas t (s)'

), ylabel(

'Cisnienie'

)

 

title(

'Wykres cisnienia w pompie'

)

 

 

 

%narysowanie wykresu w skali półlogarytmiczenj

 

Pwyk_log= exp(polyval(a,twyk)); 

%dane do wykresu półlogarytmicznego

 

subplot(2,1,2)

 

semilogy(t,P,

'o'

,twyk, Pwyk_log,

'r-'

), grid 

on

 

xlabel(

'czas t (s)'

), ylabel(

'Cisnienie'

)

 

title(

'Wykres semilogarytmiczny cisnienia w pompie'

)

 

background image

Podstawy Informatyki 3 – ćwiczenia10 

 

Strona 8 z 8 

0

2

4

6

8

10

12

14

16

18

20

0

200

400

600

800

czas t (s)

C

is

n

ie

n

ie

Wykres cisnienia w pompie

0

2

4

6

8

10

12

14

16

18

20

10

-1

10

0

10

1

10

2

10

3

czas t (s)

C

is

n

ie

n

ie

Wykres semilogarytmiczny cisnienia w pompie

 

Zadania do ćwiczeń 10 

10.1  Poniższa  tabela  przedstawia  dane  pomiaru  wilgotności  z  roku  1962  dla  stacji 
monitoringowej  Kasprowy  Wierch.  Znajdź  ciągłą  funkcję  zmian  wilgotności  wykorzystując 
znane metody interpolacji. 

Miesiąc 

II  III  IV  V  VI  VII  VIII  IX  X  XI  XII 

wilgotność 

75  90  89  82  92  90  88 

79 

78  68  91  77 

 
10.2  Wykorzystując  narzędzie  Basic  Fitting  znajdź  najlepiej  dopasowaną  krzywą  do 
danych  pomiarowych  dotyczących  stężenia  ozonu  w  atmosferze  pochodzących  z  pewnej 
stacji  meteorologicznej.  Badania  prowadzone  były  przez  miesiąc  co  godzinę,  a  następnie 
obliczono średnie stężenie ozonu dla jednego dnia. 

godz. 

10 

11 

wartość 

67 

61 

50 

35 

33 

38 

70 

90 

105  121  130  130 

godz. 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

wartość 

129  117  101 

91 

100  105 

95 

83 

66 

74 

78 

60 

 

10.3 Wykorzystując funkcję polyfit znajdź wielomian drugiego stopnia, który najlepiej 
aproksymuje funkcję y=sin(x) w przedziale <0, π>. Narysuj wykresy funkcji y=sin(x) oraz 
aproksymującego ją wielomianu. 
 
10.4  Znajdź  parametry  modelu  Malthusa  wzrostu  populacji  N(t)=N

0

e

rt

 

wiedząc,  że  w 

chwilach  t  =  0,  2,  4,  6,  8,  10  wielkość  populacji  wynosiła  odpowiednio:  100,  150,  220, 
330, 500, 740