You are on page 1of 14

Interpoliranje

Interpoliranje je izračunavanje vrednosti između dve poznate tačke. Jednodimenzionalno interpoliranje je


ono kod koga svakoj tački odgovara jedna nezavisna (x) i jedna zavisna promenljiva (y). U MATLAB-u
se jednodimenzionalno interpoliranje obavlja pomoću funkcije interp1
yi=interp1(x,y,xi,’metoda’)
gde je yi interpolirana vrednsot, x je vector s horizontalnim koordinatama tačaka, y je vektor s
vertikalnim koordinatama tačaka (zavisna promenljiva), xi je horizontalna koordinata tačke koja se
interpolira. Metoda interpolacije je opciona komanda. Može biti ‘linear’ – koristi linearno
interpoliranje splajnom, ‘spline’ – koristi kubno interpoliranje splajnom itd.

x
Primer 1 U tabeli su date tačke koje predstavljaju vrednosti funkcije f ( x )=1 .5 cos(2 x) . Primenom
metode linear i spline izračunati vrednosti y između datih tačaka. Nacrtati grafik za svaku metodu
interpolacije. Na svakom grafiku prikazati početne tačke, krivu funkcije i krivu koja predstavlja metodu
interpolacije.
x 0 1 2 3 4 5
y 1.0 -0.6242 -1.4707 3.2406 -0.7366 -6.3717
x=0:1:5;
y=[1 -0.6242 -1.4707 3.2406 -0.7366 -6.3717];
xi=0:1:5;

yilin=interp1(x,y,xi,'linear');
yispl=interp1(x,y,xi,'spline');

yfun=1.5.^xi.*cos(2*x);

subplot(1,2,1), plot(x,y,'*',xi,yilin,xi,yfun,'--')
subplot(1,2,2), plot(x,y,'*',xi,yispl,xi,yfun,'--')

Zadatak 1 Broj stanovnika Kine između 1940. godine i 2000. godine dat je u sledećoj tabeli:
Godina 1940 1950 196 1970 1980 1990 2000
0
Broj stanovnika (u 537 557 682 826 981 1135 1262
milionima)
Interpolirati podatke metodom linear i splajn. Proceniti broj stanovnika 1995. godine pomoću obe
metode. nacrtati grafik tačaka podataka (označene kružićima) i aproksimiranu odnosno u tački (b)
interpoliranu krivu.

god=[1940:10:2000];
brst=[537 557 682 826 981 1135 1262];

godi=[1940:5:2000]; %zadavanje tacaka u kojima se interpol. funkc.


blin=interp1(god,brst,godi,'linear') %linearna interpolacija
blin1995=interp1(god,brst,1995,'linear') %proc. br. st. 1995

bspl=interp1(god,brst,godi,'spline') %splajn interpolacija


bspl1995=interp1(god,brst,1995,'spline') %proc. br. st. 1995
% Crtanje grafika
plot(godi,blin,'--',godi,bspl,'*-'), xlabel('godina'),ylabel('broj
stanovnika'),legend('podaci','linearna interpolacija','splajn
interpolacija');grid on
Najjednostavniji vid interpolacije je interpolacija polinomima. Mi
cemo se iskljucivo baviti ovom vrstom interpolacije. Ako nam je
dato n + 1 tacaka u kojima znamo vrednost funkcije f, tada se moze
pokazati da postoji jedinstven polinom P_n stepena n koji se u svim
tim tackama poklapa sa funkcijom f (ovo je zato sto polinom stepena
n ima n + 1 koeficient koji treba odrediti, a oni se mogu
jednoznacno odrediti pomocu n + 1 uslova na osnovu zadatih
vrednosti u datim tackama).

Dva metoda za odredjivanje interpolacionog polinoma koja cemo


pokazati su metod neodredjenih koeficienata i Lagranzov metod. U
oba slucaja se dobija isti rezultat, jedino je postupak nesto
drugaciji. Metod neodredjenih koeficienata se svodi na resavanje
sistema linearnih jednacina po nepoznatim koeficientima polinoma,
dok se Lagranzov metod svodi na konstrukciju polinoma koji se
predstavlja kao linearna kombinacija polinoma P_i, takvih da je
P_i(x_j) = 1 akko je i = j, a 0 u suprotnom. Obe ove metode bice
demonstrirane kroz primere (pogledati resenja zadataka sa ovog
casa).

1) Metodom neodredjenih koeficienata, odrediti interpolacione polinome (*)


