可能重叠的曲线之间的插值

Interpolation between curves that may overlap

我尝试使用 matlab(和 interp1 函数)在一些已经存在的曲线的间隙中插入曲线。

编辑开始 1

我已经有了 5 条扭矩随 rpm 曲线的数据,这些数据是我通过对每条曲线的多次模拟获得的。由于模拟时间很宝贵,我想通过在现有曲线之间插入 "fill the gap" 曲线来节省时间。

我希望形成以下内容:

下面是我的进一步想法。

编辑 1 结束

我尝试按照线程 Interpolation between two curves (matlab) 中问题的步骤进行操作,但它似乎不适用于我的代码。我不确定该代码是否实际适用,因为曲线 可能 重叠...

我尝试编辑上面 link 中的代码,如下所示:


% 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);


None 的插值技术有效,y 值要么是 90% 负值(使用 link 中的代码)要么太高(10e8 对 x 进行插值) .

我期望的是它创建的曲线比曲线 "to its left" 稍微缓和一点,比曲线 "to its right".

陡一点

我的进一步想法:

现有曲线是大型三维数组的产物。 IE。可能更多的方法是对数组进行插值,然后 然后 "read out" 转矩随转速变化曲线。另一方面,我看不到在两个 1001×7001×5 数组之间进行插值的方法... 此外,对于程序的后续步骤,曲线插值需要非常精细(两条现有曲线之间必须有超过 1 条插值曲线),这使得问题更加困难。

如果我没理解错的话,剧情是这样生成的:

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

如果是这样,您可以用

绘制一条中间曲线
plot((xOriginal(:,1) + xOriginal(:,2))/2, (yOriginal(:,1) + yOriginal(:,2))/2)

即每对坐标之间的平均值形成一条恰好在两条原始曲线之间half-way的曲线。

使用加权平均值生成更多此类曲线。这是线性插值。

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

设置d = 0.5我们回到上面的half-way案例。


示例:

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)

(内插线为橙色)