Scatteredinterpolant (linear) from symmetric data does not produce symmetric isolines
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I utilised the scatteredinterpolant function to generate an interpolation from which I derived isolines. My data are situated on a non-equispaced grid of points that are symmetric with respect to the midline. In fact, I only have data on one side, so I placed data on the other side by copying the values from the original data set, exploiting the symmetry.
When I generate iso-lines using the NATURAL method, the isolines have a symmetric trend. If I use the simplest method, i.e. LINEAR, the iso-lines are not symmetric, which does not make sense.
Do you know what may cause this issue and how to sort it out?
0 commentaires
Réponses (1)
Bruno Luong
le 17 Juil 2024
scatteredinterpolant all methods is based on triangulation of the data points. Even the data points are symmetric, the triangulation migh not.
10 commentaires
Bruno Luong
le 26 Juil 2024
x_PP_sym=x_PP;
y_PP_sym=-y_PP;
PP_i_sym=PP_i;
% Adding other points symmetrically with respect to y=0
x_PP_sym=x_PP;
y_PP_sym=-y_PP;
PP_i_sym=PP_i;
You create twice the variable and do not use it anywhere later. Clearly Your code is NOT correct.
Bruno Luong
le 26 Juil 2024
Modifié(e) : Bruno Luong
le 26 Juil 2024
This demo shows how to enforce the interpolation output to be symmetric, as it is an a priori expectation characteristic, whatever the input might be and or breaking symmetric due to scattering interpolation algorithm.
[x_PP,y_PP,PP_i] = peaks(20);
x_PP=x_PP(:);
y_PP=y_PP(:);
P_v=PP_i(:);
% ---------------
% Scattered Interpolant
% ---------------
% Grid
x0=min(x_PP);
x1=max(x_PP);
y0=min(y_PP);
y1=-y0; %max(y_PP); % Change by Bruno
N=50;
xll=linspace(x0,x1,N) ;
yll=linspace(y0,y1,N) ;
[X,Y] = meshgrid(xll,yll) ;
P=[x_PP,y_PP];
V=PP_i;
F = scatteredInterpolant(x_PP,y_PP,P_v);
F.Method ='linear';
F.ExtrapolationMethod ='none';
Z=F(X,Y);
Z=(Z+flip(Z,1))/2; % Add by Bruno, symmetrize the Z with to Y
% Contour plot
clevels=linspace(-4,4,10)
[ch0,ch]=contour(X,Y,Z,10);
ch.LineWidth = 2;
axis equal
xlabel('x (mm)')
ylabel('y (mm)');
colormap(jet)
Cbar=colorbar;
Cbar.Label.String = 'Pressure (kPa)';
caxis([clevels(1) clevels(end)])
yline(0)
Voir également
Catégories
En savoir plus sur Interpolation dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!