sledecih funkcija:

a) f(0) = 1.5, f(3) = 6.1, f(5) = -4.3


b) f(1) = 3, f(2) = 1
c) f(4) = 12.3, f(5) = 18.1, f(6) = 2.7, f(7) = 3.5, f(8) = -9.2
d) f(0.1) = 2, f(0.2) = 1, f(0.3) = 4, f(0.4) = 0

Nacrtati i grafike dobijenih polinomijalnih funkcija.

2) Za date funkcije odrediti interpolacione polinome stepena 3 i 5 (za


tacke uzeti ravnomerno rasporedjene tacke zadatih intervala):

a) sin(x) na intervalu [0, 2pi]


b) log_10(x) na intervalu [1, 10]
c) e^x na intervalu [0, 5]

3) Lagranzovim metodom odrediti interpolacione polinome funkcija iz


zadatka 1).

4) Implementirati u 0ctave-u opisane metode za odredjivanje


interpolacionog polinoma. Primeniti implementaciju na primerima
sa prethodnog casa.

RESENJE:

a) f(0) = 1.5, f(3) = 6.1, f(5) = -4.3

x = [0, 3, 5]';
y = [1.5, 6.1, -4.3]';
A = [x.^2, x, ones(size(x))];
% iz A*p = y sledi da je p = A\y; tj. resavamo sistem deljenjem matrica
p = A \ y
X = linspace(-1, 6, 100);
Y = polyval(p, X);
plot(x, y, "ro");
grid on;
hold on;
plot(X, Y, "b");
axis equal;

b) f(1) = 3, f(2) = 1

x = [1, 2]';
y = [3, 1]';
A = [x ones(size(x))];
p = A \ y
X = linspace(0, 3, 100);
Y = polyval(p, X);
plot(x, y, "ro");
grid on;
hold on;
plot(X, Y, "b");
axis equal;

Primetimo da je u ovom slucaju polinom stepena 1, tj. linearna


funkcija, koja je u stvari jednacina prave u eksplicitnom obliku.
Do ove jednacine smo mogli doci i primenom analiticke geometrije:
prosto je trebalo naci jednacinu prave kroz dve tacke A(1, 3) i
B(2, 1).

c) f(4) = 12.3, f(5) = 18.1, f(6) = 2.7, f(7) = 3.5, f(8) = -9.2

x = [4:8]';
y = [12.3, 18.1, 2.7, 3.5, -9.2]';
A = [x.^4, x.^3, x.^2, x, ones(size(x))];
p = A \ y;
X = linspace(3, 9, 100);
Y = polyval(p, X);
plot(x, y, "ro");
grid on;
hold on;
plot(X, Y, "b");

d) f(0.1) = 2, f(0.2) = 1, f(0.3) = 4, f(0.4) = 0

x = [0.1:0.1:0.4]';
y = [2, 1, 4, 0]';
A = [x.^3, x.^2, x, ones(size(x))];
p = A \ y
X = linspace(0, 0.5, 100);
Y = polyval(p, X);
plot(x, y, "ro");
grid on;
hold on;
plot(X, Y, "b");
2) Za date funkcije odrediti interpolacione polinome stepena 3 i 5 (za
tacke uzeti ravnomerno rasporedjene tacke zadatih intervala):

RESENJE: U ovom zadatku nam nisu date vrednosti funkcije u konkretnim


