# Use of interp2 in an arbitrary dataset

4 views (last 30 days)
Stathis Tingas on 27 Jan 2024
Edited: Stathis Tingas on 28 Jan 2024
Hello,
I would appreciate any help on the following issue.
I have a small dataset (3x3 matrix) which descirbes a mechanical property (say Z) in 2d space. Each line describes the mechanical property in the 2d space, hence I basically have 3 values of Z in the 2d space. Column 1 has the x-coordinate, column 2 has the y-coordinate and column 3 the respective value for Z.
For the sake of an example, my data looks like this:
X Y Z
0.25 0.25 0.5
0.50 0.60 1.5
0.75 0.35 3.0
I want to interpolate (between the given values) and extrapolate (from 0 up to 1 for both X and Y), ideally using spline, cubic or makima.
My plan was to use the following code:
x=[0.25;0.50;0.75];
y=[0.25;0.60;0.35];
[X,Y] = meshgrid(x,y);
Z = [0.5; 1.5; 3.0];
[Xq,Yq] = meshgrid(0:.01:1, 0:.01:1);
Zq = interp2(X,Y,Z,Xq,Yq,'spline');
However, when I try that, I get the following error:
Error using griddedInterpolant
Interpolation requires at least two sample points for each grid dimension.
Error in interp2>makegriddedinterp (line 226)
F = griddedInterpolant(varargin{:});
Error in interp2 (line 134)
F = makegriddedinterp(X, Y, V, method,extrap);
Thanks

Walter Roberson on 27 Jan 2024
x=[0.25;0.50;0.75];
y=[0.25;0.60;0.35];
Z = [0.5; 1.5; 3.0];
[Xq,Yq] = meshgrid(0:.01:1, 0:.01:1);
F = scatteredInterpolant(x, y, Z);
Zq = F(Xq, Yq);
surf(Xq, Yq, Zq)
Stathis Tingas on 27 Jan 2024
Edited: Stathis Tingas on 28 Jan 2024
Thank you @William Rose for your response. I wasnt actually aware of this requirement for spline and makima.
My dataset will generally be small but it will vary from 3 up to 11-12 points. You are saying that makima would need 4 points. Therefore, if the original dataset as an example has the following 4 points, how could I use makima or cubic?
x=[0.25;0.50;0.75;0.9];
y=[0.25;0.60;0.35; 0.7];
Z = [0.5; 1.5; 3.0; 3.5];
Thanks
Torsten on 27 Jan 2024
Edited: Torsten on 27 Jan 2024
If your data are not gridded, you will have to live with "ScatteredInterpolant" and its interpolation methods.
And your four points in 2d constitute a curve. So Z could be interpolated on this curve maybe, but it makes little sense to treat them as sufficient to interpolate on a real two-dimensional rectangle.
x=[0.25;0.50;0.75;0.9];
y=[0.25;0.60;0.35; 0.7];
Z = [0.5; 1.5; 3.0; 3.5];
plot3(x,y,Z)
grid on

Sulaymon Eshkabilov on 27 Jan 2024
Is this what you wanted to obtain:
% Given DATA:
Data = [ 0.25 0.25 0.5;
0.50 0.60 1.5;
0.75 0.75 3.0];
% Extract x, y, and z from Data
x = Data(:, 1);
y = Data(:, 2);
z = Data(:, 3);
[X,Y]=meshgrid(x,y);
Z = meshgrid(z);
% Interpolate using griddata
[Xq,Yq] = meshgrid(0:.01:1);
Zq = interp2(X,Y,Z,Xq,Yq,'spline');
% Plot the results
figure;
scatter3(x, y, z, 'ro', 'filled'); % Original data points in red
hold on;
surf(Xq, Yq, Zq, 'EdgeColor', 'none', 'FaceAlpha', 0.5); % Interpolated/extrapolated surface
xlabel('X');
ylabel('Y');
zlabel('Z(X,Y)');
title('Interpolation and Extrapolation of Mechanical Property');
Torsten on 27 Jan 2024
Edited: Torsten on 27 Jan 2024
You already interpolate (extrapolate) when you assume that (x,y,z) can be extended to (X,Y,Z) as existing database for interpolation with interp2.
Stathis Tingas on 27 Jan 2024
Edited: Stathis Tingas on 27 Jan 2024
Dear @Sulaymon Eshkabilov, thanks for your response which seems to work fine but you have made a mistake in your Data matrix and this seems to make a difference.
In particular, the 3rd element in the y vector should be 0.35 and not 0.75.
When I try to use 0.35 with your version of the code, I get:
Error using griddedInterpolant
Sample points must be sorted in ascending order.
Error in interp2>makegriddedinterp (line 226)
F = griddedInterpolant(varargin{:});
Error in interp2 (line 134)
F = makegriddedinterp(X, Y, V, method,extrap);
Is there a workaround for this error?