Scatteredinterpolant (linear) from symmetric data does not produce symmetric isolines
이전 댓글 표시
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?
답변 (1개)
Bruno Luong
2024년 7월 17일
0 개 추천
scatteredinterpolant all methods is based on triangulation of the data points. Even the data points are symmetric, the triangulation migh not.
댓글 수: 10
ES_Thorny
2024년 7월 18일
John D'Errico
2024년 7월 18일
No. You cannot enforce a symmetric triangulation in scatteredInterpolant. That would require you to be able to supply the triangulation itself to scatteredInterpolant, and this is not an option.
Could you create a triangulation that has the property of symmetry that you desire, and using other interpolation tools perform the interpolation? The answer is, well, yes, in theory. It would require some serious effort on your part, and it would force you to learn a lot about triangulation methods. Is it worth the effort? That is, just to make a subtly different picture that you prefer, when as you found, other methods were better able to handle your problem?
Bruno Luong
2024년 7월 18일
편집: Bruno Luong
2024년 7월 18일
The easiest workaround is to symmetrize the interpolation result if you query points are symmetric
ES_Thorny
2024년 7월 19일
Walter Roberson
2024년 7월 19일
Map the query location...
QX = X;
mask = QX > MidPoint;
QX(mask) = 2 * MidPoint - QX(mask);
Bruno Luong
2024년 7월 19일
편집: Bruno Luong
2024년 7월 19일
@ES_Thorny post your code (that can run) if you want to get any specific help. The output is scattered is the z coordinates of the query points (xq,yq) assumed you want to interpolated 2D function. It's described in the doc page. If you have specific question just ask.
ES_Thorny
2024년 7월 24일
Bruno Luong
2024년 7월 26일
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.
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)
카테고리
도움말 센터 및 File Exchange에서 Interpolation에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