tackama, vec nam je data sama funkcija ciju vrednost mozemo izracunati
u proizvoljnoj tacki. Ovu funkciju zelimo da aproksimiramo polinomom
stepena n, pa u tom slucaju sami biramo n+1 tacku iz zadatog intervala
(najbolje je da uzmemo ravnomerno rasporedjene tacke, kako bismo
dobili dobru aproksimaciju na celom intervalu). Kada izaberemo tacke,
izracunamo vrednost funkcije u tim tackama, i time zadatak svodimo
na prethodni slucaj. Ovako nesto se obicno radi kada je funkcija
zadata suvise komplikovanim izrazom, pa je jednostavnije zameniti
je nekim polinomom sa kojim je lakse raditi. U ovom zadatku
bice zanimljivo videti odnos grafika stvarne funkcije i odgovarajuceg
interpolacionog polinoma.

a) sin(x) na intervalu [0, 2pi]

n = 3;
x = linspace(0, 2*pi, n + 1)';
y = sin(x);
A = [];
for i = n:-1:0
A = [A x.^i];
end
p1 = A \ y
n = 5;
x = linspace(0, 2*pi, n + 1)';
y = sin(x);
A = [];
for i = n:-1:0
A = [A x.^i];
end
p2 = A \ y
X = linspace(0, 2*pi, 100);
Y = sin(X);
plot(X,Y,"r");
hold on;
grid on;
Y1 = polyval(p1, X);
plot(X, Y1, "b");
Y2 = polyval(p2, X);
plot(X, Y2, "g");

b) log_10(x) na intervalu [1, 10]

n = 3;
x = linspace(1, 10, n + 1)';
y = log10(x);
A = [];
for i = n:-1:0
A = [A x.^i];
end
p1 = A \ y
n = 5;
x = linspace(1, 10, n + 1)';
y = log10(x);
A = [];
for i = n:-1:0
A = [A x.^i];
end
p2 = A \ y
X = linspace(1, 10, 100);
Y = log10(X);
plot(X,Y,"r");
hold on;
grid on;
Y1 = polyval(p1, X);
plot(X, Y1, "b");
Y2 = polyval(p2, X);
plot(X, Y2, "g");

c) e^x na intervalu [0, 5]

n = 3;
x = linspace(0, 5, n + 1)';
y = exp(x);
A = [];
for i = n:-1:0
A = [A x.^i];
end
p1 = A \ y
n = 5;
x = linspace(0, 5, n + 1)';
y = exp(x);
A = [];
for i = n:-1:0
A = [A x.^i];
end
p2 = A \ y
X = linspace(0, 5, 100);
Y = exp(X);
plot(X,Y,"r");
hold on;
grid on;
Y1 = polyval(p1, X);
plot(X, Y1, "b");
Y2 = polyval(p2, X);
plot(X, Y2, "g");

3) Lagranzovim metodom odrediti interpolacione polinome funkcija iz


zadatka 1).

RESENJE:

a) f(0) = 1.5, f(3) = 6.1, f(5) = -4.3

x = [0, 3, 5];
y = [1.5, 6.1, -4.3];

l1 = [1, -x(1)]; % polinom (x - 0)


l2 = [1, -x(2)]; % polinom (x - 3)
l3 = [1, -x(3)]; % polinom (x - 5)

Q1 = conv(l2, l3);
P1 = Q1/polyval(Q1, x(1));
Q2 = conv(l1, l3);
P2 = Q2/polyval(Q2, x(2));
Q3 = conv(l1, l2);
P3 = Q3/polyval(Q3, x(3));

P = P1*y(1) + P2*y(2) + P3*y(3)


plot(x, y, "ro");
hold on;
grid on;
X = linspace(-1, 6, 100);
Y = polyval(P, X);
plot(X,Y,"b");

b) f(1) = 3, f(2) = 1

x = [1, 2];
y = [3, 1];

l1 = [1, -x(1)]; % polinom (x - 1)


l2 = [1, -x(2)]; % polinom (x - 2)

