MATLAB Language
Interpolatie met MATLAB
Zoeken…
Syntaxis
- zy = interp1 (x, y);
- zy = interp1 (x, y, 'methode');
- zy = interp1 (x, y, 'methode', 'extrapolatie');
- zy = interp1 (x, y, zx);
- zy = interp1 (x, y, zx, 'methode');
- zy = interp1 (x, y, zx, 'methode', 'extrapolatie');
Stuksgewijze interpolatie 2 dimensionaal
We initialiseren de gegevens:
[X,Y] = meshgrid(1:2:10);
Z = X.*cos(Y) - Y.*sin(X);
Het oppervlak ziet er als volgt uit.
Nu stellen we de punten in waar we willen interpoleren:
[Vx,Vy] = meshgrid(1:0.25:10);
We kunnen nu de dichtstbijzijnde interpolatie uitvoeren,
Vz = interp2(X,Y,Z,Vx,Vy,'nearest');
lineaire interpolatie,
Vz = interp2(X,Y,Z,Vx,Vy,'linear');
kubieke interpolatie
Vz = interp2(X,Y,Z,Vx,Vy,'cubic');
of spline-interpolatie:
Vz = interp2(X,Y,Z,Vx,Vy,'spline');
Stuksgewijze interpolatie 1 dimensionaal
We zullen de volgende gegevens gebruiken:
x = 1:5:50;
y = randi([-10 10],1,10);
Hierbij zijn x
en y
de coördinaten van de gegevenspunten en z
zijn de punten waarover we informatie nodig hebben.
z = 0:0.25:50;
Een manier om de y-waarden van z te vinden is een stukgewijze lineaire interpolatie.
z_y = interp1(x,y,z,'linear');
Hierbij berekent men de lijn tussen twee aangrenzende punten en krijgt z_y
door aan te nemen dat het punt een element van die lijnen zou zijn.
interp1
biedt ook andere opties zoals dichtstbijzijnde interpolatie,
z_y = interp1(x,y,z, 'nearest');
volgende interpolatie,
z_y = interp1(x,y,z, 'next');
vorige interpolatie,
z_y = interp1(x,y,z, 'previous');
Vormbehoudende stukjes kubieke interpolatie,
z_y = interp1(x,y,z, 'pchip');
kubieke convolutie, z_y = interp1 (x, y, z, 'v5cubic');
en spline-interpolatie
z_y = interp1(x,y,z, 'spline');
Hierbij zijn de meest nabije, volgende en vorige interpolatie stuksgewijs constante interpolaties.
Polynomiale interpolatie
We initialiseren de gegevens die we willen interpoleren:
x = 0:0.5:10;
y = sin(x/2);
Dit betekent dat de onderliggende functie voor de gegevens in het interval [0,10] sinusvormig is. Nu worden de coëfficiënten van de benaderende polynómials berekend:
p1 = polyfit(x,y,1);
p2 = polyfit(x,y,2);
p3 = polyfit(x,y,3);
p5 = polyfit(x,y,5);
p10 = polyfit(x,y,10);
Hierbij is x
de x-waarde en y
de y-waarde van onze gegevenspunten en het derde getal is de volgorde / graad van de polynoom. We stellen nu het raster in waarop we onze interpolatiefunctie willen berekenen:
zx = 0:0.1:10;
en bereken de y-waarden:
zy1 = polyval(p1,zx);
zy2 = polyval(p2,zx);
zy3 = polyval(p3,zx);
zy5 = polyval(p5,zx);
zy10 = polyval(p10,zx);
Men kan zien dat de benaderingsfout voor het monster kleiner wordt wanneer de mate van de polynoom toeneemt.
Hoewel de benadering van de rechte lijn in dit voorbeeld grotere fouten heeft, benadert de orde 3 polynoom de sinusfunctie in dit interval relatief goed.
De interpolatie met polynomen van orde 5 en orde 10 heeft bijna geen benaderingsfout.
Als we echter rekening houden met de prestaties die buiten de steekproef liggen, zien we dat te hoge bestellingen de neiging hebben om over te passen en daarom slecht presteren buiten de steekproef. We zetten
zx = -10:0.1:40;
p10 = polyfit(X,Y,10);
p20 = polyfit(X,Y,20);
en
zy10 = polyval(p10,zx);
zy20 = polyval(p20,zx);
Als we de plot bekijken, zien we dat de out of sample performance het beste is voor de volgorde 1
en wordt steeds erger met toenemende mate.