Interpoláció

Contents

A gyakorlatban sokszor előfordul, hogy egy ---akár ismeretlen--- függvénynek csak néhány ponjában ismerem az értékét de szeretnék egy közelítő fügvvényt adni az eredetire.

Lineáris Interpoláció

Ez a legegyszerűbb módszer, a két legközelebbi függvényértéken kereszült húzok egy egyenest és így közelítem a függvényértéket (töröttvonallal öszekötöm a pontokat)

x=[0,pi/3,pi/2] % alappontok itt tudom a függvény értékét
y=[0,sqrt(3)/2,1]; % függvényértékek (ezeket mérem)
hol=0.3; % melyik pontban vagyok kiváncsi a közelítés értékére
ert=interp1(x,y,hol) % A közelítés értéke
x =

         0    1.0472    1.5708


ert =

    0.2481

Ez gyors eredményt ad, csrébe viszont nem túl pontos. Itt például a szinusz függvényt közelítjük. Kirajzolhatkjuk azt is, hogy mi lenne a valódi érték.

plot(x,y,hol,ert,'r+',hol,sin(hol),'go')
legend('lineáris interpoláció','közelített függvényérték','valódi függvényérték')

Spline interpoláció

A spline interpolációnál alacsony fokú függvényeket "fűzünk" össze amik átmennek az adott pontokon, és ahol kapcsolódnak ott a deriváltjuk azonos (nincs bennük törés)

ert2=spline(x,y,hol);
t=linspace(0,1);
plot(t,sin(t),hol,ert,'r+',hol,ert2,'go')
legend('valódi függvény','lineárisan közelített függvényérték','spline-al közelített függvényérték')

Megnézhetjük hogy mivel közelítjük a valódi függvényt:

sokertek=spline(x,y,t);
plot(t,sin(t),t,sokertek,hol,ert,'r+',hol,ert2,'go')
legend('valódi függvény','spline','lineárisan közelített függvényérték','spline-al közelített függvényérték')

Ha nagyobb intervallumon nézzük akkor látjuk, hogy a megadott három ponton átmegy a spline.

t=linspace(0,pi/2);
sokertek=spline(x,y,t);
plot(t,sin(t),t,sokertek,'r',x,y,'mo')
legend('valódi függvény','spline','A közelített pontok')

Adott fokszámú polinom illesztése

Azt is csinálhatjuk, hogy a megadunk n pontot, és utána megkeressük azt az n-1 fokú polinomot ami átmegy a megadott pontokon.

egyutthatok=polyfit(x,y,2) % A polyfit megadja a közelítő polinom együtthatóit
polyval(egyutthatok,hol) % A polyval az együtthatókból meghatározza az adott pont(ok)ban a ploinom értékét
t=linspace(-1,5);
plot(t,sin(t),t,polyval(egyutthatok,t))
legend('Eredeti függvény','illesztett függvény')
egyutthatok =

   -0.3636    1.2077    0.0000


ans =

    0.3296

órai Feladat

Írjunk olyan scriptet ami közelíti 1/(1+x^2) függvényt, a [-5,5] intervallumon. Bemenete legyen egy szám ami megadja hogy hány pontban közelítem. polyfittel ad egy n-1-ed fokú polinomközelítést. Majd kirajzolja az eredeti és a közelítő függvényt.

function kozelit(n)
x=linspace(-5,5,n);
y=1./(1+x.^2);
ehato=polyfit(x,y,n-1);
t=linspace(-5,5);
plot(t,1./(1+t.^2),t,polyval(ehato,t),x,y,'go');
end
kozelit(5)
kozelit(15)
Warning: Polynomial is badly conditioned. Add points with distinct X values,
reduce the degree of the polynomial, or try centering and scaling as described
in HELP POLYFIT. 

Házi feladat:

írjunk olyan scriptet ami a [0.5,1,1.5,2,2.5,3,3.5] alappontokban a [3.27,6.1,9.7,12.9,15.1,19.4,21.3] értékekekt a legjobban közelítő egyenest adja meg. A script visszatérő értéke legyen az egynes meredeksége.

Bónusz házi feadat:

Írjunk jobbkozelito nevű függvényt ami úgy működik, hogy ha 10-nél több pontot adok meg, akkor spline-nal közelít és ábrázolja a végeredményt.