首页 > 解决方案 > 可能重叠的曲线之间的插值

问题描述

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

编辑开始 1

我已经有了 5 Torque over rpm 曲线的数据,我通过对每条曲线的多次模拟获得了这些数据。由于模拟时间很宝贵,我想通过插值曲线来节省时间,这些曲线“填补了现有曲线之间的空白”。

图像

我正在寻找形成以下内容:

图像

下面对我的进一步想法。

编辑结束 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)。

我所期望的是,它创建的曲线比“左侧”的曲线更陡峭,但比“右侧”的曲线更陡峭。

我进一步的想法:

现有曲线是大 3 维数组的产物。即,它可能是对数组进行插值然后“读出”扭矩在 rpm 曲线上的更多方法。另一方面,我看不到在两个 1001×7001×5 数组之间进行插值的方法......此外,对于程序的下一步,曲线插值需要非常好(它有必要在两条现有曲线之间有超过 1 条插值曲线),这使问题变得更加困难。

标签: matlabinterpolationcurve

解决方案


如果我理解正确,情节是这样生成的:

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)

结果图

(内插线为橙色)


推荐阅读