Interpoláció

Contents

Az alapfeladat a következő: adott néhány pont, ahol ismert a függvény értéke (ezeket nevezzük mérési pontnak vagy alappontnak). Célunk, hogy olyan pontokra is meghatározzuk a függvényt, amelyekben nem mértem, ezt nevezzük interpolációs pontnak (ha a pont a két szélső mérési pont közé esik). Ha ezen intervallumon kívűl van, akkor extrapolációnak a nevezik feladatot.

Lineáris interpoláció

A mért értékeket összekötöm egy-egy szakasszal. Ezt e közelítést az interp1 függvény számolja ki:

x=[0   pi/3  pi/2]; % alappontok (itt mértem)
y=[0   sqrt(3)/2 1]; % függvényértékek (ezeket az értékeket)
hol=0.4; % mely pontokon szeretném közelíteni az ismeretlen függvényértékeket
ert=interp1(x,y,hol)
ert =

    0.3308

Ez a fajta közelítés bár gyorsan számolható, de cserébe nem túl pontos. Példaul, ha kiderül, hogy a közelítendő függvény valójában egy sin volt, akkor még a közelítés hibáját is meg tudom mondani:

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

Spline interpoláció

Felhasználhatunk a közelítésre simább függvényt is, ezeket spline-nak hívják és a spline nevű függvénnyel lehet kiszámolni.

ert2=spline(x,y,hol)
ert2 =

    0.4249

t=linspace(0,1);
plot(t, sin(t),hol, ert,'r+',hol,ert2,'k*') % mérési pontokat összekötő vonal =
legend('valódi függvény','becsült függvényérték (lin)', 'becsült függvényérték (spline)')

Összehasonlítva a kettőt láthatjuk, hogy a spline interpoláció sokkal jobb értékeket adott (bár némileg nagyobb a számolási igénye).

Adott fokszámú polinom illesztése

A polyfit paranccsal előre megadott fokszámú polinomot illeszthetünk az adatainkra, az alábbi példában egy parabolát. Ekkor a polyfit parancs a polinom együtthatóit adja vissza.

ehok=polyfit(x,y,2)
ehok =

   -0.3636    1.2077   -0.0000

Ennek segítségével akár egyenes is illeszthető ha elsőfokú polinomot illeszthetünk.

A polyval függvény helyettesít be egy együtthatókkal adott polinomba:

ert3=polyval(ehok, hol)
ert3 =

    0.4249

Itt ábrázolhatjuk az interpolációs polinomot is

t=linspace(0,pi/2);
plot(t,polyval(ehok,t), t, sin(t),'r')
legend('illesztett másodfokú polinom', 'sin')

Viszont...

t=linspace(-1,5);
plot(t,polyval(ehok,t), t, sin(t),'r')
legend('illesztett másodfokú polinom', 'sin')

az extrapoláció (olyan pontban becsülni a függvényértékeket ami kívűl esik a mérési tartományon) kényes feladat, ha lehet kerüljük.

Órai feladatok

2.feladat: Írjunk olyan rungell(n) nevű függvényt, melynek bemenete egy n pozitív egész. A függvény interpolálja egy (n-1)-edfokú polinommal a 1/(1+x^2)függvényt az [-5,5] intervallumon vett n darab egyforma távolságra lévő ponton. Ábrázoljuk az eredeti függvényt és az interpoláló polinomot is a [-5,5] szakaszon. Küldjék be az .m fájl és két darab .jpg képet az n=5 és n=20 értékekkel. Segítség: n=3 esetén a három alappont a -5,0,5 és a "mért értékek" 1/26, 1, 1/26, ekkor másodfokú polinommal kell interpolálni).

function rungell(n)

t=linspace(-5,5,n);
f=1./(1+t.^2);
eho=polyfit(t,f,n-1);

x=linspace(-5,5);
plot(x,1./(1+x.^2), x, polyval(eho,x),'r');
legend('Eredeti függvény', 'Illesztett polinom')



Ennek segítségével jól látszik miért nem interpolálunk magas fokszámú polinommal.

rungell(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. 

Beküldhető házik

1.feladat: Írjunk olyan linkoz(v1,v2) nevű függvényt, melynek első bemente az alappontok egy vektorban sorban elrendezve, a második pedig a mért értékek vektora. A függvény határozza meg ezen értékekre legjobban illeszkedő egyenest, és ábrázolja is a pontokkal együtt. A függvény kimenete legyen az egyenes meredeksége. Vegyük az (0.5, 1, 1.5, 2, 2.5, 3, 3.5) alappontkat, és a (3.27, 6.1, 9.7, 12.9, 15.1, 19.4, 21.3) mért értékeket. Küldjenek be egy jpg fájlt ami az ezen értékeket legjobban közelítő egyenest ábrázolja a pontokkal együtt, és egy darab .m fájlt, amiben a függvény van.

function m=linkoz(v1,v2)

eho=polyfit(v1,v2,1);
m=eho(1);

hold on
plot(v1,v2,'r*');
tartomany=linspace(min(v1),max(v1));
plot(tartomany,polyval(eho,tartomany))



Majd ennek segítségével:

figure(2)
linkoz([0.5, 1, 1.5, 2, 2.5, 3, 3.5],[3.27, 6.1, 9.7, 12.9, 15.1, 19.4, 21.3])
ans =

    6.1493

3. feladat: Írjunk olyan interpolals(x,y,x0) nevű függvény Matlabban, amelynek bemeneti közül az első valós számokból álló sorvektor, a második bemenet pedig egy függvény helyettesítési értékei ezen pontokban szintén egy sorvektorban adva. A függvény kimenete legyen az ezen pontokra illesztett spline interpoláló polinom helyettesítési értéke az x0 pontban.

function ki=interpolals(x,y,x0) 

ki=spline(x,y,x0);