MATLAB Language
Interpolering med MATLAB
Sök…
Syntax
- zy = interp1 (x, y);
- zy = interp1 (x, y, 'metod');
- zy = interp1 (x, y, 'metod', 'extrapolering');
- zy = interp1 (x, y, zx);
- zy = interp1 (x, y, zx, 'metod');
- zy = interp1 (x, y, zx, 'metod', 'extrapolering');
Piecewise interpolation 2 dimensionell
Vi initialiserar uppgifterna:
[X,Y] = meshgrid(1:2:10);
Z = X.*cos(Y) - Y.*sin(X);
Nu sätter vi de punkter där vi vill interpolera:
[Vx,Vy] = meshgrid(1:0.25:10);
Vi kan nu utföra närmaste interpolering,
Vz = interp2(X,Y,Z,Vx,Vy,'nearest');
linjär interpolation,
Vz = interp2(X,Y,Z,Vx,Vy,'linear');
kubisk interpolering
Vz = interp2(X,Y,Z,Vx,Vy,'cubic');
eller splineinterpolation:
Vz = interp2(X,Y,Z,Vx,Vy,'spline');
Piecewise interpolation 1 dimensionell
Vi kommer att använda följande data:
x = 1:5:50;
y = randi([-10 10],1,10);
Härmed är x
och y
koordinaterna för datapunkterna och z
är de punkter vi behöver information om.
z = 0:0.25:50;
Ett sätt att hitta y-värdena för z är delvis linjär interpolering.
z_y = interp1(x,y,z,'linear');
Här räknar man ut linjen mellan två angränsande punkter och blir z_y
genom att anta att punkten skulle vara ett element i dessa linjer.
interp1
ger andra alternativ också som närmaste interpolering,
z_y = interp1(x,y,z, 'nearest');
nästa interpolering,
z_y = interp1(x,y,z, 'next');
tidigare interpolering,
z_y = interp1(x,y,z, 'previous');
Formbevarande bitvis kubisk interpolering,
z_y = interp1(x,y,z, 'pchip');
kubisk upplösning, z_y = interp1 (x, y, z, 'v5cubic');
och spline-interpolering
z_y = interp1(x,y,z, 'spline');
Härmed är närmaste, nästa och föregående interpolering i delvis konstant interpolering.
Polynom interpolation
Vi initialiserar data vi vill interpolera:
x = 0:0.5:10;
y = sin(x/2);
Detta betyder att den underliggande funktionen för data i intervallet [0,10] är sinusformad. Nu beräknas koefficienterna för de ungefärliga polynomialerna:
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);
Härmed är x
x-värdet och y
y-värdet för våra datapunkter och det tredje numret är ordningen / graden av polynomet. Vi ställer nu det rutnät vi vill beräkna vår interpoleringsfunktion på:
zx = 0:0.1:10;
och beräkna y-värdena:
zy1 = polyval(p1,zx);
zy2 = polyval(p2,zx);
zy3 = polyval(p3,zx);
zy5 = polyval(p5,zx);
zy10 = polyval(p10,zx);
Man kan se att approximationsfelet för provet blir mindre när graden av polynomet ökar.
Medan tillnärmningen av den raka linjen i detta exempel har större fel, ordnar polynom ordning 3 ungefär sinusfunktionen i detta intervall relativt bra.
Interpolationen med ordning 5 och ordning 10 polynom har nästan inget apprroximeringsfel.
Men om vi tar hänsyn till prestandan utanför provet ser man att för höga beställningar tenderar att överföra och därför fungerar dåligt ur provet. Vi sätter
zx = -10:0.1:40;
p10 = polyfit(X,Y,10);
p20 = polyfit(X,Y,20);
och
zy10 = polyval(p10,zx);
zy20 = polyval(p20,zx);
Om vi tar en titt på handlingen ser vi att resultatet av provet är bäst för ordningen 1
och blir allt värre med allt högre grad.