Interpolation

In [1]:
x = -6:1:6
y = sin(x);

figure(1);
plot(x, y);
x =

  -6  -5  -4  -3  -2  -1   0   1   2   3   4   5   6

Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1 -0.5 0 0.5 1 -6 -4 -2 0 2 4 6 gnuplot_plot_1a
In [2]:
% create a much finer spaced points in x
xi = linspace(x(1), x(end), 10000);

% interpolate to get finer spaed points for y
yi = interp1(x, y, xi);
yi(1:20)
ans =

 Columns 1 through 8:

   0.27942   0.28023   0.28105   0.28186   0.28268   0.28349   0.28431   0.28512

 Columns 9 through 16:

   0.28594   0.28675   0.28757   0.28839   0.28920   0.29002   0.29083   0.29165

 Columns 17 through 20:

   0.29246   0.29328   0.29409   0.29491

In [3]:
figure();
plot(x, y, 'x'); % plot original data as individual points
hold on;
plot(xi, yi); % plot interpolate data as a line
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1 -0.5 0 0.5 1 -6 -4 -2 0 2 4 6 gnuplot_plot_1a gnuplot_plot_2a
In [4]:
yi1 = interp1(x, y, xi, 'nearest');
yi2 = interp1(x, y, xi, 'linear');
yi3 = interp1(x, y, xi, 'spline');

figure();
plot(x, y, 'LineStyle', 'None', 'Marker', 'x', 'DisplayName', 'Orignal', 'MarkerEdgeColor', 'green');
hold on;
plot(xi, yi1, 'DisplayName', 'nearest', 'Color', 'red');
plot(xi, yi2, 'DisplayName', 'linear', 'Color', 'black');
plot(xi, yi3, 'DisplayName', 'spline', 'Color', 'magenta');

legend('show');
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1 -0.5 0 0.5 1 -6 -4 -2 0 2 4 6 Orignal Orignal nearest nearest linear linear spline spline

For 2D just use $\texttt{interp2}$

In [5]:
x = linspace(-6, 6, 5);
y = linspace(-6, 6, 5);
[X, Y] = meshgrid(x, y);

V = X.^2 - Y.^2;

figure();
surf(X, Y, V);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a gnuplot_plot_7a gnuplot_plot_8a gnuplot_plot_9a gnuplot_plot_10a gnuplot_plot_11a gnuplot_plot_12a -6 -4 -2 0 2 4 6 -6 -4 -2 0 2 4 6 -40 -30 -20 -10 0 10 20 30 40
In [6]:
% interpolate linear, more points, but same rough edges
xi = linspace(-6, 6, 50);
yi = linspace(-6, 6, 50);
[Xi, Yi] = meshgrid(xi, yi);

Vi = interp2(X, Y, V, Xi, Yi);

