Чтобы избежать многократного построения интерполяции, я предлагаю использовать griddedInterpolant
, чтобы все интерполяции строились один раз, а затем вы можете запрашивать ad libitum.
Обратите внимание, что вам следует подумать оинтерполяция, это то, какую числовую схему вы хотите использовать для вычисления значений, которые не принадлежат исходной таблице (например, (800; 107) в OP).Базовая (и по умолчанию) схема - линейная интерполяция;с вашей таблицей (не равномерной) схемы интерполяции более высокого порядка могут быть среди «макима» и «сплайн».См. Документацию для получения дополнительной информации обо всем этом.
Код для построения интерполяции выглядит следующим образом, при условии, что вся таблица хранится в переменной T
:
rpm = [800 1200 1400 1600:400:4800];
N = [0 20:10:100];
[g_rpm, g_N] = meshgrid(rpm, N);
G = griddedInterpolant(rpm, N ,T);
Добавитьчетвертый параметр для указания схемы интерполяции (например, 'makima'
).
Затем, чтобы найти нужное значение, вы можете построить свою собственную функцию следующим образом:
F = @(r, t) fminsearch(@(x) abs(t-G(r,x)), 50);
50 априоризначение startint;Вы должны уточнить его в случае, если T
не является монтоническим.
На входах в OP:
F(800, 97)
дает 20
F(800, 107)
дает 28,333 (слинейная интерполяция, 28,224 с интерполяцией макимы и 26,898 с сплайн-интерполяциейфункции F
с arrayfun
:
F = @(R,T) arrayfun(@(r,t) fminsearch(@(x) abs(t-G(r,x)), 25), R, T);
Так что теперь вы можете поместить несколько пар входов одновременно, как это:
F([800 2000],[100 100])
ans =
21.966 15.564