Q1 = l2;
P1 = Q1/polyval(Q1, x(1));
Q2 = l1;
P2 = Q2/polyval(Q2, x(2));
P = P1*y(1) + P2*y(2)
plot(x, y, "ro");
hold on;
grid on;
X = linspace(0, 3, 100);
Y = polyval(P, X);
plot(X,Y,"b");

c) f(4) = 12.3, f(5) = 18.1, f(6) = 2.7, f(7) = 3.5, f(8) = -9.2

x = 4:8;
y = [12.3, 18.1, 2.7, 3.5, -9.2];

l1 = [1, -x(1)];
l2 = [1, -x(2)];
l3 = [1, -x(3)];
l4 = [1, -x(4)];
l5 = [1, -x(5)];

Q1 = conv(conv(l2, l3), conv(l4, l5));


P1 = Q1/polyval(Q1, x(1));
Q2 = conv(conv(l1, l3), conv(l4, l5));
P2 = Q2/polyval(Q2, x(2));
Q3 = conv(conv(l1, l2), conv(l4, l5));
P3 = Q3/polyval(Q3, x(3));
Q4 = conv(conv(l1, l2), conv(l3, l5));
P4 = Q4/polyval(Q4, x(4));
Q5 = conv(conv(l1, l2), conv(l3, l4));
P5 = Q5/polyval(Q5, x(5));

P = P1*y(1) + P2*y(2) + P3*y(3) + P4*y(4) + P5*y(5)


plot(x, y, "ro");
hold on;
grid on;
X = linspace(3, 9, 100);
Y = polyval(P, X);
plot(X,Y,"b");

d) f(0.1) = 2, f(0.2) = 1, f(0.3) = 4, f(0.4) = 0

x = 0.1:0.1:0.4;
y = [2, 1, 4, 0];
l1 = [1, -x(1)];
l2 = [1, -x(2)];
l3 = [1, -x(3)];
l4 = [1, -x(4)];
Q1 = conv(conv(l2, l3), l4);
P1 = Q1/polyval(Q1, x(1));
Q2 = conv(conv(l1, l3), l4);
P2 = Q2/polyval(Q2, x(2));
Q3 = conv(conv(l1, l2), l4);
P3 = Q3/polyval(Q3, x(3));
Q4 = conv(conv(l1, l2), l3);
P4 = Q4/polyval(Q4, x(4));
P = P1*y(1) + P2*y(2) + P3*y(3) + P4*y(4)
plot(x, y, "ro");
hold on;
grid on;
X = linspace(0, 0.5, 100);
Y = polyval(P, X);
plot(X,Y,"b");

4) Implementirati u 0ctave-u opisane metode za odredjivanje


interpolacionog polinoma. Primeniti implementaciju na primerima
sa prethodnog casa.

[resenja su data u fajlovima lagranzov_polinom.m i neodredjeni_koeficienti.m]

1) Metodom neodredjenih koeficienata odrediti interpolacione


polinome sledecih funkcija:
a) f(1) = 1.5, f(2) = 3.0, f(3) = 4.5

RESENJE:

x = [1,2,3]';
y = [1.5, 3.0, 4.5]';
A = [x.^2 x ones(size(x))];
p = A \ y;
X = linspace(0, 4, 100);
Y = polyval(p, X);
plot(x, y, "ro");
hold on;
grid on;
plot(X,Y,"b");

NAPOMENA: Ispostavlja se da je koeficient a_2 uz x^2 jednak nuli,


tj. dobijeni polinom je linearna funkcija (grafik je prava).

b) f(0.5) = 2.7, f(1.0) = 3.1, f(1.5) = 1.1, f(2.0) = -0.5

RESENJE:

x = [0.5, 1.0, 1.5, 2.0]';


y = [2.7, 3.1, 1.1, -0.5]';
A = [x.^3 x.^2 x ones(size(x))];
p = A \ y;
X = linspace(0, 2.5, 100);
Y = polyval(p, X);
plot(x, y, "ro");
hold on;
grid on;
plot(X,Y,"b");

c) f(1.2) = 1.3, f(1.9) = -4.2, f(2.7) = 0.1

