% aufgabe 9, numerik 1, Bibiana 5600816, Marina 5622011, Thomas 5610641
%% eingabe: n x-koordinaten als vektor
%%          n y-koordinaten als vektor
%% ausgabe: koeffizentenvektor den man so in polyval einsetzen kann.
function p=interpol(xi,yi);
c=1:length(yi);
%% zunaechst einmal berechnen wir die newtonkoeffizienten des polynomes.
%% anders als in der vorlesung vorgelesen wird hier aber nicht die untere matrix
%% berechnet, sondern die obere
%%
%%   x - x - x - x
%%   x / x / x /
%%   x / x / 
%%   x /
%% die newtonkoeffizienten stehen dann oben.
%%
%% jeder neue eintrag wird aus den dividierten differenzen gebildet.
%% ueber dem bruchstrich bildet man die differenz der beiden funktionswerte die
%% 1. in der gleichen zeile stehen  g(j)
%% 2. in der zeile darunter stehen  g(j+1)
%% und teilt das durch 
%% 1. die x-koordinate der zeile xi(j)
%% 2. minus die x-koordinate, i zeilen darunter xi(j+i)
%% dadurch entsteht eine matrix, weil es aber ausreicht die spalte vorher (g)
%% zubetrachten, konzentriert sich diese implementierung nur auf den aktuellen
%% spaltenvektor (h).
g=yi; %% in der ersten spalte stehen die uebergebenen funktionswerte
c(1)=g(1);
for i=1:length(yi)-1
	h=1:length(g)-1;
	for j=1:length(g)-1
		h(j)=(-g(j+1)+g(j))/(-xi(j+i)+xi(j));
	end
	c(i+1)=h(1);  %% der neue newtonkoeffizient steht ganz am anfang.
	g=h;
end
c
%% um aus der newtondarstellung eine vernuenftige koeffizientendarstellung
%% zu gewinnen muss man sich im prinzip so eine matrix bauen:
%% 1        0          0    0       
%% 1       -a          0    0      a
%% 1     -a-b         ab    0      b
%% 1   -a-b-c ab-(-a-b)c -abc      c
%% also links alles einsen, und dann die zeile darueber plus einen hoch und links mal das neue x.
%% dann multipliziert man c0 mit der hauptdiagonalen, addiert das ganze, und
%% hat a0 der ueblichen polynomdarstellung. 
%% dann c1 mit der diagonalen darunter, addieren, und schon hat man den 
%% koeffizeiten fuer x^1.
%% dann c2 mit der diagonalen DARUNTER, addieren, koeffizeiten fuer x^2.
%% usw. war ganz schoen heftig, sich das auszudenken. aber klappt ;-)
a=zeros(length(c),length(c));
for i=1:length(a)
	a(i,1)=1;	
end
for i=2:length(xi)
	for j=1:length(xi)-1
		a(i,j+1)=a(i-1,j+1)-xi(i-1)*a(i-1,j);
	end
end
%% und jetzt den richtigen koeffizientenvektor berechnen
p=zeros(1,length(a));
for i=1:length(a)
	for j=i:-1:1
		p(length(a)-i+j)=p(length(a)-i+j)+a(i,j)*c(i);
	end 
end
