Vandermondematris
Uppgiften lyder:
Gör en funktion, som tar en en kolonnvektor med interpolationsnoder och en kolonnvektor med motsvarande funktionsvärden, som interpolanten ska anta i noderna. Beräkna ett interpolationspolynom av grad 𝑛, där 𝑛+1 är antalet datapunkter. Din funktion ska alltså ta vektorerna [𝑥0𝑥1…𝑥𝑛]𝑇[ och [𝑓0𝑓1…𝑓𝑛]𝑇 som input, och den ska returnera koefficienterna [𝑐0𝑐1…𝑐𝑛]sådana att interpolanten𝑃𝑛(𝑥)=𝑐0+𝑐1𝑥+…+𝑐𝑛𝑥^n
uppfyller 𝑓(𝑥𝑘)=𝑓𝑘 för alla 𝑘=0,1,…,𝑛 Använd för enkelhets skull den naiva metoden.
Din funktion ska förutom koefficientvektorn c också returnera det interpolerande polynomet som en anonym funktion.
Det här är programmeringskoden som jag hittills fyllt i:
clear variables
x=[-1 0 1]' % Sätt in dina egna noder och värden
f=[-9 -8 -15]'
naiv(x,f)
function [koefficienter,interpolant]=naiv(noder,varden)
n=length(x); % FYLL I
V=[]; % FYLL I
for k=0:n-1
V= % FYLL I
end
koefficienter=inv(V)*varden; % FYLL I
interpolant=@(x) polyval(flipud(koefficienter),x); % Bra som den är, rör ej
end
Vet inte vad jag ska sätta in mer för att få det att fungera??
Såhär kan du skapa en Vandermonde-matris med hjälp av de noder du anger i vektor x:
n = length(x) - 1;
V = zeros(n+1, n+1);
for i = 1:n+1
V(i, :) = x(i).^(0:n);
end
Sedan kan du lösa ekvationssystem för att få dina kofficienter c:
c = V \ f;
R0BRT skrev:Såhär kan du skapa en Vandermonde-matris med hjälp av de noder du anger i vektor x:
n = length(x) - 1; V = zeros(n+1, n+1); for i = 1:n+1 V(i, :) = x(i).^(0:n); end
Sedan kan du lösa ekvationssystem för att få dina kofficienter c:
c = V \ f;
Okej, tack!
Är detta också en lösning?
x=[-1 0 1]'
f=[-9 -8 -15]'
naiv(x,f)
function [koefficienter,interpolant]=naiv(noder,varden)
V= fliplr(vander(noder)); %VANDERMONDEMATRIS
koefficienter= inv(V)*varden;
interpolant=@(x) polyval(flipud(koefficienter),x);
end
Det är riktigt att det går att använda 'vander'-funktionen för att skapa matrisen. Den genererar en matris där kolumnerna är i omvänd ordning jämfört med exemplet, därför kan du använda 'fliplr' för att vända kolumnerna.