RESENJE:

x = [1.2, 1.9, 2.7]';


y = [1.3, -4.2, 0.1]';
A = [x.^2 x ones(size(x))];
p = A \ y;
X = linspace(1, 3, 100);
Y = polyval(p, X);
plot(x, y, "ro");
hold on;
grid on;
plot(X,Y,"b");

d) f(0) = 0, f(1) = -1.2, f(2) = 3.5, f(3) = 3.0, f(4) = 1.7

RESENJE:

x = [0, 1, 2, 3, 4]';
y = [0, -1.2, 3.5, 3.0, 1.7]';
A = [x.^4 x.^3 x.^2 x ones(size(x))];
p = A \ y;
X = linspace(-1, 5, 100);
Y = polyval(p, X);
plot(x, y, "ro");
hold on;
grid on;
plot(X,Y,"b");

2) Lagranzovom metodom odrediti interpolacione polinome za


funkcije iz prethodnog zadatka.

RESENJE:

a)

x = [1, 2, 3];
y = [1.5, 3.0, 4.5];
l1 = [1, -x(1)];
l2 = [1, -x(2)];
l3 = [1, -x(3)];
Q1 = conv(l2, l3);
P1 = Q1 / polyval(Q1, x(1));
Q2 = conv(l1, l3);
P2 = Q2 / polyval(Q2, x(2));
Q3 = conv(l1, l2);
P3 = Q3 / polyval(Q3, x(3));
P = P1*y(1) + P2*y(2) + P3*y(3);
X = linspace(0, 4, 100);
Y = polyval(P, X);
plot(x, y, "ro");
hold on;
grid on;
plot(X,Y,"b");

b)

x = [0.5, 1.0, 1.5, 2.0];


y = [2.7, 3.1, 1.1, -0.5];
l1 = [1, -x(1)];
l2 = [1, -x(2)];
l3 = [1, -x(3)];
l4 = [1, -x(4)];
Q1 = conv(l2, conv(l3, l4));
P1 = Q1 / polyval(Q1, x(1));
Q2 = conv(l1, conv(l3, l4));
P2 = Q2 / polyval(Q2, x(2));
Q3 = conv(l1, conv(l2, l4));
P3 = Q3 / polyval(Q3, x(3));
Q4 = conv(l1, conv(l2, l3));
P4 = Q4 / polyval(Q4, x(4));
P = P1*y(1) + P2*y(2) + P3*y(3) + P4*y(4);
X = linspace(0, 2.5, 100);
Y = polyval(P, X);
plot(x, y, "ro");
hold on;
grid on;
plot(X,Y,"b");

c)

x = [1.2, 1.9, 2.7];


y = [1.3, -4.2, 0.1];
l1 = [1, -x(1)];
l2 = [1, -x(2)];
l3 = [1, -x(3)];
Q1 = conv(l2, l3);
P1 = Q1 / polyval(Q1, x(1));
Q2 = conv(l1, l3);
P2 = Q2 / polyval(Q2, x(2));
Q3 = conv(l1, l2);
P3 = Q3 / polyval(Q3, x(3));
P = P1*y(1) + P2*y(2) + P3*y(3);
X = linspace(1, 3, 100);
Y = polyval(P, X);
plot(x, y, "ro");
hold on;
grid on;
plot(X,Y,"b");

d)

x = [0, 1, 2, 3, 4];
y = [0, -1.2, 3.5, 3.0, 1.7];
l1 = [1, -x(1)];
l2 = [1, -x(2)];
l3 = [1, -x(3)];
l4 = [1, -x(4)];
l5 = [1, -x(5)];
Q1 = conv(conv(l2, l3), conv(l4, l5));
P1 = Q1 / polyval(Q1, x(1));
Q2 = conv(conv(l1, l3), conv(l4, l5));
P2 = Q2 / polyval(Q2, x(2));
Q3 = conv(conv(l1, l2), conv(l4, l5));
P3 = Q3 / polyval(Q3, x(3));
Q4 = conv(conv(l1, l2), conv(l3, l5));
P4 = Q4 / polyval(Q4, x(4));
Q5 = conv(conv(l1, l2), conv(l3, l4));
P5 = Q5 / polyval(Q5, x(5));
P = P1*y(1) + P2*y(2) + P3*y(3) + P4*y(4) + P5*y(5);
X = linspace(-1, 5, 100);
Y = polyval(P, X);
plot(x, y, "ro");
hold on;
grid on;
plot(X,Y,"b");

3) Za date funkcije, odrediti interpolacione polinome stepena


3, 5 i 10 na datim intervalima:

a) arctg(x) na [-10, +10]


% Najpre crtamo grafik funkcije arctg(x)
X = linspace(-10, 10, 100);
Y = atan(X);
plot(X, Y, "b");
hold on;
grid on;

% Odredjujemo interpolacioni polinom stepena 3


x = linspace(-10, 10, 3);
y = atan(x);
plot(x, y, "ro"); % crtamo tacke
p3 = lagranzov_polinom(x, y);
plot(X, polyval(p3, X), "r");

% Odredjujemo interpolacioni polinom stepena 5

x = linspace(-10, 10, 5);


y = atan(x);
plot(x, y, "ko"); % crtamo tacke
p5 = lagranzov_polinom(x, y);
plot(X, polyval(p5, X), "k");

% Odredjujemo interpolacioni polinom stepena 10

x = linspace(-10, 10, 10);


y = atan(x);
plot(x, y, "go"); % crtamo tacke
p10 = lagranzov_polinom(x, y);
plot(X, polyval(p10, X), "g");

b) 1 / (1 + 25*x^2) na [-1, 1]

% Najpre crtamo grafik funkcije


X = linspace(-1, 1, 100);
Y = 1 ./ (1 + 25 * X.^2);
plot(X, Y, "b");
hold on;
grid on;

% Odredjujemo interpolacioni polinom stepena 3


x = linspace(-1, 1, 3);
y = 1 ./ (1 + 25 * x.^2);
plot(x, y, "ro"); % crtamo tacke
p3 = lagranzov_polinom(x, y);
plot(X, polyval(p3, X), "r");

% Odredjujemo interpolacioni polinom stepena 5

x = linspace(-1, 1, 5);
y = 1 ./ (1 + 25 * x.^2);
plot(x, y, "ko"); % crtamo tacke
p5 = lagranzov_polinom(x, y);
plot(X, polyval(p5, X), "k");

% Odredjujemo interpolacioni polinom stepena 10


x = linspace(-1, 1, 10);
y = 1 ./ (1 + 25 * x.^2);
plot(x, y, "go"); % crtamo tacke
p10 = lagranzov_polinom(x, y);
plot(X, polyval(p10, X), "g");

c) sqrt(ln(x + 1)) / (x^3 + 1) na [0, 1]

% Najpre crtamo grafik funkcije


X = linspace(0, 1, 100);
Y = sqrt(log(X + 1)) ./ (X.^3 + 1);
plot(X, Y, "b");
hold on;
grid on;

% Odredjujemo interpolacioni polinom stepena 3


x = linspace(0, 1, 3);
y = sqrt(log(x + 1)) ./ (x.^3 + 1);
plot(x, y, "ro"); % crtamo tacke
p3 = lagranzov_polinom(x, y);
plot(X, polyval(p3, X), "r");

% Odredjujemo interpolacioni polinom stepena 5

x = linspace(0, 1, 5);
y = sqrt(log(x + 1)) ./ (x.^3 + 1);
plot(x, y, "ko"); % crtamo tacke
p5 = lagranzov_polinom(x, y);
plot(X, polyval(p5, X), "k");

% Odredjujemo interpolacioni polinom stepena 10

x = linspace(0, 1, 10);
y = sqrt(log(x + 1)) ./ (x.^3 + 1);
plot(x, y, "go"); % crtamo tacke
p10 = lagranzov_polinom(x, y);
plot(X, polyval(p10, X), "g");

