Interpolacija funkcija¶

Zamislimo da imamo skup točaka, te da kroz njih želimo provući polinom najmanjeg stupnja. To možemo učiniti na sljedeći način,koristeći funkciju polyfit koja uzima točke i stupanj polinoma (koji je jednak broju točaka minus 1). Funkcija polyfit vraća koeficijente polinoma, dok poly1d konstruira funkciju od tih koeficijenata

In [3]:
import numpy as np
import matplotlib.pyplot as plt

x=np.array([2 ,4 , 6, 8, 10 , 12, 14, 16, 18, 20, 22, 24])
f=np.array([0.0 ,0.35 , 0.46, 0.48, 0.50, 0.39,0.27,0.18,0.13,0.09, 0.07, 0.05])
p11 = np.poly1d(np.polyfit(x, f, 11))


xp = np.linspace(2, 24, 100)

plt.plot(x, f, '.', xp, p11(xp), '-')
Out[3]:
[<matplotlib.lines.Line2D at 0x1a7c7141160>,
 <matplotlib.lines.Line2D at 0x1a7c71412e8>]
No description has been provided for this image

U predavanjima zadnjeg tjedna prvog ciklusa, vidjet ćemo i tzv. kubične splajnove, što su posebni tipovi glatkih funkcija koje prolaze kroz zadane točke. U sljedećem kodu smo provukli kroz zadane točke tzv. kubični splajn.

In [4]:
from scipy.interpolate import CubicSpline
cs = CubicSpline(x, f)
fig, ax = plt.subplots(figsize=(6.5, 4))
plt.plot(x, f, 'bo', label="Data")
plt.plot(xp, p11(xp),label="p11(x)")
plt.plot(xp, cs(xp),label="kubni splajn")
ax.legend(loc='upper right')
plt.savefig("interpolacija.eps") 
No description has been provided for this image

U sljedećem videu možete saznati što je to interpolacija i njezine osnove

In [5]:
from IPython.lib.display import YouTubeVideo
vid = YouTubeVideo("iUr9-RmpZyw")
display(vid)

Primjer iz video prezentacije

In [182]:
x=np.array([0 ,1 , 2, 3])
y=np.array([-5 ,-6, -1, 16])
a=np.array([1,0 , -2, -5])
z=np.linspace(0.0, 3.25, 50)
pp=np.polyval(a,z)
plt.plot(x, y, 'bo', label="Data")
plt.plot(z, pp,label=r'$p(x)$')
plt.legend(loc='upper left')
Out[182]:
<matplotlib.legend.Legend at 0x216129f2eb8>
No description has been provided for this image

Dolje vidimo primjer implementacije hornerovog algoritma no ta funkcija zapravo radi isto što i polyval. Nakon toga imamo primjer koji ukazuje na lošu uvjetovanost Vandermondeove matrice pa ne dobivamo polinom koji prolazi kroz zadane točke.

In [183]:
del a
del x
del y
del z
from scipy.linalg import lu_factor, lu_solve

def horner(a, x):
    v = a[0]
    #print(a.shape[0])
    for i in range(1, a.shape[0]):
        v = x * v + a[i]
    return v


n=40
x=np.linspace(0.0,20*np.pi,n+1, endpoint=True)
xu=np.linspace(0.0,20*np.pi,1000, endpoint=True)
y=np.sin(x)
V=np.vander(x,len(x), increasing=True)
print("Condition=", np.linalg.cond(V))
#lu, piv = lu_factor(V)
#a = lu_solve((lu, piv), y)
a=np.linalg.solve(V,y)
c=np.flipud(a)
f=np.polyval(c,x)
k=horner(c,x) # isto kao i polyval, izvrednjavanje polinoma
plt.plot(x,y,'bo', label="Data")
plt.plot(x,f, label=r'$p(x)$')
plt.legend(loc='upper left')
plt.savefig("sinus.png") 
Condition= 7.6049026858454115e+71
No description has been provided for this image

Lagrangeov interpolacijski polinom¶

In [188]:
vid = YouTubeVideo("_55i23E8IyA")
display(vid)

Sada vidimo primjer interpolacije Lagrangeovim interpolacijskim polinomom

In [170]:
def polyinterp(x,y,u):
    n=len(x)
    v=np.zeros(np.size(u))
    for k in range(n):
        w=np.ones(np.size(u))
        for j in range(k):
            w=(u-x[j])/(x[k]-x[j])*w
        for j in range(k+1,n):
            w=(u-x[j])/(x[k]-x[j])*w
        v=v+w*y[k]
    return v

n=40
x=np.linspace(0.0,20*np.pi,n+1, endpoint=True)
y=np.sin(x)
xu=np.linspace(0.0,20*np.pi,1000, endpoint=True)
v=polyinterp(x,y,xu)
plt.plot(x,y,'bo', label="Data")
plt.plot(xu,v, label=r'$p(x)$')
plt.ylim(-10,10)
Out[170]:
(-10, 10)
No description has been provided for this image

Pogreška interpolacije¶

In [189]:
vid = YouTubeVideo("tVgrkWqOI6o")
display(vid)
In [ ]: