Интерполяция между кривыми, которые могут перекрываться - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь интерполировать кривые в промежутках некоторых уже существующих кривых, используя matlab (и функцию interp1).

Начало редактирования 1

У меня уже есть данные 5 кривых крутящего момента на оборотах в минуту, которые я получил с помощью ряда симуляций для каждой кривой.Так как время моделирования драгоценно, я хотел бы сэкономить время с помощью интерполяции кривых, которые «заполняют разрыв» между уже существующими.

img

Я ищу формуследующее:

img

Дальнейшие мысли обо мне ниже.

Конец редактирования 1

Я пыталсявыполните шаги из вопроса в теме Интерполяция между двумя кривыми (matlab) , но, похоже, он не работает с моим кодом.Я не уверен, что код действительно применим, поскольку кривые могут перекрываться ...

Я попытался отредактировать код по ссылке выше, как показано ниже:


% Save the data in one array each. The original data is stored in the
% arrays "x/yOriginal" row-wise.
curve1_data = [xOriginal(:,1) yOriginal(:,1)];
curve2_data = [xOriginal(:,2) yOriginal(:,2)];

% This was to try if the code from the link works
yy = [0:1:60];

xx1 = interp1(curve1_data(:,2),curve1_data(:,1),yy,'spline');
xx2 = interp1(curve2_data(:,2),curve2_data(:,1),yy,'spline');
m = 3; % Curve_Offset
mm(:,m) = xx1 + (xx2-xx1)*(m/(8750-5000));

% With the following I tried to interpolate over x
xx = (xOriginal(1,1):1:xOriginal(1,2));

yy1 = interp1(curve1_data(:,1),curve1_data(:,2),xx,'spline');
yy2 = interp1(curve2_data(:,1),curve2_data(:,2),xx,'spline');


m = 3; % Curve_Offset
% From the original code:
mm(:,m) = xx1 + (xx2-xx1)*(m/(8750-5000));

% Interpolation over x
yINT = yy1 + (yy2-yy1)*(m/8750-5000);


Ни один из методов интерполяции не работал, значения y либо на 90% отрицательны (с кодом из ссылки), либо слишком высоки (10e8 с интерполяцией по x).

То, что я ожидалбыло то, что он создает кривую, немного менее крутую, чем кривая «налево», и немного круче кривой «направо».

Мои дальнейшие мысли:

Существующие кривые являются произведением больших трехмерных массивов.То есть, возможно, это более удобный способ интерполировать массивы и , а затем «считывать» кривые Torque-over-rpm-Curves.С другой стороны, я не вижу способа интерполировать между двумя массивами 1001 на 7001 на 5 ... Более того, для следующих шагов с программой, интерполяция кривой должна быть достаточно хорошей (этонеобходимо иметь более чем одну интерполированную кривую между двумя существующими кривыми), что еще более усложняет задачу.

1 Ответ

0 голосов
/ 06 июня 2019

Если я правильно понимаю, сюжет генерируется примерно так:

plot(xOriginal(:,1),yOriginal(:,1))
plot(xOriginal(:,2),yOriginal(:,2))
% ...

Если это так, вы можете построить промежуточную кривую с помощью

plot((xOriginal(:,1) + xOriginal(:,2))/2, (yOriginal(:,1) + yOriginal(:,2))/2)

То есть среднее значение между каждой парой координат образует кривую, которая находится точно посередине между двумя исходными кривыми.

Используйте средневзвешенные значения, чтобы получить больше этих кривых. Это линейная интерполяция.

d = 0.2;
plot(d*xOriginal(:,1) + (1-d)*xOriginal(:,2), d*yOriginal(:,1) + (1-d)*yOriginal(:,2))

Устанавливая d = 0.5, мы возвращаемся к описанному выше полпути.


Пример:

xOriginal(:,1) = linspace(0.2,0.5,100);
yOriginal(:,1) = 3 * cos(xOriginal(:,1)*10-2.5) + 3;

xOriginal(:,2) = linspace(0.6,0.8,100);
yOriginal(:,2) = cos(xOriginal(:,2)*20-13.5) + 1;

clf; hold on
plot(xOriginal(:,1),yOriginal(:,1))
plot(xOriginal(:,2),yOriginal(:,2))

plot((xOriginal(:,1)+xOriginal(:,2))/2,(yOriginal(:,1)+yOriginal(:,2))/2)

resulting plot

(интерполированная линия оранжевого цвета)

...