figure();
surf(Xi, Yi, Vi);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a gnuplot_plot_7a gnuplot_plot_8a gnuplot_plot_9a gnuplot_plot_10a gnuplot_plot_11a gnuplot_plot_12a gnuplot_plot_13a gnuplot_plot_14a gnuplot_plot_15a gnuplot_plot_16a gnuplot_plot_17a gnuplot_plot_18a gnuplot_plot_19a gnuplot_plot_20a gnuplot_plot_21a gnuplot_plot_22a gnuplot_plot_23a gnuplot_plot_24a gnuplot_plot_25a gnuplot_plot_26a gnuplot_plot_27a gnuplot_plot_28a gnuplot_plot_29a gnuplot_plot_30a gnuplot_plot_31a gnuplot_plot_32a gnuplot_plot_33a gnuplot_plot_34a gnuplot_plot_35a gnuplot_plot_36a gnuplot_plot_37a gnuplot_plot_38a gnuplot_plot_39a gnuplot_plot_40a gnuplot_plot_41a gnuplot_plot_42a gnuplot_plot_43a gnuplot_plot_44a gnuplot_plot_45a gnuplot_plot_46a gnuplot_plot_47a gnuplot_plot_48a gnuplot_plot_49a gnuplot_plot_50a gnuplot_plot_51a gnuplot_plot_52a gnuplot_plot_53a gnuplot_plot_54a gnuplot_plot_55a gnuplot_plot_56a gnuplot_plot_57a gnuplot_plot_58a gnuplot_plot_59a gnuplot_plot_60a gnuplot_plot_61a gnuplot_plot_62a gnuplot_plot_63a gnuplot_plot_64a gnuplot_plot_65a gnuplot_plot_66a gnuplot_plot_67a gnuplot_plot_68a gnuplot_plot_69a gnuplot_plot_70a gnuplot_plot_71a gnuplot_plot_72a gnuplot_plot_73a gnuplot_plot_74a gnuplot_plot_75a gnuplot_plot_76a gnuplot_plot_77a gnuplot_plot_78a gnuplot_plot_79a gnuplot_plot_80a gnuplot_plot_81a gnuplot_plot_82a gnuplot_plot_83a gnuplot_plot_84a gnuplot_plot_85a gnuplot_plot_86a gnuplot_plot_87a gnuplot_plot_88a gnuplot_plot_89a gnuplot_plot_90a gnuplot_plot_91a gnuplot_plot_92a gnuplot_plot_93a gnuplot_plot_94a gnuplot_plot_95a gnuplot_plot_96a gnuplot_plot_97a gnuplot_plot_98a gnuplot_plot_99a gnuplot_plot_100a gnuplot_plot_101a gnuplot_plot_102a -6 -4 -2 0 2 4 6 -6 -4 -2 0 2 4 6 -40 -30 -20 -10 0 10 20 30 40
In [7]:
% spline interpolation, good for nice visuals, but not really that mathematically good
xi = linspace(-6, 6, 50);
yi = linspace(-6, 6, 50);
[Xi, Yi] = meshgrid(xi, yi);

Vi = interp2(X, Y, V, Xi, Yi, 'spline');

figure();
surf(Xi, Yi, Vi);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a gnuplot_plot_7a gnuplot_plot_8a gnuplot_plot_9a gnuplot_plot_10a gnuplot_plot_11a gnuplot_plot_12a gnuplot_plot_13a gnuplot_plot_14a gnuplot_plot_15a gnuplot_plot_16a gnuplot_plot_17a gnuplot_plot_18a gnuplot_plot_19a gnuplot_plot_20a gnuplot_plot_21a gnuplot_plot_22a gnuplot_plot_23a gnuplot_plot_24a gnuplot_plot_25a gnuplot_plot_26a gnuplot_plot_27a gnuplot_plot_28a gnuplot_plot_29a gnuplot_plot_30a gnuplot_plot_31a gnuplot_plot_32a gnuplot_plot_33a gnuplot_plot_34a gnuplot_plot_35a gnuplot_plot_36a gnuplot_plot_37a gnuplot_plot_38a gnuplot_plot_39a gnuplot_plot_40a gnuplot_plot_41a gnuplot_plot_42a gnuplot_plot_43a gnuplot_plot_44a gnuplot_plot_45a gnuplot_plot_46a gnuplot_plot_47a gnuplot_plot_48a gnuplot_plot_49a gnuplot_plot_50a gnuplot_plot_51a gnuplot_plot_52a gnuplot_plot_53a gnuplot_plot_54a gnuplot_plot_55a gnuplot_plot_56a gnuplot_plot_57a gnuplot_plot_58a gnuplot_plot_59a gnuplot_plot_60a gnuplot_plot_61a gnuplot_plot_62a gnuplot_plot_63a gnuplot_plot_64a gnuplot_plot_65a gnuplot_plot_66a gnuplot_plot_67a gnuplot_plot_68a gnuplot_plot_69a gnuplot_plot_70a gnuplot_plot_71a gnuplot_plot_72a gnuplot_plot_73a gnuplot_plot_74a gnuplot_plot_75a gnuplot_plot_76a gnuplot_plot_77a gnuplot_plot_78a gnuplot_plot_79a gnuplot_plot_80a gnuplot_plot_81a gnuplot_plot_82a gnuplot_plot_83a gnuplot_plot_84a gnuplot_plot_85a gnuplot_plot_86a gnuplot_plot_87a gnuplot_plot_88a gnuplot_plot_89a gnuplot_plot_90a gnuplot_plot_91a gnuplot_plot_92a gnuplot_plot_93a gnuplot_plot_94a gnuplot_plot_95a gnuplot_plot_96a gnuplot_plot_97a gnuplot_plot_98a gnuplot_plot_99a gnuplot_plot_100a gnuplot_plot_101a gnuplot_plot_102a -6 -4 -2 0 2 4 6 -6 -4 -2 0 2 4 6 -40 -30 -20 -10 0 10 20 30 40

