2016-01-28 8 views
0

Я делаю двухмерную интерполяцию с использованием interp2. Для некоторых значений данных команда interp2 возвращает NaN, потому что одно из измерений находится вне диапазона, определенного вектором известных значений.Matlab interp2 экстраполяция

Его можно экстраполировать с помощью команды interp1. Однако есть ли способ сделать это для interp2?

Благодаря

Вот код, в котором я использую interp2 команду:

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 

ответ

4

Да, есть два способа получить interp2 вернуть значимое значение вне границ в соответствии с the docs.

  1. Использовать метод интерполяции 'spline'. В отличие от варианта № 2 это фактически экстраполирует данные на основе граничных условий сплайна.
  2. Укажите конечный параметр extrapval. Эта константа будет возвращена вместо NaN для всех других методов интерполяции.

К сожалению, не существует способа указать что-то вроде «ближайшего соседа на сетке» или что-то в этом роде. Если элементы out-of bounds близки к ребрам, возможно, вы можете просто расширить входной массив. Например, например:

x = [x(1, 1), x(1, :), x(1, end); ... 
    x(:, 1), x, x(:, end); ... 
    x(end, 1), x(end, :), x(end, end)] 
+0

Не могли бы вы рассказать о своем первом пункте? Кажется, я не понимаю, что вы пытаетесь сказать. Спасибо –

+0

@BalrajBoyal. Не уверен, что не ясно, но я думаю, что новая формулировка прояснит ситуацию. –