Search code examples
matlabextrapolation

Matlab interp2 extrapolation


I am doing a 2-D interpolation using interp2. For some data values, the interp2 command returns NaN because one of the dimensions are outside of the range defined by the vector of known values.

Its possible to extrapolate with the interp1 command. However, Is there a way to do this for interp2?

Thanks

Here is the code in which I am using the interp2 command:

function [Cla] = AirfoilLiftCurveSlope(obj,AFdata,Rc,M)

% Input:
% AFdata: Airfoil coordinates.
% Rc: Local Reynolds number.
% M: Mach number for Prandtle Glauert compressibility correction.

% Output: 
% Cla: 2 dimensional lift curve slopea applicable to linear region of lift polar.

load('ESDU84026a.mat');

xi = size(AFdata);

if mod(xi(1,1),2) == 0
    %number is even
    AFupper = flipud(AFdata(1:(xi(1,1)/2),:));
    AFlower = AFdata(((xi(1,1)/2)+1):end,:);
else
    %number is odd
    AFupper = flipud(AFdata(1:floor((xi(1,1)/2)),:));
    AFlower = AFdata((floor(xi(1,1)/2)+1):end,:);
end


t_c = Airfoil.calculateThickness(AFdata(:,2));

Y90 = ((interp1(AFupper(:,1),AFupper(:,2),0.9,'linear')) - (interp1(AFlower(:,1),AFlower(:,2),0.9,'linear')))*100;

Y99 = ((interp1(AFupper(:,1),AFupper(:,2),0.99,'linear')) - (interp1(AFlower(:,1),AFlower(:,2),0.99,'linear')))*100;

Phi_TE = (2 * atan( ( (Y90/2) - (Y99/2) )/9))*180/pi;                       % Degrees
Tan_Phi_Te = ( (Y90/2) - (Y99/2) )/9;

Cla_corr = interp2(Tan_Phi,Rc_cla,cla_ratio,Tan_Phi_Te,Rc,'linear');

beta =sqrt((1-M^2));                                                        % Prandtle Glauert correction
Cla_theory = 2*pi + 4.7*t_c*(1+0.00375 * Phi_TE);                           % per rad 
Cla = (1.05/beta) * Cla_corr * Cla_theory;                                  % per rad

if isnan(Cla) == 1 %|| Cla > 2*pi
    Cla = 2*pi;
end

end

Solution

  • Hey please find my code for interp2 it just take max bound values;

    function vq = Linear2dInterpWithClipExtrap(x,y,v,xq,yq);
    
        vq = interp2(x,y,v,xq,yq);
    
        [XMax, idxVMax] = max(x);
        [XMin, idxVMin] = min(x);
    
        idxMax = xq > XMax;
        idxMin = xq < XMin;
       if ~isempty(yq(idxMax));
        vq(idxMax) = LinearInterpWithClipExtrap(y,v(:,idxVMax),yq(idxMax));
       end
       if ~ isempty(yq(idxMin))
        vq(idxMin) = LinearInterpWithClipExtrap(y,v(:,idxVMin),yq(idxMin));
       end
    
       [YMax, idyVMax] = max(y);
        [YMin, idyVMin] = min(y);
    
        idyMax = yq > YMax;
        idyMin = yq < YMin;
       if ~isempty(xq(idyMax));
        vq(idyMax) = LinearInterpWithClipExtrap(x,v(idyVMax,:),xq(idyMax));
       end
       if ~ isempty(xq(idyMin));
        vq(idyMin) = LinearInterpWithClipExtrap(x,v(idyVMin,:),xq(idyMin));
       end
    
    
    
    function vq = LinearInterpWithClipExtrap(x,v,xq);
    
        vq = interp1(x,v,xq);
    
        [XMax, idxVMax] = max(x);
        [XMin, idxVMin] = min(x);
    
        idxMax = xq > XMax;
        idxMin = xq < XMin;
    
        vq(idxMax) = v(idxVMax);
        vq(idxMin) = v(idxVMin
    

    );