2D преобразование таблицы, например: y = f (x1, x2) => x1 = f (y, x2) - PullRequest
1 голос
/ 08 мая 2019

Проблема, которую мне нужно решить, - преобразовать 2D-справочную таблицу.

enter image description here

Эта таблица может быть определена как массив

Table = [ -54 97 ... 362;
          -60 114 ... 425;
          ...
          -111 31 ... 277;]

x1 = [0 20 ... 100]
x2 = [800 1200 ... 4800].

Таким образом, с учетом любого x1, x2 в рамках соглашения y = f(x1,x2), определенного в приведенной выше таблице, может дать значение y.

Теперь мне нужно получить x1 с учетом y и x2. То есть, учитывая данные об / мин и y, определите подходящее x1. например, 800 об / мин и 97, дают значение 20%. Если это 800 и 107, возвращает 28,3%.

Можно использовать Matlab или Python.

Ответы [ 3 ]

3 голосов
/ 08 мая 2019

В Matlab:

Мой другой ответ предполагал наиболее общий случай, когда значение для RPM может быть любым в диапазоне от 800 до 4800. Однако, если вы уверены, что выбранное вами значение будет одной из строк, вам нужно только рассмотреть значения в этой строке:

Percent = [0 20 30 40 ... 90 100];
RPM = [800; 1200; 1400; ... 4400; 4800];
Table = [ -54 97 ... 362;
          -60 114 ... 425;
          ...
          -111 31 ... 277;]
x2 = 800;
y = 107;

RPM_id = find(RPM == x2,1);
Table_row = Table(RPM_id,:);
x1 = interp1(Table_row,Percent,y)

Что снова приводит к

x1 =
   28.3333
2 голосов
/ 09 мая 2019

Чтобы избежать многократного построения интерполяции, я предлагаю использовать 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
1 голос
/ 08 мая 2019

В Matlab:

В общем случае значение x2 не является элементом вектора об / мин.Если это так, вы можете преобразовать приведенную ниже 2D-интерполяцию в 1D-интерполяцию.Но в общем случае вы можете угадать x1, интерполировать (x1, x2) в свою таблицу и посмотреть, равно ли полученное значение вашему значению y.

Percent = [0 20 30 40 ... 90 100];
RPM = [800; 1200; 1400; ... 4400; 4800];
Table = [ -54 97 ... 362;
          -60 114 ... 425;
          ...
          -111 31 ... 277;]


x2 = 800;
y = 107;

% we square the difference since we want the error to be > 0
F = @(s) (interp2(Percent, RPM, Table,s,x2) - y).^2; 

x1 = fminbnd(@(x) F(x),0,100) 

Что приводит к

x1 =
   28.3333

Редактировать. Предыдущая версия этого решения основывалась на равномерно распределенных значениях процентов.Для 10% столбца нет, поэтому ответ для примера был неверным.Решение было обновлено, чтобы отразить правильные проценты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...