Filtering (Basics)

In Octave, you must have the signal package, which requires the control package

In [8]:
% use these commented commands to install the packages
%pkg install -forge control;
%pkg install -forge signal;
pkg load signal;
In [9]:
x = linspace(0, 10, 1000);
y = sin(x) + rand(1, length(x));

figure();
plot(x, y);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1 -0.5 0 0.5 1 1.5 2 0 2 4 6 8 10 gnuplot_plot_1a
In [10]:
% a basic averaging filter, average of 20 points
N = 20;
a = 1;
b = 1 / N * ones(1, N);

yf = filtfilt(b, a, y);

% still some noise, but curve follows data closely
figure();
plot(x, y);
hold on;
plot(x, yf, 'LineWidth', 7);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1 -0.5 0 0.5 1 1.5 2 0 2 4 6 8 10 gnuplot_plot_1a gnuplot_plot_2a
In [11]:
% basic averaging filter, window size of 300
N = 300;
a = 1;
b = 1 / N * ones(1, N);

yf = filtfilt(b, a, y);

% very smooth, but not really right, doesn't track the function well
figure();
plot(x, y);
hold on;
plot(x, yf, 'LineWidth', 7);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1 -0.5 0 0.5 1 1.5 2 0 2 4 6 8 10 gnuplot_plot_1a gnuplot_plot_2a

Polynomial Fitting

Use $\texttt{polyfit(<x>, <y>, <order>)}$ to fit a polynomial to data

In [12]:
x = linspace(-6, 6, 1000);
y = sin(x) + 0.2 * 2 * (rand(1, length(x)) - 0.5);

figure();
plot(x, y);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1.5 -1 -0.5 0 0.5 1 1.5 -6 -4 -2 0 2 4 6 gnuplot_plot_1a

$f(x) = a_7 x^7 + a_6 x^6 + a_5 x^5 + a_4 x^4 + a_3 x^3 + a_2 x^2 + a_1 x + a_0$

In [13]:
% coefficients of a polynomial
p = polyfit(x, y, 7)
% [a7, a6, a5, a4, a3, a2, a1, a0]
p =

 Columns 1 through 5:

  -0.0000642611  -0.0000099375   0.0055059224   0.0004430095  -0.1431470207

 Columns 6 through 8:

  -0.0044945891   0.9491950579   0.0121471799

Use $\texttt{polyval}$ to evaluatet a polynomial at $x$

In [14]:
figure();
plot(x, y);
hold on;
yp = polyval(p, x);
plot(x, yp, 'LineWidth', 7);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1.5 -1 -0.5 0 0.5 1 1.5 -6 -4 -2 0 2 4 6 gnuplot_plot_1a gnuplot_plot_2a

Be very careful with the domain (range of x's) you're fitting on

Fitted polynomials misbehave outside of the fitted domain

In [15]:
x_till_60p = x(1:floor(0.6 * length(x)));
y_till_60p = y(1:floor(0.6 * length(x)));
p = polyfit(x_till_60p, y_till_60p, 7);

figure();
plot(x, y);
hold on;
plot(x, polyval(p, x), 'LineWidth', 7);
xlim([-6, 6]);
ylim([-5, 5]);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -4 -2 0 2 4 -6 -4 -2 0 2 4 6 gnuplot_plot_1a gnuplot_plot_2a