d) (sin^2(x) + cos(x)) / (cos^2(x) + sin(x)) na [0, pi/2]

% Najpre crtamo grafik funkcije


X = linspace(0, pi/2, 100);
Y = (sin(X).^2 + cos(X)) ./ (cos(X).^2 + sin(X));
plot(X, Y, "b");
hold on;
grid on;

% Odredjujemo interpolacioni polinom stepena 3


x = linspace(0, pi/2, 3);
y = (sin(x).^2 + cos(x)) ./ (cos(x).^2 + sin(x));
plot(x, y, "ro"); % crtamo tacke
p3 = lagranzov_polinom(x, y);
plot(X, polyval(p3, X), "r");

% Odredjujemo interpolacioni polinom stepena 5


x = linspace(0, pi/2, 5);
y = (sin(x).^2 + cos(x)) ./ (cos(x).^2 + sin(x));
plot(x, y, "ko"); % crtamo tacke
p5 = lagranzov_polinom(x, y);
plot(X, polyval(p5, X), "k");

% Odredjujemo interpolacioni polinom stepena 10

x = linspace(0, pi/2, 10);


y = (sin(x).^2 + cos(x)) ./ (cos(x).^2 + sin(x));
plot(x, y, "go"); % crtamo tacke
p10 = lagranzov_polinom(x, y);
plot(X, polyval(p10, X), "g");

Graficki prikazati dobijeni rezultat.

function P = lagranzov_polinom(x, y)

%{
Funkcija odredjuje interpolacioni polinom za tacke (x_i, y_i)
Lagranzovim metodom.
%}

if(length(x) ~= length(y))
printf("x i y moraju biti iste duzine\n");
return;
end

n = length(x) - 1; % Stepen polinoma


P = 0; % Polinom P je inicijalno 0

% Za svaku tacku racunamo polinom Pi koji dodajemo na P


for i = 1:(n+1)

% Polinom Pi se racuna po formuli:


% Pi = (x - x_1)*..*(x - x_{i-1})*(x - x_{i+1})*...*(x - x{n+1}) /
% (x_i - x_1)*...*(x_i - x_{i-1})*(x_i - x_{i+1})*...*(x_i - x{n+1})
% Ovaj polinom P_i ima vrednost 0 u svim tackama x_j osim u tacki x_i u
% kojoj ima vrednost 1.
Pi = 1;
f = 1;
for j = 1:(n+1)
if(j ~= i)
Pi = conv(Pi, [1, -x(j)]);
f = f * (x(i) - x(j));
end
end
Pi = Pi/f;

% Sada na P dodajemo Pi*y(i). Ovaj polinom ima vrednost 0 u svim tackama


x_j,
% osim u tacki x_i u kojoj ima vrednost y_i.
P = P + Pi*y(i);
end
% Dobijeni polinom P ima vrednost y(i) u tacki x(i) (za svako i = 1, ..., n+1)
end

function p = neodredjeni_koeficienti(x, y)

%{
Funkcija odredjuje interpolacioni polinom za tacke (x_i, y_i)
metodom neodredjenih koeficienata.
%}

if(length(x) ~= length(y))
printf("x i y moraju biti iste duzine\n");
return;
end

n = length(x) - 1; % Stepen polinoma


P = 0; % Polinom P je inicijalno 0

% Ukoliko su argumenti dati kao vrste, treba ih pretvoriti u kolone


if(columns(x) > 1)
x = x';
end
if(columns(y) > 1)
y = y';
end

% Formiramo matricu linearnog sistema


%
% x_1^n x_1^{n-1} ... x_1 1
% x_2^n x_2^{n-1} ... x_2 1
% ... ... ...
% ... ... ...
% x_{n+1}^n x_{n+1}^{n-1} ... x_{n+1} 1
A = [];
for i = n:-1:0
A = [A x.^i];
end

% delimo y sa A (sa leve strane) i dobijamo koeficiente polinoma


p = A \ y;

end

You might also like